web-dev-qa-db-fra.com

Pourquoi ne peut-je pas appeler une fonction de table dans Iseries DB2 que je viens de créer?

Utilisation d'Iseries Navigator 'Exécuter une fenêtre SQL Script' J'ai créé une nouvelle fonction de table. Lorsque je vais à la branche Fonctions sous le schéma où il a été créé, je vois la fonction entre les autres. Mais lorsque j'appelle la fonction de la même manière une fenêtre de script SQL, je reçois une erreur:

SELECT * FROM TABLE(TESTDAT.FNREPORT(DATE('10/23/2013'), DATE('10/23/2013'), 'ANY')) AS T

SQL State: 42704
Vendor Code: -204
Message: [SQL0204] FNREPORT in TESTDAT type *N not found.

Utilisation du client SquirRelSQL, je peux également voir la fonction dans le schéma, mais ne peut pas l'appeler en raison de la même erreur. Je peux appeler d'autres fonctions dans le schéma, mais pas celle que je viens de créer. Quelle peut être la raison?

Je peux appeler générer SQL, copier/coller le schéma et le nom de la fonction dans la fenêtre de requête, puis il lancera l'erreur ci-dessus.

Mettre à jour:

Code source complet de la fonction

CREATE FUNCTION TESTDAT.FNREPORT ( 
    DATESTART DATE , 
    DATEEND DATE , 
    ICLASS CHAR(3) ) 
    RETURNS TABLE ( 
    A INTEGER )   
    LANGUAGE SQL 
    SPECIFIC TESTDAT.FNCMSREPORT 
    NOT DETERMINISTIC 
    READS SQL DATA 
    CALLED ON NULL INPUT 
    DISALLOW PARALLEL 
    SET OPTION  ALWBLK = *ALLREAD , 
    ALWCPYDTA = *OPTIMIZE , 
    COMMIT = *NONE , 
    DECRESULT = (31, 31, 00) , 
    DFTRDBCOL = *NONE , 
    DYNDFTCOL = *NO , 
    DYNUSRPRF = *USER , 
    SRTSEQ = *HEX   
    BEGIN ATOMIC 
        RETURN 
        SELECT 1 AS A FROM SYSIBM . SYSDUMMY1 ; 
        END  ;

Juste pour clarifier que les solutions suggérées ci-dessous ne fonctionnaient pas. Si la requête ci-dessus a été changée à

SELECT * FROM TABLE(TESTDAT.FNREPORT(DATE('10/23/2013'), DATE('10/23/2013'), CAST('ANY' AS CHAR()3)) AS T

ou le paramètre ICLASS supprimé ou tous les paramètres retirés de la définition de la fonction, la même erreur exacte a été rapportée.

3
ajeh

Comme Heinz Z. a fait , j'ai découvert le problème.

Un de vos paramètres de fonction est char, pendant que vous passez la chaîne littéral 'ANY', qui est considéré comme un varchar. Le moteur de base de données recherche une version surchargée de la fonction avec varchar paramètres, mais ne le trouve pas.

La solution est soit

  • modification du paramètre de fonction sur varchar
  • ou paramètre coulant sur char dans l'appel de la fonction:

    SELECT * 
    FROM TABLE(TESTDAT.FNREPORT(DATE('10/23/2013'), 
                                DATE('10/23/2013'), 
                                CAST('ANY' AS CHAR(3))
              )) AS T
    

Si cela ne fonctionne pas, essayez de supprimer tous les paramètres de la fonction et de voir si ils sont les coupables. Ensuite, vous pouvez enquêter plus profondément en ajoutant un par un, essayez de travailler sur le format des dates, par exemple, vous pouvez essayer de passer current date au lieu du 10/23/2013.

Aussi, vous devez expliquer pourquoi il pense que FNREPORT est un type et non une fonction ...

2
bluish

Commencez avec cette instruction avant d'essayer d'exécuter la fonction:

SET PATH TESTDAT;
1
WarrenT