Игнорирование команд SQLPLUS в JDBC - PullRequest
1 голос
/ 20 марта 2012

У меня есть файл .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 в моем редакторе SQL (TOAD / SQL Navigator и т. Д.), Он работает нормально. Я вижу некоторые сообщения, когда 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

Когда я запускаю этот SQL через JDBC, я получаю исключение:

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? Или для решения этой проблемы мне просто нужно изменить файл SQL, удалив операторы SQLPlus?

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Вам потребуется удалить команды SQL * Plus из файла.

JDBC предназначен для интерфейса, не зависящего от базы данных, поэтому он предназначен для одинаковой работы с различными ядрами баз данных.Команды SQL * Plus предназначены для работы только с SQL * Plus, подключающимся к базе данных Oracle (хотя другие инструменты, поддерживающие базы данных Oracle, также часто поддерживают подмножество команд SQL * Plus).JDBC не имеет смысла знать, что представляет собой команда SQL * Plus, поэтому у него нет возможности выяснить, что такое команда SQL * Plus, или отфильтровать их.

Помимо этого, просто удаливкоманды SQL * Plus изменят семантику скрипта.Команды WHENEVER SQLERROR и WHENEVER OSEROR предписывают SQL * Plus выполнить откат в случае ошибки (которая, по вашему мнению, генерируется вашим сценарием).Вам нужно будет закодировать эту логику в ваше приложение JDBC, если вы хотите соответствовать поведению.

0 голосов
/ 20 марта 2012

Когда вы запускаете эти операторы через TOAD и т. Д., Они обычно анализируют текст либо по разделителю (например, через полуколонну), либо по переводу строки и запускают операторы по отдельности. Однако, когда вы отправляете весь текст в JDBC, он, вероятно, пытается запустить все сразу, отсюда и ошибка. Возможно, вам придется проанализировать операторы и отделить их должным образом перед отправкой в ​​JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...