0

プログラムで SQL スクリプトを実行する必要があります。このスクリプトは、バージョンに応じて postgreSQL データベースをアップグレードする関数を定義します。次のようになります。

create or replace function update_auto_increment(version varchar(20)) returns integer
as $$
declare 
 v integer;
begin
 v := cast(version as int);
 if v < 590 then
 -- some upgrade code here
 v := 590;
 raise notice 'Updated base to version %', v;
 end if;
 return v;
end;
$$ language plpgsql;

select update_auto_increment(value) from info where name = 'version';

drop function update_auto_increment(varchar(20));

次に、ANT タスクを準備して実行します。

SQLExec task = new SQLExec();
Project project = new Project();
project.init();
task.setProject(project);
task.setTaskType("sql");
task.setTaskName("sql");
task.setSrc(new File("updateScript.sql"));
task.setDriver(driver);
task.setPassword(password);
task.setUserid(username);
task.setUrl(connectionURL);
task.execute();

$$ に遭遇すると、実行プロセスは失敗します。

org.postgresql.util.PSQLException: ERROR: syntax error (near: "$")
position: 91
at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:672)

(エラー メッセージはローカライズされており、英語に翻訳しようとしました)。問題は、関数定義を含む SQL スクリプトをプログラムで実行するにはどうすればよいかということです。

4

2 に答える 2

2

おそらくSQLExecは;、SQLのデフォルトのステートメント終了文字であるステートメントを分割しています。

あなたの場合、その分割は起こらないはずです。

あなたはこのようなものを使おうとするかもしれません:

task.setDelimiterType(SQLExec.DelimiterType.ROW);
task.setDelimiter("/");

次に、ファイル内のSQLステートメントを/1行で区切ります。

create or replace function update_auto_increment(version varchar(20)) returns integer
as $$
declare 
 v integer;
begin
 v := cast(version as int);
 if v < 590 then
 -- some upgrade code here
 v := 590;
 raise notice 'Updated base to version %', v;
 end if;
 return v;
end;
$$ language plpgsql;
/

select update_auto_increment(value) from info where name = 'version'
/

drop function update_auto_increment(varchar(20))
/
于 2012-05-02T16:02:56.323 に答える