ant sql 任务:复杂的 CLOB 内容导致异常
ant sql task: complex CLOB content leads to exception
作为数据库用户而不是数据库程序员,我觉得下面的情况很奇怪。也许有人可以在这里阐明一些信息?
任务:跟踪 sql 数据库 table 中的脚本执行(下面:history_table)使用一个 ant 脚本获取 sql 脚本,执行它并放置执行的脚本进入历史table。到目前为止这是可行的(例如,使用单行 sql 脚本,例如 'select sysdate from dual;'),但是 sql 脚本中的内容更复杂,会抛出错误。下面的示例代码应该可以解释问题。
table:
create table history_table (
case_nr varchar2(20) not null,
sql_data clob not null
)
蚂蚁任务:
<target name="put_into_history_table">
<loadfile property="script_content.raw" srcFile="${script}" />
<sql
classpath="./ojdbc6.jar"
driver="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@${db.hostname}:${db.port}:${db.sid}"
userid="${db.user}"
password="${db.password}"
expandproperties="true">
insert into history_table (case_nr, file_content)
values ('${case.nr}', to_clob('${script_content.raw}');
commit;
</sql>
</target>
script.sql
select *
from some_table
where (
name is not null
and
condition = 'T'
);
结果,a.k.a。异常:
$ ant
Buildfile: D:\temp\scripts\build.xml
put_into_history_table:
[sql] Executing commands
[sql] Failed to execute:
[sql] insert into history_table (case_nr, file_content)
[sql] values ('case123', to_clob('select *
[sql] from some_table
[sql] where (
[sql] name is not null
[sql] and
[sql] condition = 'T'
[sql] );
[sql]
[sql] '));
[sql] commit;
BUILD FAILED
D:\temp\scripts\build.xml:48: java.sql.SQLSyntaxErrorException: ORA-00907: missing right parenthesis
...
Total time: 0 seconds
$
我不确定,我错过了什么。恕我直言,应该将 clob 视为大量字符,而不是以任何方式进行解释。
(也许重要:ant 版本:1.9.2;java 版本 1.8。0_31;oracle 版本 11.2.0.1.0)
非常感谢任何帮助或解释。
您的错误状态 "Missing right parenthesis" ,可能来自此处:
select *
from some_table
where (
name is not null
and
condition = 'T'
};
"}" 应该是括号。
正如下面的讨论所述,异常实际上是由引号转义不足引起的出现在script.sql.
作为数据库用户而不是数据库程序员,我觉得下面的情况很奇怪。也许有人可以在这里阐明一些信息?
任务:跟踪 sql 数据库 table 中的脚本执行(下面:history_table)使用一个 ant 脚本获取 sql 脚本,执行它并放置执行的脚本进入历史table。到目前为止这是可行的(例如,使用单行 sql 脚本,例如 'select sysdate from dual;'),但是 sql 脚本中的内容更复杂,会抛出错误。下面的示例代码应该可以解释问题。
table:
create table history_table (
case_nr varchar2(20) not null,
sql_data clob not null
)
蚂蚁任务:
<target name="put_into_history_table">
<loadfile property="script_content.raw" srcFile="${script}" />
<sql
classpath="./ojdbc6.jar"
driver="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@${db.hostname}:${db.port}:${db.sid}"
userid="${db.user}"
password="${db.password}"
expandproperties="true">
insert into history_table (case_nr, file_content)
values ('${case.nr}', to_clob('${script_content.raw}');
commit;
</sql>
</target>
script.sql
select *
from some_table
where (
name is not null
and
condition = 'T'
);
结果,a.k.a。异常:
$ ant
Buildfile: D:\temp\scripts\build.xml
put_into_history_table:
[sql] Executing commands
[sql] Failed to execute:
[sql] insert into history_table (case_nr, file_content)
[sql] values ('case123', to_clob('select *
[sql] from some_table
[sql] where (
[sql] name is not null
[sql] and
[sql] condition = 'T'
[sql] );
[sql]
[sql] '));
[sql] commit;
BUILD FAILED
D:\temp\scripts\build.xml:48: java.sql.SQLSyntaxErrorException: ORA-00907: missing right parenthesis
...
Total time: 0 seconds
$
我不确定,我错过了什么。恕我直言,应该将 clob 视为大量字符,而不是以任何方式进行解释。 (也许重要:ant 版本:1.9.2;java 版本 1.8。0_31;oracle 版本 11.2.0.1.0) 非常感谢任何帮助或解释。
您的错误状态 "Missing right parenthesis" ,可能来自此处:
select *
from some_table
where (
name is not null
and
condition = 'T'
};
"}" 应该是括号。
正如下面的讨论所述,异常实际上是由引号转义不足引起的出现在script.sql.