使用 util.execute 时如何在 SQLcl 脚本中获取 Oracle 异常?

Zeu*_*ssi 2 oracle error-handling exception sqlcl

我尝试使用 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
Run Code Online (Sandbox Code Playgroud)

我的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;
}
/
Run Code Online (Sandbox Code Playgroud)

控制台输出如下:

reading file: path/image.jpg
insert failed
false
Run Code Online (Sandbox Code Playgroud)

该脚本一直工作到util.execute插入语句为止。它返回false,因此插入语句失败。但它没有告诉我为什么。我不知道如何访问错误消息或内部引发的异常util.execute

我也尝试打开SERVEROUTPUTor 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
Run Code Online (Sandbox Code Playgroud)

我的知识来源是这些幻灯片,我的脚本也基于这些幻灯片,我没有找到有关util一般功能的错误/异常处理的信息?

Kri*_*ice 5

基本上有2种方法。

1-当使用 util.execute (或任何 util.XYZ 函数)时,将使用以下内容检索最后一个错误消息。我还刚刚更新了脚本自述文件: https: //github.com/oracle/oracle-db-tools/blob/master/sqlcl/README.md

var msg = util.getLastException()
Run Code Online (Sandbox Code Playgroud)

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");
    }
Run Code Online (Sandbox Code Playgroud)