oracle函数返回日期列表作为对象

时间:2010-12-02 14:40:45

标签: oracle function object plsql types

可能会回应谁,

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

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

脚本如下:

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;
/

1 个答案:

答案 0 :(得分:4)

几点。

  1. 如果你想要一个DATE(V_CALCULATED_DATE)是从SYSDATE开始的X天,时间组件设置为午夜,这似乎是你的意图,你会想要v_calculated_date := TRUNC(sysdate) + x;之类的东西。如果未来会话的NLS_DATE_FORMAT不是DD.MM.YYYY
  2. ,那么没有显式格式掩码的TO_DATE将会产生问题
  3. 如果你真的想要返回这样的集合,你的集合索引需要从1开始,而不是-2。您可以通过执行v_date_table(x+3) := DATE_ROW(v_calculated_date, 'Test');
  4. 来实现这一目标
  5. 但是,我倾向于怀疑在这里使用流水线表函数会更好。
  6. 流水线表函数看起来像

    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.