あなたの例では多くが正しくありません。というか、あまり あなたの例にぴったりです。
CREATE OR REPLACE FUNCTION f_test(
name text = NULL
, city text = NULL
, phonenumber text = NULL
,address text = NULL
, OUT sno bigint)
RETURNS void AS
$func$
DECLARE
phonenumber AS VarChar(20); -- would collide with parameter name
BEGIN
phonenumber := phonenumber; -- nonsense
SELECT INTO sno max(ssno) + 1 FROM emp; -- SELECT INTO for assignment
IF sno IS NULL THEN
sno := ident_current('emp') + 1;
END IF;
RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
VALUES (name, city, phonenumber, address);
END
$func$ LANGUAGE plpgsql;
主なポイント
-
エラーメッセージはそれ自体を物語っています:
これは、ほぼマニュアルの内容 です。 :
-
RETURNS void
を組み合わせても意味がありませんOUT
を使用 パラメータ。 -
パラメータ名と衝突する変数名を宣言しないでください。ここではまったく役に立たない。
-
plpgsql代入演算子は
:=<です。 / code>
、=
ではありません 。 -
通常、
RAISE
は使用しません レベルINFO
。NOTICE
が必要です 代わりに。 -
SELECT
plpgsqlではターゲットなしでは不可能です。SELECTINTO
が必要です。 。 -
IF
END IF
で終了しますEND
ではありません 。
さらに簡素化
COALESCE コード>
IF
を置き換える 声明。集計関数は、テーブルが空の場合でも行を返します。
ただし、これも必要ありません。 RETURNING
を使用するだけです 新しいIDを直接返す句:
CREATE OR REPLACE FUNCTION f_test(
name text = NULL
, city text = NULL
, phonenumber text = NULL
, address text = NULL
, OUT sno bigint)
AS
$func$
BEGIN
RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
VALUES (name, city, phonenumber, address)
RETURNING ssno
INTO sno; -- Assuming you want to return autoincremented id
END
$func$ LANGUAGE plpgsql;