忽略JDBC中的SQLPLUS命令

时间:2012-03-20 04:56:19

标签: sql database oracle oracle11g sqlplus

我有一个包含以下语句的.sql文件:

SET LINESIZE 2000
WHENEVER SQLERROR EXIT 1 ROLLBACK
WHENEVER OSERROR EXIT 1 ROLLBACK
SET PAGESIZE 0
SET HEADING ON
SET FEEDBACK OFF
SET VERIFY OFF

INSERT INTO TABLE_A
--get some value from TABLE B that will be added in Table A....

COMMIT;

EXIT;

当我在我的SQL编辑器(TOAD / SQL Navigator等)中运行此SQL时,它可以正常工作。当SQLNavigator执行此命令时,我看到一些消息:

SQL*Plus command ignored.
Processing ...
WHENEVER SQLERROR EXIT 1 ROLLBACK

SQL*Plus command ignored.
Processing ...
WHENEVER OSERROR EXIT 1 ROLLBACK

SQL*Plus command ignored.
Processing ...
SET PAGESIZE 0

当我通过JDBC运行此SQL时,我得到一个例外:

Caused by: java.sql.SQLException: ORA-00922: missing or invalid option

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)

我假设这个错误是因为JDBC无法理解SQLPlus语句并且失败。有没有办法告诉JDBC忽略这些语句并运行主SQL?或者要解决这个问题,我只需要通过删除SQLPlus语句来修改SQL文件吗?

2 个答案:

答案 0 :(得分:1)

您需要从文件中删除SQL * Plus命令。

JDBC旨在成为与数据库无关的接口,因此它可以与各种不同的数据库引擎一起工作。 SQL * Plus命令旨在仅与SQL * Plus连接到Oracle数据库一起工作(尽管支持Oracle数据库的其他工具通常也支持SQL * Plus命令的子集)。 JDBC知道构成SQL * Plus命令的内容是没有意义的,因此它无法弄清楚什么是SQL * Plus命令或过滤掉它们。

除此之外,只需删除SQL * Plus命令即可更改脚本的语义。 WHENEVER SQLERRORWHENEVER OSEROR命令指示SQL * Plus在发生错误时发出回滚(这听起来像是脚本生成的)。如果要匹配行为,则需要将该逻辑编码到JDBC应用程序中。

答案 1 :(得分:0)

当您通过TOAD等运行这些语句时,它们通常通过分隔符(例如半列)或换行符解析文本并单独运行语句。但是,当您将整个文本发送到JDBC时,它可能会尝试一次性运行它,因此会出错。在发送到JDBC之前,您可能必须解析语句并将它们正确分开。