pl/sql过程/函数,动态显示来自不同表的数据以及第一个数据行中的列名

wj8zmpe1  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(273)

我有如下要求。
有70个表,我必须根据某些条件从这70个不同的表中构建70个查询。
假设表名为tab_1、tab_2、tab_3….、tab_70。每个表中的列数和列的数据类型不同。我将获得用户输入,并且必须将该值传递给oraclepl/sql函数或过程 GET_RESULT() 并以表格格式获取输出(与运行查询时获得的结果相同)。
另外,我必须在第一个数据行中显示列名。
例子:
我要两张table,第一张和第二张。
表1
ID Quarter Risk 00001 Q0 2 00001 Q1 3 00001 Q2 1 00001 Q3 1 00001 Q4 2 表2
ID Status 00001 ACTIVE 00002 PURGED 00003 ACTIVE 00004 ACTIVE 如果我得到用户输入1,我会把它传递给一个过程的参数, GET_RESULTS(1) 得到如下输出: Col1 Col2 Col3 ID Quarter Risk 00001 Q0 2 00001 Q1 3 00001 Q2 1 00001 Q3 1 00001 Q4 2 如果 GET_RESULTS(2) 然后:
Col1 Col2 ID STATUS 00001 ACTIVE 00002 PURGED 00003 ACTIVE 00004 ACTIVE 有人能帮忙吗?

rqmkfv5c

rqmkfv5c1#

使用数据字典构建选择正确列的sql语句。使用动态sql打开该语句的refcursor,并从函数返回游标。

示例架构

create table tab_1 as
select '00001' id, 'Q0' quarter, 2 risk from dual union all
select '00001' id, 'Q1' quarter, 3 risk from dual union all
select '00001' id, 'Q2' quarter, 1 risk from dual union all
select '00001' id, 'Q3' quarter, 1 risk from dual union all
select '00001' id, 'Q4' quarter, 2 risk from dual;

create table tab_2 as
select '00001' id, 'ACTIVE' status from dual union all
select '00002' id, 'PURGED' status from dual union all
select '00003' id, 'ACTIVE' status from dual union all
select '00004' id, 'ACTIVE' status from dual;

功能

create or replace function get_results(p_id number) return sys_refcursor is
    v_sql varchar2(32767);
    v_refcursor sys_refcursor;
begin
    --Get SQL statement.
    select
        'select ' || 
        listagg(column_name, ',') within group (order by column_id) ||
        ' from ' || table_name
    into v_sql
    from user_tab_columns
    where table_name = 'TAB_' || p_id
        and column_id <= 2
    group by table_name;

    open v_refcursor for v_sql;

    return v_refcursor;
end;
/

调用函数

只要应用程序理解refcursors,函数就应该工作。下面是sql*plus最新版本中的一个示例:

SQL> select get_results(1) from dual;

GET_RESULTS(1)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ID    QU
----- --
00001 Q0
00001 Q1
00001 Q2
00001 Q3
00001 Q4

相关问题