【问题标题】:Executed SQL query not appearing in V$SQL执行的 SQL 查询未出现在 V$SQL 中
【发布时间】:2021-05-11 04:28:27
【问题描述】:

我有下面的匿名语句运行成功

set serveroutput on
declare

    l_certificate_number number;

BEGIN
  SELECT MAX(certificate_number)
  INTO   l_certificate_number
  FROM   xx_tbl
  WHERE  pnd_type_code = 1
  AND    establishment_id = 1
  AND    period_name = 1;

  dbms_output.put_line('Generate Certificate num ' ||to_char(l_certificate_number));
  
EXCEPTION
    WHEN no_data_found THEN
        l_certificate_number := 0;
        dbms_output.put_line('Generate Certificate num ' ||to_char(l_certificate_number));
END;

并成功显示输出:

Generate Certificate num 1

PL/SQL procedure successfully completed.

我想查找 SQL_ID,但它没有出现在以下任何查询中:

select  *
from    v$sql
where   sql_text like '%SELECT MAX(certificate_number)%';            

select  *
from    v$sqlarea
where   sql_text like '%SELECT MAX(certificate_number)%';            

select  *
from    dba_hist_sqltext 
where   sql_text like '%SELECT MAX(certificate_number)%';            

我很确定语句已执行,因为输出已显示。

我已经在Recently executed SQL not in V$SQL 中尝试过解决方案,但在GV$SQL 中也找不到它

知道在哪里可以找到 SQL_ID 吗?

【问题讨论】:

  • 你展示的PL/SQL不好,没有';'在选择结束时...您是在寻找 SELECT 的 sql_id 还是完整的 PL/SQL 的 sql_id?
  • 在从数据字典视图发出这些查询之前,可能有人或某些自动化系统(例如调度程序或作业刷新共享池)...
  • @gsalem 谢谢你。我现在已经添加了。

标签: sql oracle plsql


【解决方案1】:

PL/SQL 块中的 SQL 语句在执行并存储在 GV$SQL 中之前会进行转换。您必须搜索转换后的查询并考虑文本更改的以下方式:

  1. 大小写 语句转换为大写,文字除外。
  2. 空白 连续的空白被组合成一个空格。
  3. INTO 删除了INTOBULK COLLECT INTO 部分。
  4. 绑定变量 在 SQL 语句中使用的 PL/SQL 变量将被转换成类似:B1 的东西。

您的查询已经避免了问题 #2、#3 和 #4,因为它只是在寻找没有绑定变量的代码的小 sn-p。由于大小写是唯一的问题,添加 LOWERUPPER 应该会返回结果:

select *
  from gv$sql
 where lower(sql_text) like lower('%SELECT MAX(certificate_number)%')
       --Only include SELECT statements and not the PL/SQL block.
   and command_type = 3
       --Prevent this query from returning itself.
   and sql_text not like '%QUINE%';

GV$SQL 查询时可能会发生许多奇怪的问题。由于不同的实例、执行计划和其他原因,查询可能会出现多次。并且查询将过期或可能由alter system flush shared_pool; 手动删除。

如果您需要将查询存储在共享池中,您可以使用EXECUTE IMMEDIATE 运行该语句。

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多