如何查看扩展的 TABLE SQL 宏语句

How can I see the Expanded TABLE SQL Macro Statement

我在 Oracle 21c 数据库中创建了一个 TABLE SQL 宏,它使用分组列的参数从一般 table 执行聚合 以及应汇总的列。

使用 Oracle documentation 我终于让它按预期工作(见下面的代码),但我错过了什么以及什么会使 代码开发更容易的是可以看到 扩展的 SQL 文本,这是 TABLE SQL 宏 .

的结果

请注意,简单地查看 GV$SQL 并没有帮助,因为这里是 原始 SQL 语句 ,因为它是使用 SQL 宏.

如果 SQL 宏出现错误,查看扩展文本会更有帮助,因为在这种情况下,您会得到例如这个 异常

ORA-64626: invalid SQL text returned from SQL macro: 
ORA-00936: missing expression

但不知道造成这个问题的SQL text就不好反应了

所以问题是 如何查看 SQL 宏调用 .

的扩展 SQL 语句

我知道,这可以通过一些跟踪(例如 10053)来管理,但这需要我没有的管理员访问权限。

这是SQL宏示例

create or replace function tab_grp(sum_cols  DBMS_TF.COLUMNS_T, t DBMS_TF.Table_t, grp_cols  DBMS_TF.COLUMNS_T)  
  return varchar2 SQL_Macro(TABLE) as
v_sum_list varchar2(4000);
v_grp_list varchar2(4000);
begin
  -- concat the SUM column
 FOR i IN 1 .. sum_cols.count() LOOP
      v_sum_list := v_sum_list || case when i > 1 then ',' end || 'SUM('|| sum_cols(i)|| ') '|| sum_cols(i);
  END LOOP;
  FOR i IN 1 .. grp_cols.count() LOOP
      v_grp_list := v_grp_list || case when i > 1 then ',' end || grp_cols(i);
  END LOOP;
  return 'select '  || v_grp_list || ', ' || v_sum_list ||' , count(*) cnt from t group by '|| v_grp_list ;
end;
/

及其调用(可以在GV$SQL中找到SQL_TEXT

 select * from tab_grp (columns(value), tab, columns(customer_id, product_id));

我想看到的是真正执行的语句,像这样:

select customer_id, product_id, sum(value) value, count(*) cnt
from tab
group by customer_id, product_id

过程 DBMS_UTILITY.EXPAND_SQL_TEXT 将显示应用 SQL 宏后生成的 SQL 语句。

下面是 Marmite's LiveSQL demo 的输出。 expand 过程的输出总是有点神秘,但在 运行 通过代码美化器输出后,结果如下:

SELECT "A1"."CUSTOMER_ID" "CUSTOMER_ID",
       "A1"."PRODUCT_ID"  "PRODUCT_ID",
       "A1"."VALUE"       "VALUE",
       "A1"."CNT"         "CNT"
  FROM (SELECT "A3"."CUSTOMER_ID" "CUSTOMER_ID",
               "A3"."PRODUCT_ID"  "PRODUCT_ID",
               "A3"."VALUE"       "VALUE",
               "A3"."CNT"         "CNT"
          FROM (SELECT "A4"."CUSTOMER_ID" "CUSTOMER_ID",
                       "A4"."PRODUCT_ID" "PRODUCT_ID",
                       SUM("A4"."VALUE") "VALUE",
                       COUNT(*) "CNT"
                  FROM (SELECT "A2"."CUSTOMER_ID" "CUSTOMER_ID",
                               "A2"."PRODUCT_ID"  "PRODUCT_ID",
                               "A2"."VALUE"       "VALUE"
                          FROM "SQL_NTOIZUWOYDICAPPIYTUZKZBNM"."TAB" "A2") "A4"
                 GROUP BY "A4"."CUSTOMER_ID", "A4"."PRODUCT_ID") "A3") "A1"