oracle中的行到列

时间:2018-10-14 05:19:44

标签: sql oracle

我有两个结果集的情况,我需要将它们合并为一个结果集。 多次尝试各种查询以获取所需的输出却很累,但失败了。

这些是结果集。

select drc.rc_column_name from dyna_report_columns drc;

Column Names

select * from REPORT1;

enter image description here

我想做的是将rc_column_name的结果作为一行插入到下一个结果集。

类似的东西。 enter image description here

1 个答案:

答案 0 :(得分:2)

  

我正在计划动态化报告”

您想要一个可以处理任意数量列的解决方案。因此,您不能通过常规查询来执行此操作。您需要使用动态SQL即时组装投影。

这意味着执行动态SQL语句并返回弱引用游标的存储过程或函数。同样,它必须是ref游标,因为那是唯一可以处理可变投影的构造。引用游标与JDBC ResultSet和ODBC ResultSet兼容,并且与大多数常见的前端编程语言等效。

这是一个使用您发布的表的函数:

create or replace function get_any_report return sys_refcursor
is
    stmt varchar2(32767);
    rc sys_refcursor;
begin
    select 'select 1 as row_type, ' || 
            listagg(''''||rc_column_name||''' as col'||trim(to_char(rc_seq)), ',') within group (order by rc_seq)
            ||' from dual'
    ||' union all   
    select 2  as row_type, r1.*
    from report1 r1
    order by 1, 2'
    into stmt        
    from dyna_report_columns ;
    dbms_output.put_line(stmt);

    open rc for stmt;

    return rc;
end;
/

在ORDER BY子句中引用了另外一列row_type,以确保标题行是结果集的第一行。


这里是an Oracle LiveSQL Demo。抱歉,您需要一个免费的Oracle帐户来运行此帐户,但是SQL Fiddle目前有点不稳定。


这里是a SQL Fiddle version of the demo,但是Fiddle不支持DBMS_OUTPUT。