暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在pl/sql函数中获取调用where子句或select语句

askTom 2018-08-29
328

问题描述

你好!

有没有一种方法来获取调用pl/sql函数或其where子句的select语句?

例如,如果调用是:

从其中field2 = “测试” 的表中选择customFunction (参数) 作为FuncResult,field1

Is it possible to retrive either the complete select statement (从其中field2 = “测试” 的表中选择customFunction (参数) 作为FuncResult,field1) or the where clause (field2 = 'test') in the pl/sql code of customFunction() ?

正如您可能已经扣除的那样,我不控制/构建where子句。另一个软件 (呼叫者) 正在执行此操作,因此我无法更改/更改它。

谢谢


专家解答

据我所知没有。这里有一点catch-22,因为要探测该SQL,我们必须 * 运行 * SQL,当然,这将成为当前正在运行的SQL,例如

SQL> create or replace
  2  function blah(c int) return int is
  3    l_sql_id1 varchar2(30);
  4    l_sql_id2 varchar2(30);
  5    l_sql_text varchar2(1000);
  6  begin
  7    select sql_id, prev_sql_id
  8    into   l_sql_id1, l_sql_id2
  9    from   v$session
 10    where  sid = sys_context('USERENV','SID');
 11
 12    dbms_output.put_line(l_sql_id1);
 13    dbms_output.put_line(l_sql_id2);
 14
 15    return c;
 16  end;
 17  /

Function created.

SQL>
SQL> set serverout on
SQL> select blah(10) from dual;

  BLAH(10)
----------
        10

fu3ng5ux16xn2
5t10uu7v11s5t
SQL> select sql_id, sql_text
  2  from   v$sql
  3  where  sql_id in
  4  ( 'fu3ng5ux16xn2','5t10uu7v11s5t');

SQL_ID        SQL_TEXT
------------- ----------------------------------------------------------------
5t10uu7v11s5t BEGIN DBMS_OUTPUT.ENABLE(NULL); END;
fu3ng5ux16xn2 SELECT SQL_ID, PREV_SQL_ID FROM V$SESSION WHERE SID = SYS_CONTEX
              T('USERENV','SID')




您是否在运行时 (即在函数内) 需要它,或者您只是试图检测过多的调用等。您可以对v $ sqlstats进行一些数据挖掘,以检测执行、处理的行等

即使你 * 可以 * 拿起它,我会担心,因为你通常不想积极地查询v $ 结构,所以即使我上面的例子不会很好,如果你做 (说)

从all_objects中选择blah(object_id);

因为我在一次通话中会粉碎v $ session数万次。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论