Hallo,
ich habe eine Stored Procedure zum Anlegen von Historischen Tabellen aus den bestehenden Tabellen. Wenn ich das ganze über pgAdmin aufrufe funktioniert alles einwandfrei.
Mein Ziel ist es aber die Stored Procedure im Zuge eines Deployment Skriptes anzulegen und danach aufrufen zu lassen.
JDBC liefert keinen Fehler zurück, aber ich find die Function danach nicht im Schema.
CREATE OR REPLACE FUNCTION csm_data_mec.create_hist_tables() RETURNS void AS $BODY$
DECLARE
i pg_tables%ROWTYPE;
k RECORD;
pk varchar(255);
BEGIN
for i in (select * from pg_tables where schemaname = 'csm_data_mec')
loop
execute 'create table '||i.schemaname||'.'||i.tablename || '_HIST AS select * from ' || i.schemaname||'.'||i.tablename;
execute 'alter table '||i.schemaname||'.'||i.tablename || '_HIST ADD COLUMN REV BIGINT NOT NULL, ADD COLUMN REVTYPE INTEGER';
for k in (SELECT c.column_name FROM INFORMATION_SCHEMA.COLUMNS c WHERE is_nullable='NO' AND c.table_schema = i.schemaname AND table_name=i.tablename)
loop
execute 'alter table '||i.schemaname||'.'||i.tablename || '_HIST ALTER COLUMN '||k.column_name||' DROP NOT NULL';
end loop;
pk := '';
for k in (SELECT c.column_name, c.data_type FROM information_schema.table_constraints tc JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema AND tc.table_name = c.table_name AND ccu.column_name = c.column_name where constraint_type = 'PRIMARY KEY' and tc.table_name = i.tablename)
loop
execute 'alter table '||i.schemaname||'.'||i.tablename || '_HIST ALTER COLUMN '||k.column_name||' SET NOT NULL';
pk := pk || k.column_name || ',';
end loop;
execute 'alter table '||i.schemaname||'.'||i.tablename || '_HIST ADD PRIMARY KEY ('||pk||'rev)';
end loop;
END;
$BODY$ LANGUAGE plpgsql;
Aufgerufen wird das ganze mit
Statement stmt;
stmt = connection.createStatement();
stmt.execute(sql);
stmt.close();
Ich habe auch mal quick and dirty versucht nach dem execute die Stored Procedure direkt aufzurufen mit
stmt.execute("select create_hist_tables()");
Gab aber auch keinen Fehler, aber auch keinen Effekt.
Irgendwie weis ich im Moment nicht weiter.
Gruß,
Marc