我有一个 plpgsql 脚本(编者注:它实际上是一个函数),其中包含一个循环,该循环删除了 eclipse-link 生成的某些表的主键约束。它看起来像这样:
CREATE OR REPLACE FUNCTION remove_tables_constraints()
RETURNS boolean AS
$BODY$
DECLARE
constraint_statment text;
BEGIN
FOR constraint_statment IN
SELECT 'ALTER TABLE '||nspname||'.'||relname||' DROP CONSTRAINT '||conname
FROM pg_constraint
INNER JOIN pg_class ON conrelid=pg_class.oid
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
where relname not in('exclude_table')
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname LOOP
raise notice 'remove_tables_constraints run [%]', constraint_statment;
EXECUTE constraint_statment;
END LOOP;
RETURN true;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE COST 100;
select remove_tables_constraints();
该脚本使用以下命令执行:
Statement st = connection.createStatement();
st.execute(scriptStringloadedFromFile);
该脚本可以正常工作(并且在某些情况下仍然可以正常工作)。
将表的主键从 a 更改int
为 a后,它停止工作uid
。循环在执行过程中停止,不显示任何错误消息(调试设置为最佳级别)。
奇怪的是脚本确实可以工作,即使在更改之后,如果我只是将它粘贴到 psql shell 中而不是从代码中执行它。此外,如果我解压缩循环并仅编写循环执行内联的所有语句,它在从 java 代码执行时可以工作。
我已经花了几天的时间在这上面,我对如何继续一无所知。有任何想法吗 ?