使用 util.execute 时如何在 SQLcl 脚本中获取 Oracle 异常?
How to get Oracle exception in SQLcl script when using util.execute?
我尝试使用 Oracles SQLcl 编写一个批处理文件。在这个文件中,我想插入一个新的 table 行 util.execute
。这只是 returns true
/ false
,它是 success/failure.
的布尔值 return
我的问题是,我如何得到抛出的异常的错误消息,以便我可以找出我的插入语句有什么问题。
我做什么:
首先,我连接到我的数据库服务器并启动我的脚本:
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
插入语句。它 returns false
,因此插入语句失败。但它没有告诉我,为什么。我不知道如何访问 util.execute
?
中抛出的错误消息或异常
我也试过打开SERVEROUTPUT
或ERRORLOGGING
,但是输出和上面一样,错误日志table是空的:
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
我的知识来源是这些 slides 我的脚本也基于这些,我没有找到关于 util
函数的错误/异常处理的信息?
基本上有两种方法。
1- 当使用 util.execute(或任何 util.XYZ 函数)时,最后一条错误消息通过以下方式检索。我还更新了脚本自述文件: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
该示例有点愚蠢,因为它在 success/failure 上发出噪音,但您会看到出现错误的代码。检查 ctx.getProperty("sqldev.last.err.message" 这将获得最后一条 sqlerr 消息。
if ( ctx.getProperty("sqldev.last.err.message") ) {
//
// FAILED !
//
play("chew_roar.wav");
} else {
//
// Success !!
//
play("R2.wav");
}
我尝试使用 Oracles SQLcl 编写一个批处理文件。在这个文件中,我想插入一个新的 table 行 util.execute
。这只是 returns true
/ false
,它是 success/failure.
的布尔值 return
我的问题是,我如何得到抛出的异常的错误消息,以便我可以找出我的插入语句有什么问题。
我做什么:
首先,我连接到我的数据库服务器并启动我的脚本:
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
插入语句。它 returns false
,因此插入语句失败。但它没有告诉我,为什么。我不知道如何访问 util.execute
?
我也试过打开SERVEROUTPUT
或ERRORLOGGING
,但是输出和上面一样,错误日志table是空的:
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
我的知识来源是这些 slides 我的脚本也基于这些,我没有找到关于 util
函数的错误/异常处理的信息?
基本上有两种方法。
1- 当使用 util.execute(或任何 util.XYZ 函数)时,最后一条错误消息通过以下方式检索。我还更新了脚本自述文件: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
该示例有点愚蠢,因为它在 success/failure 上发出噪音,但您会看到出现错误的代码。检查 ctx.getProperty("sqldev.last.err.message" 这将获得最后一条 sqlerr 消息。
if ( ctx.getProperty("sqldev.last.err.message") ) {
//
// FAILED !
//
play("chew_roar.wav");
} else {
//
// Success !!
//
play("R2.wav");
}