没有错误时相当于SQLERRM?

时间:2017-10-04 15:08:35

标签: oracle plsql oracle12c execute-immediate

有没有人知道在没有错误发生时是否有SQLERRM的等价物?

我知道我可以计算受影响的行,例如here,但是我可以自动获取我从SQLPLUS获得的消息,例如在PL / SQL中role granted.之后execute immediate

我正在尝试

begin
  execute immediate 'grant select on s1.tbl1 to user1';
  dbms_output.put_line(<some function>);
end;

并获取

  

Grant succeeded.

谢谢, Ĵ

2 个答案:

答案 0 :(得分:2)

像&#34;格兰特成功的反馈。&#34;是sqlplus的功能。

如果启用SQL *网络跟踪(详细信息http://docs.oracle.com/cd/E11882_01/java.112/e16548/apxtblsh.htm#JJDBC28987http://www.juliandyke.com/Diagnostics/Trace/NetTrace.php),您将看到该字符串&#34;授权成功&#34;不是客户端应用程序sqlplus从Oracle收到的东西。

那么它如何知道要显示什么?因为sqlplus在将命令类型发送到服务器之前具有检查命令类型的私有机制。如果你输入non-existend命令,那么它甚至不会被发送到服务器(你也可以在SQL * NET跟踪中检查它。)

此外,如果您打开sqlplus的二进制文件作为文本并搜索字符串&#34; grant&#34;,例如(屏幕截图的左下角),您可以检查命令列表。

enter image description here

在下面的情况下,不会与服务器交换,因为命令是故意错误的。

  

SQL&GT; some_command

     

SP2-0734:未知命令开头&#34; some_comma ...&#34; - 其余的线   忽略。

因此Oracle在将SQL文本发送到服务器之前就知道命令类型,对于某些命令,它在执行后会收到其他信息。与DML受影响的行数一样。此信息足以显示&#34;反馈&#34;。

回到你的任务,最简单的方法是对命令的前1-3个单词进行原始解析,如果没有错误则显示相应的消息。

Hardcore选项是启用SQL跟踪并从跟踪文件派生命令类型。

=====================
PARSING IN CURSOR #3 len=31 dep=0 uid=91 oct=17 lid=91 tim=2178486867995 hv=3483936374 ad='b967c6a4' sqlid='10y8y7m7uj9mq'
grant execute on <...> to <...>
END OF STMT
PARSE #3:c=0,e=614,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=2178486867994
=====================

oct表示Oracle命令类型

SQL> select command_name from v$sqlcommand where command_type = 17;

COMMAND_NAME
----------------------------------------------------------------
GRANT OBJECT

另一个选择是启用审计,但我的偏好是保持简单。

答案 1 :(得分:0)

如果只是成功消息的输出是我们所关注的,那么简单地使用异常会有所帮助。

SET SERVEROUTPUT ON
BEGIN
  execute immediate 'grant select on s1.tbl1 to user1' ;
  dbms_output.put_line('Grant succeeded');
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('Grant Failed');
    procedure_to_log_error(SQLERRM);
END;