eclipse-link によって生成されたいくつかのテーブルの主キー制約を削除するループを含むplpgsql スクリプト(編集者注: 実際には関数です)があります。次のようになります。
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);
スクリプトは正常に機能しました (状況によっては引き続き機能します)。
テーブルの主キーを から に変更した後、機能しなくなりint
ましたuid
。ループはエラー メッセージを表示せずに実行の途中で停止します (デバッグは最高レベルに設定されます)。
奇妙な点は、スクリプトをコードから実行するのではなく、psql シェルに貼り付けるだけで、変更後でもスクリプトが機能することです。さらに、ループを展開し、ループがインラインで実行するすべてのステートメントを記述するだけで、Java コードから実行するときに機能します。
私はこれに数日を費やしましたが、続行する方法がわかりません。何か案は ?