如何查看扩展的 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"
我在 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"