首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用SQLcl脚本时获得util.execute异常?

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

Stack Overflow用户
提问于 2018-02-06 13:34:47
回答 1查看 1.2K关注 0票数 2

我尝试使用Oracles SQLcl编写一个批处理文件。在这个文件中,我想用util.execute插入一个新的表行。这只是返回true / false,这是成功/失败的布尔返回。

我的问题是,我是如何得到抛出的异常的错误消息的,这样我就可以找出插入语句的问题所在。

我所做的:

首先,我连接到数据库服务器并启动我的脚本:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
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;
}
/

控制台输出类似于:

代码语言:javascript
复制
reading file: path/image.jpg
insert failed
false

脚本一直工作到util.execute insert-语句。它返回false,因此insert-语句失败.但它并没有告诉我为什么。我不知道如何访问错误消息或在util.execute中抛出的异常

我还试图打开SERVEROUTPUTERRORLOGGING,但是它的输出与上面相同,错误日志表为空:

代码语言:javascript
复制
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函数的错误/异常处理的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 13:42:06

基本上有两种方法。

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

代码语言:javascript
复制
var msg = util.getLastException()

2-当使用sqlcl.run()时

我在这里写了一个例子:https://github.com/oracle/oracle-db-tools/blob/master/sqlcl/examples/audio.js

这个例子有点傻,因为它在成功/失败时发出噪音,但是你会看到得到错误的代码。检查ctx.getProperty(将获得最后一个sqlerr消息的“sqldev.last.err.message”)。

代码语言:javascript
复制
 if ( ctx.getProperty("sqldev.last.err.message") ) {          
    //  
    //  FAILED !
    //             
      play("chew_roar.wav");
    } else {        
    //  
    //  Success !!
    // 
      play("R2.wav");
    }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48644328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档