SQLCL - неожиданное исключение Java, когда в ссылочных файлах присутствуют ошибки SQL - PullRequest
0 голосов
/ 16 января 2019

Я испытываю различное поведение при использовании SQLCL , когда в сценариях командной строки встречаются ошибки sql по сравнению с отдельным файлом sql.

Оригинальный скрипт, командная строка - ожидаемая ошибка sql

set errorlogging on
show errorlogging
TRUNCATE TABLE SPERRORLOG;
create table t1 (field1 number(10));
create table t1 (field1 number(10));
select /*csv*/ timestamp, message from sperrorlog;

Приведенный выше сценарий выполняется должным образом, когда операторы создания таблицы выполняются непосредственно из командной строки SQLCL. Как и ожидалось, второй оператор создания таблицы сообщает об ошибке, указывающей, что таблица уже существует.

Результаты, ожидаемые от командной строки:

SQL> set errorlogging on
SQL> show errorlogging
errorlogging is ON TABLE SPERRORLOG
SQL> TRUNCATE TABLE SPERRORLOG;

Table SPERRORLOG truncated.

SQL> create table t1 (field1 number(10));

Table T1 created.

SQL> create table t1 (field1 number(10));

Error starting at line : 1 in command -
create table t1 (field1 number(10))
Error report -
ORA-00955: name is already used by an existing object

SQL> select /*csv*/ timestamp, message from sperrorlog;
"TIMESTAMP","MESSAGE"
16-JAN-19 12.56.36.000000000 PM,"ORA-00955: name is already used by an existing object
"

Обновлен скрипт, внешний файл - исключение Java:

Однако, если сценарий изменен для перемещения оператора create table в отдельный файл sql, второе выполнение НЕ сообщает об ORA-00955, а скорее вызывает исключение времени выполнения Java

set errorlogging on
show errorlogging
TRUNCATE TABLE SPERRORLOG;
@create_t1.sql;
@create_t1.sql;
select /*csv*/ timestamp, message from sperrorlog;

Содержимое create_t1.sql:

create table t1 (field1 number(10));

Результат в исключительной ситуации времени выполнения Java:

SQL> set errorlogging on
SQL> show errorlogging
errorlogging is ON TABLE SPERRORLOG
SQL> TRUNCATE TABLE SPERRORLOG;

Table SPERRORLOG truncated.

SQL> @create_t1.sql

Table T1 created.

SQL> @create_t1.sql
Jan 16, 2019 1:12:40 PM oracle.dbtools.raptor.newscriptrunner.ScriptExecutor run
SEVERE: sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
java.nio.file.InvalidPathException: Illegal char <:> at index 4: file:/C:/repos/SKSandbox/sql/create_t1.sql
        at sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
        at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
        at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
        at sun.nio.fs.WindowsPath.parse(Unknown Source)
        at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
        at java.nio.file.Paths.get(Unknown Source)
        at oracle.dbtools.raptor.newscriptrunner.ScriptRunnerContext.errorLog(ScriptRunnerContext.java:2360)
        at oracle.dbtools.raptor.newscriptrunner.SQL.handleSQLException(SQL.java:245)
        at oracle.dbtools.raptor.newscriptrunner.SQL.run(SQL.java:217)
        at oracle.dbtools.raptor.newscriptrunner.ScriptRunner.runSQL(ScriptRunner.java:404)
        at oracle.dbtools.raptor.newscriptrunner.ScriptRunner.run(ScriptRunner.java:230)
        at oracle.dbtools.raptor.newscriptrunner.ScriptExecutor.run(ScriptExecutor.java:341)
        at oracle.dbtools.raptor.newscriptrunner.ScriptExecutor.run(ScriptExecutor.java:224)
        at oracle.dbtools.raptor.newscriptrunner.SQLPLUS.runExecuteFile(SQLPLUS.java:3900)
        at oracle.dbtools.raptor.newscriptrunner.SQLPLUS.run(SQLPLUS.java:209)
        at oracle.dbtools.raptor.newscriptrunner.ScriptRunner.runSQLPLUS(ScriptRunner.java:420)
        at oracle.dbtools.raptor.newscriptrunner.ScriptRunner.run(ScriptRunner.java:257)
        at oracle.dbtools.raptor.newscriptrunner.ScriptExecutor.run(ScriptExecutor.java:341)
        at oracle.dbtools.raptor.newscriptrunner.ScriptExecutor.run(ScriptExecutor.java:224)
        at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.process(SqlCli.java:404)
        at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.processLine(SqlCli.java:415)
        at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.startSQLPlus(SqlCli.java:1247)
        at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.main(SqlCli.java:491)

SQL> select /*csv*/ timestamp, message from sperrorlog;
"TIMESTAMP","MESSAGE"
no rows selected
SQL>

Обновление 2, ext файл, выход из системы - без исключения java

Если для ERRORLOGGING установлено значение OFF, исключительная ситуация Java не сообщается, и ошибка SQL возвращается, как и ожидалось.

set errorlogging off
show errorlogging
TRUNCATE TABLE SPERRORLOG;
@create_t1.sql
@create_t1.sql
select /*csv*/ timestamp, message from sperrorlog;

Результаты содержат ошибку sql без исключения java, но не содержат необходимой записи SPERRORLOG:

SQL> set errorlogging off
SQL> show errorlogging
errorlogging is OFF
SQL> TRUNCATE TABLE SPERRORLOG;

Table SPERRORLOG truncated.

SQL> @create_t1.sql

Table T1 created.

SQL> @create_t1.sql

Error starting at line : 1 File @ C:\repos\SKSandbox\sql\create_t1.sql
In command -
create table t1 (field number(10))
Error report -
ORA-00955: name is already used by an existing object

SQL> select /*csv*/ timestamp, message from sperrorlog;
"TIMESTAMP","MESSAGE"
no rows selected
SQL>

У кого-нибудь есть предложения по использованию файлов sql, которые приведут к регистрации соответствующих ошибок в SPERRORLOG без исключения java?

1 Ответ

0 голосов
/ 16 января 2019

Выглядит точно как ошибка - вы должны сообщить об этом в службу поддержки Oracle или открыть ветку на форумах .

...