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

By simon at 2018-02-07 • 0人收藏 • 71人看过

我尝试使用Oracles 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;
}
/
缺点ole输出如下所示:
reading file: path/image.jpg
insert failed
false
该脚本正在运行,直到util.execute插入语句。它返回 false,等等e插入语句失败。但它并没有告诉我,为什么。一世 不知道,我如何获得错误消息或异常w这是 扔在util.execute里面? 我也尝试打开SERVEROUTPUT或ERRORLOGGING,但它有相同的 输出为Bove和错误日志表是空的:
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
我的知识来源是这些 [幻灯片](https://www.doag.org/formes/pubfiles/二千〇一十七分之九百〇九万九千七百三十七-NN-RobertMarz- ScriptingmitSQLcl _- BatchscriptsaufeinemneuenLevel-Praesentation.pdf) 我的脚本在那里基于,我没有找到有关错误/ 一般的util函数的异常处理?

2 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

基本上有两种方法。 1-使用util.execute(或任何util.XYZ函数)时最后一个错误 消息与检索以下。我也刚刚更新了脚本 自述文件:

var msg = util.getLastException()
2-当使用sqlcl.run() 有一个例子我写在这里: 这个例子有点愚蠢,因为它在成功/失败上产生了噪音 你会看到代码t帽子得到错误。检查 ctx.getProperty(“sqldev.last.err.message”这将得到最后一个sqlerr 信息。
 if ( ctx.getProperty("sqldev.last.err.message") ) {          
    //  
    //  FAILED !
    //             
      play("chew_roar.wav");
    } else {        
    //  
    //  Success !!
    // 
      play("R2.wav");
    }

2018-02-07   #2

基本上有两种方法。 1-使用util.execute(或任何util.XYZ函数)时最后一个错误 消息与检索以下。我也刚刚更新了脚本 自述文件:

var msg = util.getLastException()
2-当使用sqlcl.run() 有一个例子我写在这里: 这个例子有点愚蠢,因为它在成功/失败上产生了噪音 你会看到代码t帽子得到错误。检查 ctx.getProperty(“sqldev.last.err.message”这将得到最后一个sqlerr 信息。
 if ( ctx.getProperty("sqldev.last.err.message") ) {          
    //  
    //  FAILED !
    //             
      play("chew_roar.wav");
    } else {        
    //  
    //  Success !!
    // 
      play("R2.wav");
    }

登录后方可回帖

Loading...