postgresql 中的存储过程与函数,哪个更适合执行 dml 语句

noo*_*ber 2 postgresql stored-procedures postgresql-9.3

我正在使用 postgresql 9.3。如果我想添加以下步骤并将这些步骤作为例程调用,使用函数或存储过程会更好吗?

我的基本步骤是:

RENAME TABLE FOOBAR_1234.table1_org TO FOOBAR_1234.table1_old;
DELETE FOOBAR_1234.table1_old WHERE 1=1;
RENAME TABLE FOOBAR_1234.table1 TO FOOBAR_1234.table1_org;
Run Code Online (Sandbox Code Playgroud)

我还需要像1234使用任何 ID一样灵活地参数化ID,例如5678

如果你有一个例子,那也会有帮助。

Cra*_*ger 6

PostgreSQL 中没有存储过程这样的东西。PostgreSQL 的所有功能都是用多种语言定义的 SQL 可调用函数 - LANGUAGE sql, LANGUAGE plpgsql,LANGUAGE plperl等。

此外,没有RENAME TABLE命令。你要ALTER TABLE ... RENAME TO ...

此特定示例必须使用 PL/PgSQL 编写,EXECUTE因为它依赖于动态 SQL。请参阅 Stack Overflow 上使用 PL/pgSQL 的众多现有示例EXECUTE。类似于 PL/PgSQL 函数的东西:

EXECUTE format('ALTER TABLE %I.%I RENAME TO %I.%I;',
    'FOOBAR_'||_schema_id, 'table1_org',
    'FOOBAR_'||_schema_id, 'table1_old');
Run Code Online (Sandbox Code Playgroud)

编辑:好的,更完整的例子:

CREATE OR REPLACE FUNCTION myfunc(_schema_id integer)
RETURNS void LANGUAGE plpgsql AS $$
BEGIN
    EXECUTE format('ALTER TABLE %I.%I RENAME TO %I.%I;',
        'FOOBAR_'||_schema_id, 'table1_org',
        'FOOBAR_'||_schema_id, 'table1_old');

    -- Now TRUNCATE the table and do your second `RENAME`
    -- in subsequent EXECUTE statements.
END;
$$;
Run Code Online (Sandbox Code Playgroud)

  • 此外,命令`DELETE FOOBAR_1234.table1_old WHERE 1=1;`对我来说看起来你实际上是在尝试`TRUNCATE`。 (3认同)
  • Postgres 从 v11 开始就有存储过程 https://www.postgresql.org/docs/11/sql-createprocedure.html (2认同)