0

私はこのコードを持っています

CREATE OR REPLACE FUNCTION test_func( str CHARACTER VARYING ) RETURNS CHARACTER VARYING 
AS $$

BEGIN
    str := CAST(str AS INTEGER);

    IF  str > 4 THEN
        RETURN 'YES';
    ELSE
        RETURN 'NO';
    END IF;

END;
$$
LANGUAGE plpgsql;

次に、この関数を呼び出すとSELECT test_func('9')

返されたエラー: operator does not exist: character varying > integer

なぜこれが起こったのですか?strとして変換されないのはなぜINTEGERですか?

4

2 に答える 2

2

これは設計上壊れています。

関数に渡された値が有効な場合integer、パラメーターは最初から型である必要がありますinteger。それ以外の場合、関数本体内のキャストは遅かれ早かれ例外を発生させます。
そのはず:

CREATE OR REPLACE FUNCTION test_func(str integer) ...

その後、キャストは必要ありません。

そして、テスト ケースのように単純である限り、CASEステートメントまたはプレーンな SQL クエリで SQL 関数を使用します。

CREATE OR REPLACE FUNCTION test_func(str int)
  RETURNS text AS
$$
SELECT CASE WHEN str > 4 THEN 'YES' ELSE 'NO' END;
$$
LANGUAGE sql;

Postgres 9.2 より前のSQL 関数ではパラメーターを参照できないことに注意してください。古いバージョンでは位置パラメータを使用してください。$1

于 2013-05-20T20:03:24.950 に答える