web-dev-qa-db-ja.com

作成したばかりのiSeries DB2でテーブル関数を呼び出せないのはなぜですか?

ISeriesナビゲーターの「SQLスクリプトの実行」ウィンドウを使用して、新しいテーブル関数を作成しました。関数が作成されたスキーマの下の関数ブランチに移動すると、他のいくつかの関数が表示されます。しかし、同じSQLスクリプトの実行ウィンドウで関数を呼び出すと、エラーが発生します。

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.

SquirrelSqlクライアントを使用すると、スキーマ内の関数も表示されますが、同じエラーが原因で呼び出すことができません。スキーマ内の他の関数を呼び出すことはできますが、先ほど作成した関数を呼び出すことはできません。その理由は何ですか?

Generate SQLを呼び出し、スキーマと関数名をクエリウィンドウにコピーして貼り付けると、上記のエラーがスローされます。

更新:

関数の完全なソースコード

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  ;

以下に提案するソリューションが機能しなかったことを明確にするために。上記のクエリがに変更された場合

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

パラメータICLASSが削除されたか、関数定義からすべてのパラメータが削除された場合、まったく同じエラーが報告されました。

3
ajeh

Heinz Z.がした のように、私は問題を発見しました。

関数パラメーターの1つはcharですが、文字列リテラル'ANY'を渡すと、varcharと見なされます。データベースエンジンは、varcharパラメータを持つ関数のオーバーロードされたバージョンを探しますが、見つかりません。

解決策は

  • 関数パラメーターをvarcharに変更する
  • または、関数呼び出しでパラメーターをcharにキャストします。

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

機能しない場合は、いずれの場合も関数からすべてのパラメーターを削除して、それらが原因かどうかを確認してください。次に、1つずつさらに追加していくことを調査し、日付形式で作業してみます。たとえば、2013年10月23日ではなくcurrent dateを渡してみます。

また、FNREPORTtypeであり、関数ではないと考える理由を調査する必要があります...

2
bluish

関数を実行する前に、次のステートメントから始めます。

SET PATH TESTDAT;
1
WarrenT