【问题标题】:Calling procedure from oracle to crystal report从 oracle 到水晶报表的调用过程
【发布时间】:2013-01-24 00:01:36
【问题描述】:

我创建了一个 oracle 过程,它正在使用 oracle SQL 编辑器。
我想在水晶报表中使用该过程。
从数据库专家那里,我选择了程序,但出现错误消息:

===============================
查询引擎错误:'ADO 错误代码:0x
来源:OraOLEDB
说明:ORA-01850:小时必须在 0 到 23 之间
ORA-06512:在“NPLS.PROC_YEARLYACTIVELIST2”,第 19 行
ORA-06512:在第 1 行
本机错误:'
===============================

我这样声明变量:
===============================
str INT;
inv_date 日期;
===============================

这是程序,
===============================
创建或替换过程 PROC_YEARLYACTIVELIST2(in_year IN VARCHAR)
AS

ctr INT;
str INT;
curr_rowid VARCHAR2(50);
inv_date 日期;

开始

从 TBLACTIVELISTYEARLY2 中删除;
ctr := 1;
对于 1..12 中的 ctr
循环

如果 ctr = 1 那么
str := '01';
inv_date := to_date('31-01-' || in_year || '23:59:59', 'DD-MM-YYYY HH24:MI:SS');
结束如果;
结束;
/
===============================

我一直在努力解决这个问题,但仍然找不到解决方案。
我希望你能帮助我。

谢谢! :)

-Michelle(在职实习生)

【问题讨论】:

  • in_year 是如何定义的,它有什么价值?
  • (in_year IN VARCHAR) 并且值必须是年份

标签: sql oracle crystal-reports date-arithmetic


【解决方案1】:

一种可能是 in_year 没有被 Crystal 传入或作为 NULL 传入。

请确认。您可以添加此代码作为快速检查:

  if (trim(in_year) is null) or length(in_year != 4))
  then
    raise_application_error(-20000, 'year is invalid: '  || in_year);
  end if;
 inv_date := to_date('31-01-' || in_year || ' 23:59:59', 'DD-MM-YYYY HH24:MI:SS');

这会引发什么错误?

好像年份是空的,我们会得到那个错误:

SQL> declare
  2    inv_date DATE;
  3     in_year varchar2(42) ;
  4  begin
  5   inv_date := to_date('31-01-' || in_year || ' 23:59:59', 'DD-MM-YYYY HH24:MI:SS');
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-01850: hour must be between 0 and 23
ORA-06512: at line 5

【讨论】:

  • 感谢 DazzaL 先生的回复。但此时,我无法尝试您的建议,因为我的项目在办公室。我会这样做并尽快回复。 :)
  • 您说得对,先生!现在我已经将程序附加到我的水晶报告中。太感谢了! :)
【解决方案2】:

该功能有效且有效。格式掩码中的年份和小时之间有一个多余的破折号。 Oracle 应该能够忽略这一点,但也许 Crystal 不能:如果只是从查询中消除它,清理它肯定是值得的。

如果不是这样,那么唯一的可能就是in_year 的值。你能把它写到一个跟踪文件中看看它是什么吗?

或者,这里有一种更复杂但可能不太容易获得相同日期时间的方法:

last_day(trunc(to_date( in_year, 'YYYY') , 'YYYY') ) + (86399/86400)

                          ^  first day of current month
          ^ first day of current year
 ^ last day of month
                                                        ^ last second of the day  

【讨论】:

  • 创建或替换过程 PROC_YEARLYACTIVELIST2 (in_year IN VARCHAR) 作为 ctr INT;字符串整数; curr_rowid VARCHAR2(50); inv_date 日期;开始从 TBLACTIVELISTYEARLY2 中删除; ctr := 1; FOR ctr IN 1..12 LOOP IF ctr = 1 THEN str := '01';inv_date := to_date('31-01-' || in_year || '23:59:59', 'DD-MM-YYYY HH24:MI:SS');如果结束;
【解决方案3】:

检查您的数据库 nls 时间设置。我认为它与您的水晶报表设置不同。

如果您需要更改 nls 设置,请使用此查询-- alter session set nls_date_format ='你的日期格式在这里';

【讨论】:

  • 感谢您的回复@parik。我的时间设置是一样的。只是我在日期/年份中传递了一个空值。再次感谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 2022-01-14
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多