我需要以編程方式執行SQL腳本。該腳本定義了一個函數,根據其版本升級postgreSQL數據庫。它看起來像這樣:使用Apache ANT以編程方式執行sql腳本與plpgsql函數失敗
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腳本?
題外話,但你有沒有考慮數據庫遷移工具?例子是liquibase或flyway。 –