[JAVA] Stored Procedure wird nicht über JDBC angelegt

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

Rufst Du denn con.commit() auf?
Solange die Transaktion nicht mit commit beendet wurde, wird die Funktion auch nicht erstellt.

Vielleicht willst Du Dir ja auch mal ein Tool wie Liquibase oder Flyway zur Verwaltung der Deployment Scripte ansehen. Man muss ja das Rad nicht nochmal erfinden.

Das wars, vielen Dank!

Ich hab bei der Connection autocommit auf false gesetzt und dann explizit das commit aufgerufen.

Liquibase wollte ich mir mal anschauen, wenn es richtung Migrations geht. Im Moment sind wir noch nicht produktiv, da können wir das Schema immer neu erzeugen.

Wir benutzen Enterprise Architect um das ER Modell zu pflegen und erzeugen daraus die DDL Script, im Moment für Oracle, MySql und Postgres. ZUsätzlich haben wir dann noch andere Skripte wie oben genanntes, die dann noch bestimmte transformationen machen.

Funktioniert im Moment ganz gut. Auf Knopfdruck lässt sich das Schema zurücksetzen.