如何在过程(不是函数)中使用变量?

Ale*_*ans 3 postgresql transaction plpgsql functions sql-procedure

据我了解,在 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;
$$;
Run Code Online (Sandbox Code Playgroud)

以上对我不起作用。当我寻找解决方案时,有很多不同的变量涉及函数$$、声明、事物不返回任何内容;似乎找不到一个简单的例子;我只需要一个清晰的语法示例。

Erw*_*ter 8

首先,SQL函数或过程 ( LANGUAGE SQL)没有DECLARE节 - 也没有BEGIN/ END。这些是过程语言 PL/pgSQL块结构的关键字- 在函数和过程中。(也许其他 PL 也是如此。)

就像 dezso 评论的那样,不要将 plpgsql BEGIN(启动一个块)与 SQL BEGIN;(启动一个事务)混淆。在 SQL函数中不允许。后者在 SQL过程中是允许的。

要使用变量,您需要LANGUAGE plpgsql(或其他 PL 之一)。给你一个明确的例子:

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
$$;
Run Code Online (Sandbox Code Playgroud)

完全相同的主体也适用于函数。