动态查询以从行获取动态列

时间:2013-01-07 06:22:41

标签: oracle plsql oracle10g

我一直在尝试创建PL / SQL语句,以创建动态查询以获取动态列。因为我对这些Oracle PL / SQL语句不太了解;我对一些事感到困惑。

是否必须拥有用于创建动态查询的存储过程?

以下查询不会抛出任何错误,甚至不会产生任何结果。我在以下查询中尝试执行的操作是根据 FKBAB_SOURCE_ID 获取 FKOD_AMOUNT 的总和,这是 PFS_SOURCE_ID 的外键。

    declare
    sql_query varchar2(3000) := 'select FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
    begin
        for x in (select distinct PFS_SOURCE_ID,PFS_SOURCE_ENG from PBS_FC_SOURCE WHERE PFS_UPPER_SOURCE_ID!=0 )
        loop
            sql_query := sql_query ||
                ' , sum(case when FKBAB_SOURCE_ID = '||x.PFS_SOURCE_ID||' then FKOD_AMOUNT ELSE 0 end) as '||x.PFS_SOURCE_ENG;
                dbms_output.put_line(sql_query);
        end loop;
        sql_query := sql_query || ' FROM FMS_K_OFFICEWISE_DTL
        JOIN FMS_K_OFFICEWISE_MST ON FMS_K_OFFICEWISE_MST.FKOM_OFFICE_MST_ID=FMS_K_OFFICEWISE_DTL.FKOD_OFFICE_MST_ID
        JOIN FMS_K_BUDGET_ALLOCATION_DTL ON FMS_K_BUDGET_ALLOCATION_DTL.FKBAD_BUDGET_ALLOC_DTL_ID=FMS_K_OFFICEWISE_DTL.FKOD_BUDGET_ALLOC_AD_ID
        JOIN FMS_K_BUDGET_ALLOCATION_MST ON FMS_K_BUDGET_ALLOCATION_MST.FKBAM_BUDGET_ALLOC_ID=FMS_K_BUDGET_ALLOCATION_DTL.FKBAB_BUDGET_ALLOC_ID
        JOIN PBS_FC_BUDGET ON PBS_FC_BUDGET.PFB_BUDGET_ID=FMS_K_BUDGET_ALLOCATION_MST.FKBAM_BUDGET_ID
        GROUP BY FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
        dbms_output.put_line(sql_query);
    end;

如何执行'sql_query'?

1 个答案:

答案 0 :(得分:1)

要得到答案(删除我的评论),这是pl / sql,而不是select语句,所以你不能只运行它。

使用execute immediate,您可以使用INTO子句将结果存储到某些变量或数组中。

但是你可以将查询作为游标,将光标放入流水线函数然后

select * from table(your_pipelined_function)