ant sql task:复杂的CLOB内容导致异常

Posted

技术标签:

【中文标题】ant sql task:复杂的CLOB内容导致异常【英文标题】:ant sql task: complex CLOB content leads to exception 【发布时间】:2015-12-18 13:35:34 【问题描述】:

作为数据库用户而不是数据库程序员,我觉得下面的情况很奇怪。也许有人可以在这里阐明一下?

任务:使用 ant 脚本跟踪数据库表(以下:history_table)中的 sql 脚本执行,该脚本获取 sql 脚本,执行它并将执行的脚本放入历史表中。到目前为止,这是有效的(例如,使用单行 sql 脚本,例如“select sysdate from dual;”),但是 sql 脚本中的内容更复杂,会引发错误。下面的示例代码应该可以解释问题。

桌子:

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>

脚本.sql

select *
from some_table
where (
    name is not null
    and
    condition = 'T'
);

结果,也就是异常:

$ 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) 非常感谢任何帮助或解释。

【问题讨论】:

【参考方案1】:

您的错误表明“缺少右括号”,可能来自这里:

select *
from some_table
where (
    name is not null
    and
    condition = 'T'
;  

"" 应该是一个括号。

正如下面的讨论所述,该异常实际上是由 script.sql 中出现的引号转义不足引起的。

【讨论】:

我是个多么盲目的痣啊!你是对的,当然。然而,这确实导致了下一个问题。我会相应地更新问题。谢谢。 “下一个问题”的意思是“同样的问题”。我已经更正了 script.sql 中的语句,它可以在 Oracle SQL Developer 中执行。不过,从 ant 脚本中,我得到了同样的异常。 执行时查询是否有效?插入 history_table (case_nr, file_content) 值 ('case123', to_clob('select * from some_table where ( name is not null and condition = 'T' );')); 正确的问题。在 Oracle SQL Developer 中,它没有。当我用''转义引号字符(在'T'中)时,它可以工作。但是,如果我在 script.sql 文件中做同样的事情,它最终会出现“ORA-00911:无效字符”。想一想,我必须找到一种方法来正确转义文件中的引号。所以你指出了正确的方向,引号似乎是问题的根源。

以上是关于ant sql task:复杂的CLOB内容导致异常的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何导出具有clob字段类型的sql?

用于处理来自 CLOB 的 CSV 的 Oracle PL/SQL 包/过程

Ant 之 Task

如何克服 CLOB 空间不足 - ORA-06502: PL/SQL: numeric or value error

对于 Java 8,需要使用哪个版本的 sonar-ant-task?

如何通过sql的insert语句插入大量字符串到oracle的clob字段?