2012-05-02 53 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

这没有帮助。 $$字符附近仍然出现错误。 –