使用Apache ANT以编程方式执行带有plpgsql函数的sql脚本失败

时间:2012-05-02 12:42:24

标签: java sql postgresql ant

我需要以编程方式执行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脚本?

2 个答案:

答案 0 :(得分: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))
/

答案 1 :(得分:0)

除了a_horse_with_no_name's answer之外,您还需要将$$替换为$foo$标记。

有关Dollar-Quoted Strings的更多信息:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING