2

Teradata で SQL ユーザー定義関数を呼び出すのに問題があります。次の関数を作成しました

*REPLACE FUNCTION "twm_source"."TD_FN_CALC" (
        "func" CHARACTER(1) CHARACTER SET LATIN,
        "a" INTEGER,
        "b" INTEGER)
    RETURNS INTEGER
    SPECIFIC "td_fn_calc"
    LANGUAGE SQL
    CONTAINS SQL
    DETERMINISTIC
    CALLED ON NULL INPUT
    SQL SECURITY DEFINER
    COLLATION INVOKER
    INLINE TYPE 1
    RETURN CASE
    WHEN func = 'A'
    THEN A + B
    WHEN func = 'S'
    THEN A - B
    WHEN func = 'M'
    THEN A * B
    ELSE A / B
END;*

しかし、Teradata 14.0 サーバーに対して次のクエリを実行すると、

select "twm_source"."TD_FN_CALC"('M',3,8);

それはエラーを与える

失敗 [5589 : HY000] 関数 'TD_FN_CALC' が存在しません。

誰が何が間違っているのかを知るのを手伝ってくれませんか。どんな助けでも大歓迎です。

4

2 に答える 2

1

エラー 5589 は、パーサーがリテラルを関数パラメーターに一致させることができなかった場合に返されます。文字リテラル ('M') は VARCHAR ですが、"func" は CHAR として定義されています。

考えられる解決策は 2 つあります。

  • 関数を呼び出すときに明示的な型キャストを追加します

    select "twm_source"."TD_FN_CALC"('M' (CHAR(1)),3,8);

  • 定義を CHAR から VARCHAR に変更します。CHAR と VARCHAR 入力の両方で動作します:-)

    "func" VARCHAR(1) CHARACTER SET LATIN,
    

ディーター

于 2013-06-27T12:04:16.480 に答える