2010-12-02 29 views
1

A qui il peut répondre,fonction oracle pour revenir liste des dates comme objet

Je suis en train de retourner la liste des dates et jours de la semaine à utiliser dans d'autres fonctions. Le code ci-dessous est compilé sans erreur. Mais il devrait donner une sortie de 15 jours (via la variable V_MAX_DAYS) et le numéro du jour de cette semaine.

J'ai essayé de mettre en œuvre comme ceci, mais je ne peux pas obtenir de sortie en utilisant DBMS_OUTPUT. Je veux le tester mais j'ai l'erreur ORA-06532 lors de l'exécution. Mon but est de retourner des valeurs à l'application asp.net comme nous l'avons fait en utilisant SYS_REFCURSOR. Comment puis-je y parvenir? Nous vous remercions de votre préoccupation,

Le script est comme ci-dessous:

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

Si vous voulez obtenir une sortie de PL/SQL, vous devez définir SERVEROUTPUT: 'set SERVEROUTPUT on'. – FrustratedWithFormsDesigner

+0

Je vais avec TOAD 9.6.0.27 –

+0

FWFD, des recommandations pour le cas de test? Jusqu'à présent, je comprends que vous me proposez de le tester en utilisant la console SQLPlus. BTW, je suppose que je devrais essayer avec des fonctions de table pipelined depuis 20 lignes n'est pas beaucoup. Mais il va être appelé pour chaque utilisateur connecté au site Web. –

Répondre

4

Quelques points.

  1. Si vous voulez une date (V_CALCULATED_DATE) qui est X jours SYSDATE avec le composant de temps fixée à minuit, ce qui semble être votre intention ici, vous voulez quelque chose comme v_calculated_date := TRUNC(sysdate) + x;. Un TO_DATE sans masque de format explicite va créer des problèmes si NLS_DATE_FORMAT d'une session future ne se produit pas. DD.MM.YYYY
  2. Si vous voulez vraiment retourner une collection comme celle-ci, vos index de collection devraient commencer par 1, pas -2. Vous pouvez accomplir cela en faisant v_date_table(x+3) := DATE_ROW(v_calculated_date, 'Test');.
  3. Cependant, j'aurais tendance à penser que vous seriez mieux servi ici avec une fonction de table pipelined.

La fonction de table ressemblerait à quelque chose pipe-line comme

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. 
+0

M. Cave, fonctionne comme un charme .. Merci pour votre préoccupation et votre temps, –