2012-05-02 59 views
0

我需要以編程方式執行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腳本?

+0

題外話,但你有沒有考慮數據庫遷移工具?例子是liquibase或flyway。 –

回答

2

最有可能的是,SQLExec將語句拆分爲;這是SQL中的默認語句終止字符。

在你的情況下,這種分裂不應該發生。

你可以嘗試使用這樣的:

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

,然後用/上一行分開你的SQL語句的文件中:

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)) 
/
+0

這沒有幫助。 $$字符附近仍然出現錯誤。 –