Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ant sql任务:复杂的CLOB内容导致异常_Java_Sql_Oracle_Ant_Sqlplus - Fatal编程技术网

Java ant sql任务:复杂的CLOB内容导致异常

Java ant sql任务:复杂的CLOB内容导致异常,java,sql,oracle,ant,sqlplus,Java,Sql,Oracle,Ant,Sqlplus,作为一个数据库用户而不是一个数据库程序员,我发现下面的情况很奇怪。也许有人能给我们点启示 任务:使用一个ant脚本跟踪数据库表(如下:history_table)中的sql脚本执行情况,ant脚本获取sql脚本并执行它,然后将执行的脚本放入历史表中。到目前为止,这是可行的(例如,对于一行sql脚本,例如“select sysdate from dual;”),但是对于sql脚本中更复杂的内容,会抛出错误。下面的示例代码应该解释这个问题 下表: create table history_table

作为一个数据库用户而不是一个数据库程序员,我发现下面的情况很奇怪。也许有人能给我们点启示

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

下表:

create table history_table (
    case_nr varchar2(20) not null,
    sql_data clob not null
)
ant任务:

<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>
结果,又称例外情况:

$ 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

$
我不确定,我错过了什么。Imho clob应被视为大量字符,不得以任何方式进行解释。 (可能很重要:ant版本:1.9.2;java版本1.8.0\u 31;oracle版本11.2.0.1.0) 非常感谢您提供的任何帮助或解释。

您的错误状态为“缺少右括号”,可能来自这里:

select *
from some_table
where (
    name is not null
    and
    condition = 'T'
};  
“}”应该是一个括号


正如在下面的讨论中所述,这个异常实际上是由于script.sql中出现的引号转义不足而导致的。

我真是个瞎子!当然,你是对的。然而,这确实会导致下一个问题。我会相应地更新问题。谢谢,“下一个问题”的意思是“相同的问题”。我已经更正了script.sql中的语句,它在Oracle sql Developer中是可执行的。尽管如此,从ant脚本中,我还是得到了相同的异常。当执行查询时,它能工作吗?将值('case123',插入历史记录表格(case表格编号,文件内容);'clob('select*从某些表格中,其中(名称不为null,条件='T');');正确的问题。在OracleSQLDeveloper中,它不是。当我用“”转义引号字符(在“T”中)时,它就起作用了。但是,如果在script.sql文件中执行相同的操作,它将以“ORA-00911:无效字符”结尾。我想,我必须找到一种方法来正确地转义文件中的引号。所以你给我指出了正确的方向,引号似乎是问题的根源。
select *
from some_table
where (
    name is not null
    and
    condition = 'T'
};