当前位置: 首页 > 知识库问答 >
问题:

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

上官兴昌
2023-03-14

我尝试使用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。执行insert语句。它返回false,因此insert语句失败。但它没有告诉我,为什么。我不知道如何访问错误消息或在util中抛出的异常。是否执行?

我还试图打开服务器输出(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个答案

沈宏朗
2023-03-14

基本上有两种方法

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");
    }
 类似资料:
  • 问题内容: 我的应用程序正在使用此脚本来增强索引中的最新项目: 它是用MVEL编写的,但是从1.3开始,对于Groovy,不推荐使用MVEL。脚本现在引发此错误: 对我来说,这听起来像Groovy中获取毫秒级时间戳的功能不同。我尝试了,但是又给出了另一个错误,说它不支持导入。 那么我该如何修复该功能以与Groovy一起使用? 问题答案: 正如您已经发现的那样,您需要用Groovy而不是MVEL重写

  • 我有一个测试步骤,其中包含两个断言。 非SOAP错误 包含。条件是响应应包含“消息发送成功” 现在我有一个Groovy脚本,从那里我执行这个测试步骤。使用这个Groovy脚本,我需要打印断言名称、值和状态。以下是我编写的代码: 但在输出中,它显示如下: 如您所见,我可以打印断言名称和状态,但不能打印“包含”断言的值。请帮助我如何获取特定断言的值。 提前谢谢。

  • 在Oracle数据库服务器上,我能够安排一个夜间作业,该作业运行从powershell脚本启动的oracle脚本,该脚本具有以下行: 现在,我需要在另一台windows机器上实现同样的功能,Oracle的唯一功能就是SQLcl客户端。我能够调用sql脚本,但目前为止仅通过三个步骤进行交互: 我需要的是oracle initial\u脚本。sql脚本从powershell启动。我有两个障碍。 要连接

  • 问题内容: 我很确定答案是否定的,但是我想我还是会问。 如果我的站点引用了名为“ whatever.js”的脚本,是否可以从该脚本中获取“ whatever.js”?喜欢: 麻烦多于依赖检查所值得的,但是这真是麻烦。 问题答案: var scripts = document.getElementsByTagName(‘script’); var lastScript = scripts[scrip

  • 问题内容: 我的android应用程序功能的一部分是放置我在init.d中编写的脚本,这样它将在每次启动时执行。(显然,我的应用仅适用于root用户) 这是我在做什么: 我遇到麻烦的地方是“ update-rc.d脚本99”行,失败的原因是“找不到update-rc.d”错误。 有谁知道正确的命令是什么才能使它在Android中工作? 我意识到这并不是发布此问题的最合适地点,但是我已经意识到该社区

  • 我正在使用sqldeveloper查询数据库并将结果导出到csv文件。我每天都需要这个文件,所以考虑创建可以在windows任务调度器上调度的bat文件。我在研究它,发现我可以使用SQLcl运行脚本来导出查询数据。但不知何故,我无法连接它,它给了我一个错误“ORA-01017:无效的用户名/密码;登录被拒绝。以下是我的sql developer连接属性 这是我的命令行: 我安装了java开发工具包