web-dev-qa-db-ja.com

プロシージャ(関数ではない)で変数を使用する方法

私が理解しているように、Postgresでは、手順はデータを操作するためのものであり、関数はデータを読み取るためのものです。私はしたいと思います:

  1. 変数を宣言する
  2. 変数に値を選択します
  3. 変数を別のテーブルに挿入する
  4. トランザクションでこれを行う
  5. ストアドプロシージャでこれを行う
  6. 必要に応じてロールバック
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;
$$;

上記は私にはうまくいきません。ソリューションを検索すると、関数に関係するさまざまな変数がたくさんあります。$$、宣言、何も返さないもの;簡単な例を見つけることができないようです。構文の明確な例が必要です。

2
NONONO

まず、 [〜#〜] sql [〜#〜]関数またはプロシージャ(LANGUAGE SQLDECLAREセクションがない-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
$$;

まったく同じボディが関数でも機能します。

6