由于您事先不知道结构,因为动态枢轴到结果集中未知数量的列,您可以使用引用游标来检索动态查询的结果。
这使用 SQL*Plus/SQL Developer/SQLcl 绑定变量;
variable rc refcursor;
declare
sql_stmt clob;
pivot_clause clob;
begin
select listagg('''' || TO_CHAR(PERIOD_NAME,'MON-YY') || ''' as "' || TO_CHAR(PERIOD_NAME,'MON-YY') || '"', ',')
within group (order by PERIOD_NAME)
into pivot_clause from (select TO_DATE(PERIOD_NAME,'MON-YYYY') PERIOD_NAME
from table1
where request_id=<id>
GROUP BY TO_DATE(PERIOD_NAME,'MON-YYYY')
order by TO_DATE(PERIOD_NAME,'MON-YYYY') ASC);
sql_stmt := 'select * from (select PERIOD_NAME, depreciation
from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))';
open :rc for sql_stmt;
end;
/
print rc
client variable command
variable rc refcursor;
将客户端绑定变量的变量和数据类型声明为引用游标。然后,而不是使用 execute immediate 它在您的动态语句中使用 open for:
open :rc for sql_stmt;
打开带有该查询结果的引用游标。 (注意:rc 开头的:,表示这是一个绑定变量引用而不是本地PL/SQL 变量)。
然后在块外你可以print结果集:
print rc
不同的客户端/IDE 需要不同的语法。你也可以通过 JDBC 做类似的事情。您还可以有一个返回sys_refcursor 的函数。但这取决于您的最终目标是什么。
顺便说一句,目前您将获得所有透视总数的 null ;您的最终查询需要以与 pivot 子句相同的格式获取 PERIOD_NAME,例如
sql_stmt := 'select * from (select to_char(to_date(PERIOD_NAME, ''MON-YYYY''), ''MON-YY'') as PERIOD_NAME, depreciation
from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))';
虽然将原始格式保留在枢轴子句中会稍微简单一些:
declare
sql_stmt clob;
pivot_clause clob;
begin
select listagg('''' || PERIOD_NAME || ''' as "' || TO_CHAR(PERIOD_DATE,'MON-YY') || '"', ',')
within group (order by PERIOD_DATE)
into pivot_clause from (select distinct PERIOD_NAME, TO_DATE(PERIOD_NAME,'MON-YYYY') PERIOD_DATE
from table1
where request_id=<id>);
sql_stmt := 'select * from (select PERIOD_NAME, depreciation
from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))';
open :rc for sql_stmt;
end;
/
使用虚拟表和数据:
create table table1 (request_id, period_name, depreciation) as
select 1, 'JAN-2018', 42 from dual
union all select 1, 'FEB-2018', 11 from dual
union all select 1, 'MAR-2018', 22 from dual
union all select 1, 'MAR-2018', 33 from dual
union all select 2, 'MAR-2018', 44 from dual;
运行任一版本并执行print rc 显示:
JAN-18 FEB-18 MAR-18
---------- ---------- ----------
42 11 99