将 plsql 函数迁移到 pgplsql (postgresql 9.5)
Migrating plsql function to pgplsql (postgresql 9.5)
我正在尝试将下一个函数迁移到 PostgreSQL 中:
CREATE OR REPLACE FUNCTION mar.change_const (command text) RETURNS
VOID AS $body$
DECLARE
C_Procedure_Name CONSTANT varchar(30) := 'change_constraints';
V_Step real := 0;
/* command values: ENABLE | DISABLE */
all_constraints CURSOR(stat text) FOR
SELECT *
FROM all_constraints
WHERE status = stat;
cons all_constraints%ROWTYPE;
line varchar(200);
cons_status varchar(10);
BEGIN
RAISE NOTICE 'Start : %, %', C_Procedure_Name, TO_CHAR(clock_timestamp());
V_Step := 1;
IF command IN ('enable', 'ENABLE') THEN
cons_status := 'DISABLED';
ELSE
cons_status := 'ENABLED';
END IF;
V_Step := 2;
FOR cons IN all_constraints(cons_status)
LOOP
V_Step := 2.1;
line := 'alter table ' || cons.table_name || ' ' || command ||
' novalidate constraint ' || CONS.CONSTRAINT_NAME;
V_Step := 2.2;
EXECUTE line;
END LOOP;
我知道我可以将 all_constraints 与 information_schema.table_constraints
切换,但我如何更改代码的其他部分?我无法在 PostgreSQL 中禁用和启用约束,我不想在这部分中删除它们。
我读到我可以将检查约束(这是我拥有的唯一约束类型)更改为 novalidate
,但我没有在搜索引擎中找到任何示例。
您只能在 ADD CONSTRAINT
上为检查约束设置 NO VALID
标记,因此您必须先删除旧的 CHECK CONSTRAINT
。因此,这里的 "ENABLE" 将是 ALTER TABLE ...VALIDATE
,它将锁定 table 并遍历所有数据(重新)验证它。
FK 约束是唯一可以通过 ALTER TABLE ... DISABLE TRIGGER ALL
"comfortably" "disable/enable" 然后启用它们的类型。
但简而言之,上面的过程与 Postgres 处理约束的方式有很大不同,我怀疑你在这里能否成功。可能您必须保存所有现有约束的定义,删除它们并从保存的定义重新创建到 "enable"...
我正在尝试将下一个函数迁移到 PostgreSQL 中:
CREATE OR REPLACE FUNCTION mar.change_const (command text) RETURNS
VOID AS $body$
DECLARE
C_Procedure_Name CONSTANT varchar(30) := 'change_constraints';
V_Step real := 0;
/* command values: ENABLE | DISABLE */
all_constraints CURSOR(stat text) FOR
SELECT *
FROM all_constraints
WHERE status = stat;
cons all_constraints%ROWTYPE;
line varchar(200);
cons_status varchar(10);
BEGIN
RAISE NOTICE 'Start : %, %', C_Procedure_Name, TO_CHAR(clock_timestamp());
V_Step := 1;
IF command IN ('enable', 'ENABLE') THEN
cons_status := 'DISABLED';
ELSE
cons_status := 'ENABLED';
END IF;
V_Step := 2;
FOR cons IN all_constraints(cons_status)
LOOP
V_Step := 2.1;
line := 'alter table ' || cons.table_name || ' ' || command ||
' novalidate constraint ' || CONS.CONSTRAINT_NAME;
V_Step := 2.2;
EXECUTE line;
END LOOP;
我知道我可以将 all_constraints 与 information_schema.table_constraints
切换,但我如何更改代码的其他部分?我无法在 PostgreSQL 中禁用和启用约束,我不想在这部分中删除它们。
我读到我可以将检查约束(这是我拥有的唯一约束类型)更改为 novalidate
,但我没有在搜索引擎中找到任何示例。
您只能在 ADD CONSTRAINT
上为检查约束设置 NO VALID
标记,因此您必须先删除旧的 CHECK CONSTRAINT
。因此,这里的 "ENABLE" 将是 ALTER TABLE ...VALIDATE
,它将锁定 table 并遍历所有数据(重新)验证它。
FK 约束是唯一可以通过 ALTER TABLE ... DISABLE TRIGGER ALL
"comfortably" "disable/enable" 然后启用它们的类型。
但简而言之,上面的过程与 Postgres 处理约束的方式有很大不同,我怀疑你在这里能否成功。可能您必须保存所有现有约束的定义,删除它们并从保存的定义重新创建到 "enable"...