2015-10-27 1 views
0

J'essaie de tester une fonction, où je transmets un nom et une date de table en entrée et en obtenant un nombre comme valeur de retour. Je passe juste la date variable de liaison (ne peut pas passer nom_table)Oracle Fonction avec nom_table et date en entrée et Nombre en sortie

CREATE OR REPLACE FUNCTION TABLE_TEST (reptable in varchar2, fltdate in varchar2) RETURN NUMBER 

     IS 
     day_exists VARCHAR2(5 CHAR); 
     BEGIN 

    execute immediate 
    'Select CASE WHEN max(day_i) IS NULL THEN ''NO'' ELSE ''YES'' END FROM '|| reptable ||' WHERE 1 IN 
        (SELECT max(day_i) 
        FROM '|| reptable ||' 
        where day_i = 1 and flt_dptr_Date_d = :1)' into day_exists 
        using fltdate 
      ; 
      IF day_exists = 'YES' THEN 
       return 1; 
      END IF; 

    END TABLE_TEST;   

Voici comment je le tester

Select TABLE_TEST('FDR_REP', '07/25/2015') from dual; 

Il fonctionne correctement lorsque je les tester individuellement à-dire quand je passe juste la nom_table ou juste la date. Mais pour une raison quelconque, il montre une erreur pas un mois valide. Je ne crois pas qu'il y ait un problème avec la date.

Cette partie fonctionne quand je passe juste la nom_table

CREATE OR replace FUNCTION TEST_FUNCTION (name_table IN VARCHAR2) RETURN NUMBER 

     IS   

      rday NUMBER;     
    BEGIN 
    execute immediate 'select day_i 
       FROM ' || name_table || ' 
       WHERE day_i = 1 and rownum = 1' into rday; 


    return rday; 

    END TEST_FUNCTION; 
+0

Pourquoi transmettez-vous une valeur de date sous forme de chaîne? –

+0

@WernfriedDomscheit pour le généraliser. – JavaQuest

Répondre

1

Essayez de convertir votre première fltdate à ce jour. Voici la révision de votre code:

CREATE OR REPLACE FUNCTION TABLE_TEST (reptable in varchar2, fltdate in varchar2) RETURN NUMBER 
    IS 
    day_exists VARCHAR2(5 CHAR); 
    BEGIN 

    execute immediate 
    'Select CASE WHEN max(day_i) IS NULL THEN ''NO'' ELSE ''YES'' END FROM '|| reptable ||' WHERE 1 IN 
    (SELECT max(day_i) 
    FROM '|| reptable ||' 
    where day_i = 1 and flt_dptr_Date_d = TO_DATE(:1,''MM/DD/YYYY''))' into day_exists 
    using fltdate 
    ; 
    IF day_exists = 'YES' THEN 
    return 1; 
    END IF; 

    END TABLE_TEST;   
+0

c'était une réponse rapide. Merci !!. – JavaQuest