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。
如果你有一个例子,那也会有帮助。
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)
| 归档时间: |
|
| 查看次数: |
2621 次 |
| 最近记录: |