oracle提供的dbms_xplan包用来显示执行计划那是特别的好,但由于采用了管理函数实现,所以调用时需要加上table()函数,这样就不能直接作为一列返回了,而我恰好有这样一个需求,要显示一个SQL的完整文本与执行计划,而且SQL肯定是多行的,SQL的完整文本有CLOB保存,很好取,执行计划却不能直接调用dbms_xplan.display_cursor了,所以就想进行一层封装,让它也返回CLOB,写了一点代码如下:
-
create or replace noneditionable function mysqlplan(p_sqlid in varchar2) return clob authid current_user as
-
myplan clob;
-
begin
-
for pto_row in (select plan_table_output as pto from table(dbms_xplan.display_cursor(p_sqlid))) loop
-
myplan:=myplan || pto_row.pto || chr(13);
-
end loop;
-
return myplan;
-
end;
其中首先是没有加“authid current_user"这一子句的,一跑返回的竟然是”User has no SELECT privilege on V$SQL"! 由于我用的是system用户,肯定是有权限的,直接查也没问题,所以报这个权限问题就让我挺纳闷的了,很早之前曾在TOM大师的一本书上看到了过“定义者权限”与“调用者权限”的概念,但并没有理解得很透彻,而且不应该默认就是当前用户吗?如果system用户定义,却以别的用户调用,那么它用哪个用户呢?这是根据什么规则来的?
疑问并没完全解开,但加上了“authid current_user"子句之后,运行正常了,小记一下,这事还没完。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13365316/viewspace-2127026/
,如需转载,请注明出处,否则将追究法律责任。