有没有人知道在没有错误发生时是否有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.
谢谢, Ĵ
答案 0 :(得分:2)
像&#34;格兰特成功的反馈。&#34;是sqlplus的功能。
如果启用SQL *网络跟踪(详细信息http://docs.oracle.com/cd/E11882_01/java.112/e16548/apxtblsh.htm#JJDBC28987或http://www.juliandyke.com/Diagnostics/Trace/NetTrace.php),您将看到该字符串&#34;授权成功&#34;不是客户端应用程序sqlplus从Oracle收到的东西。
那么它如何知道要显示什么?因为sqlplus在将命令类型发送到服务器之前具有检查命令类型的私有机制。如果你输入non-existend命令,那么它甚至不会被发送到服务器(你也可以在SQL * NET跟踪中检查它。)
此外,如果您打开sqlplus的二进制文件作为文本并搜索字符串&#34; grant&#34;,例如(屏幕截图的左下角),您可以检查命令列表。
在下面的情况下,不会与服务器交换,因为命令是故意错误的。
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;