私が理解しているように、Postgresでは、手順はデータを操作するためのものであり、関数はデータを読み取るためのものです。私はしたいと思います:
CREATE PROCEDURE test_variable()
LANGUAGE SQL
AS $$
BEGIN;
DECLARE some_id INTEGER;
SELECT nextval('some_sequence') INTO some_id;
INSERT INTO some_table (some_column) VALUES (some_id);
END;
$$;
上記は私にはうまくいきません。ソリューションを検索すると、関数に関係するさまざまな変数がたくさんあります。$$
、宣言、何も返さないもの;簡単な例を見つけることができないようです。構文の明確な例が必要です。
まず、 [〜#〜] sql [〜#〜]関数またはプロシージャ(LANGUAGE SQL
)DECLARE
セクションがない-BEGIN
/END
。これらは 手続き型言語PL/pgSQLのブロック構造 のキーワードです。 (おそらく他のPLも。)
dezsoがコメントしたように 、plpgsql BEGIN
(ブロックの開始)とSQL BEGIN;
(トランザクションの開始)を混同しないでください。 なしはSQLで許可されています関数。後者はSQLで許可されています手順。
変数を使用するには、LANGUAGE plpgsql
(または他のPLの1つ)が必要です。あなたに明確な例を与えるために:
CREATE PROCEDURE test_variable()
LANGUAGE plpgsql AS
$$
DECLARE
_some_id int;
BEGIN
SELECT nextval('some_sequence') INTO _some_id;
INSERT INTO some_table (some_column) VALUES (_some_id);
END
$$;
まったく同じボディが関数でも機能します。