Как получить исключение Oracle в сценарии SQLcl при использовании util.execute?

Я пытаюсь написать командный файл с помощью Oracle SQLcl. В этом файле я хочу вставить новую строку таблицы с util.execute, Это просто возвращается true / false, который является логическим возвращением успеха / неудачи.
У меня вопрос, как я получаю сообщение об ошибке исключения, которое выдается, чтобы я мог выяснить, в чем проблема с моим оператором вставки.

Что я делаю:
Прежде всего, я подключаюсь к серверу базы данных и запускаю свой скрипт:

me@pc:/myproject$ /sqlcl/bin/sql schemaname/pw@server.com:1521/sid


SQLcl: Release 17.3.0 Production [...]

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit [...]

SQL> 
SQL> @mybatchscript.js path/image.jpg

мой mybatchscript.js выглядит так:

script
var tabName = "MY_TABLE_NAME";
var HashMap = Java.type("java.util.HashMap");
var bindmap = new HashMap();
var filePath="&1";
print("\nreading file: "+ filePath);
var blob=conn.createBlob();
var bstream=blob.setBinaryStream(1);

java.nio.file.Files.copy(java.nio.file.FileSystems.getDefault().getPath(filePath),bstream);
bstream.flush();
bindmap.put("content",blob); // has content
bindmap.put("size",blob.length()); // is 341989
// the follow command fails
var doInsert = util.execute("insert into " 
  + tabName 
  + " (id, main_id, file_name, file_type,"
  + " file_size, file_content, table_name)"
  + " values("
  + " SEQ_MY_TABLE_NAME.nextval, 1,"
  + " 'testname', 'image/jpeg', :size, :content,"
  + " 'my_table_name')"
  ,bindmap);


sqlcl.setStmt(
    "show errors \n"
);
sqlcl.run();


if(!doInsert) {
  print("insert failed");
  print(doInsert);
  exit;
}
/

Консольный вывод выглядит так:

reading file: path/image.jpg
insert failed
false

Скрипт работает до util.execute вставить-заявление. Возвращается false, поэтому оператор вставки не выполнен. Но это не говорит мне, почему. Я понятия не имею, как я могу получить доступ к сообщению об ошибке или исключению, которое выдается внутри util.execute?

Я тоже пытался включить SERVEROUTPUT или же ERRORLOGGING, но он имеет тот же вывод, что и выше, и таблица журнала ошибок пуста:

SQL> set errorlogging on
SQL> show errorlogging
errorlogging is ON TABLE SPERRORLOG
SQL> set serveroutput on
SQL> show serveroutput
serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED

Моим источником знаний были эти слайды, на которых также основан мой сценарий, я не нашел информации об обработке ошибок / исключений для util функции вообще?

1 ответ

Решение

Там в основном 2 способа.

1- При использовании util.execute (или любых функций util.XYZ) извлекается последнее сообщение об ошибке со следующим. Я также только что обновил скрипт README: https://github.com/oracle/oracle-db-tools/blob/master/sqlcl/README.md

var msg = util.getLastException()

2- При использовании sqlcl.run()

Вот пример, который я написал здесь: https://github.com/oracle/oracle-db-tools/blob/master/sqlcl/examples/audio.js

Этот пример немного глуп, поскольку он создает шумы при успехе / неудаче, но вы увидите код, который получает ошибку. Проверьте ctx.getProperty("sqldev.last.err.message", который получит последнее сообщение sqlerr.

 if ( ctx.getProperty("sqldev.last.err.message") ) {          
    //  
    //  FAILED !
    //             
      play("chew_roar.wav");
    } else {        
    //  
    //  Success !!
    // 
      play("R2.wav");
    }
Другие вопросы по тегам