2010-12-02 26 views
1

它可能會響應誰,oracle函數返回日期列表作爲對象

我想返回日期和工作日列表以用於其他功能。下面的代碼編譯沒有錯誤。但它應該給出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; 
/
+0

如果你想從PL/SQL輸出,你需要設置SERVEROUTPUT:`設置SERVEROUTPUT on`。 – FrustratedWithFormsDesigner 2010-12-02 14:47:45

+0

我與蟾蜍9.6.0.27 – 2010-12-02 14:51:41

回答

4

幾點。

  1. 如果你想要一個DATE(V_CALCULATED_DATE)是X天從設置到午夜的時間成分,這似乎是在這裏你的意圖SYSDATE,你會希望像v_calculated_date := TRUNC(sysdate) + x;。沒有明確的格式掩碼一個TO_DATE將創建問題,如果未來的會話的NLS_DATE_FORMAT碰巧不被DD.MM.YYYY
  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.