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が削除されたか、関数定義からすべてのパラメータが削除された場合、まったく同じエラーが報告されました。
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
を渡してみます。
また、FNREPORT
がtypeであり、関数ではないと考える理由を調査する必要があります...
関数を実行する前に、次のステートメントから始めます。
SET PATH TESTDAT;