【问题标题】:oracle function to return list of dates as objectoracle函数将日期列表作为对象返回
【发布时间】:2011-05-19 04:20:39
【问题描述】:

它可能会回应谁,

我正在尝试返回要在其他功能中使用的日期和工作日列表。下面的代码编译没有错误。但它应该给出 15 天的输出(通过 V_MAX_DAYS 变量)和该周的天数。

我尝试过这样实现,但无法使用 DBMS_OUTPUT 获得输出。我想测试它,但运行时出现 ORA-06532 错误。 我的目标是像我们使用 SYS_REFCURSOR 一样将值返回给 asp.net 应用程序。 我怎样才能做到这一点? 感谢您的关心,

脚本如下:

CREATE OR REPLACE TYPE DATE_ROW AS OBJECT
(
  WEEKDAY_VALUE DATE,
  DATE_IN_LIST VARCHAR2(5)
)
/

CREATE OR REPLACE TYPE DATE_TABLE as table of DATE_ROW
/



CREATE OR REPLACE FUNCTION FN_LISTDATES
   RETURN DATE_TABLE
IS
   V_DATE_TABLE        DATE_TABLE    := DATE_TABLE ();
   V_MAX_DAYS          NUMBER        := 15;
   V_CALCULATED_DATE   DATE;
   V_WEEKDAY           VARCHAR2 (5);
BEGIN
   FOR X IN -2 .. V_MAX_DAYS
   LOOP
      SELECT TO_DATE (TO_CHAR (SYSDATE + X, 'DD.MM.YYYY'))
        INTO V_CALCULATED_DATE
        FROM DUAL;
      V_DATE_TABLE.EXTEND;
      V_DATE_TABLE(X) := DATE_ROW(V_CALCULATED_DATE, 'Test');
   END LOOP;
   RETURN V_DATE_TABLE;
END;
/

【问题讨论】:

  • 如果要从PL/SQL获取输出,需要设置serveroutput:set serveroutput on
  • 我将使用 TOAD 9.6.0.27
  • FWFD,对测试用例有什么建议吗?到目前为止,我了解到您提供我使用 SQLPlus 控制台对其进行测试。顺便说一句,我想我应该尝试使用流水线表函数,因为 20 行并不多。但它将为每个登录到该网站的用户调用。

标签: oracle function object plsql types


【解决方案1】:

几点。

  1. 如果您想要一个 DATE (V_CALCULATED_DATE),它距离 SYSDATE X 天,时间组件设置为午夜,这似乎是您的意图,您可能需要类似 v_calculated_date := TRUNC(sysdate) + x; 的内容。如果未来会话的 NLS_DATE_FORMAT 恰好不是 DD.MM.YYYY,则没有明确格式掩码的 TO_DATE 会产生问题
  2. 如果您真的想返回这样的集合,您的集合索引需要以 1 开头,而不是 -2。您可以通过 v_date_table(x+3) := DATE_ROW(v_calculated_date, 'Test'); 来实现。
  3. 但是,我倾向于怀疑在这里使用流水线表函数会更好。

流水线表函数看起来像

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE FUNCTION FN_LISTDATES
  2     RETURN DATE_TABLE
  3     PIPELINED
  4  IS
  5     V_MAX_DAYS          NUMBER        := 15;
  6     V_CALCULATED_DATE   DATE;
  7     V_WEEKDAY           VARCHAR2 (5);
  8  BEGIN
  9     FOR X IN -2 .. V_MAX_DAYS
 10     LOOP
 11        v_calculated_date := trunc(sysdate) + x;
 12        PIPE ROW( DATE_ROW(v_calculated_date,'Test') );
 13     END LOOP;
 14     RETURN;
 15* END;
SQL> /

Function created.

SQL> select * from table( fn_listDates );

WEEKDAY_V DATE_
--------- -----
30-NOV-10 Test
01-DEC-10 Test
02-DEC-10 Test
03-DEC-10 Test
04-DEC-10 Test
05-DEC-10 Test
06-DEC-10 Test
07-DEC-10 Test
08-DEC-10 Test
09-DEC-10 Test
10-DEC-10 Test

WEEKDAY_V DATE_
--------- -----
11-DEC-10 Test
12-DEC-10 Test
13-DEC-10 Test
14-DEC-10 Test
15-DEC-10 Test
16-DEC-10 Test
17-DEC-10 Test

18 rows selected.

【讨论】:

  • 先生。洞穴,就像一个魅力......感谢您的关注和时间,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2016-09-27
  • 2021-09-09
  • 2017-12-19
  • 2017-01-23
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多