甲骨文动态查询(oracle dynamic queries)

2019-10-17 13:17发布

我是新与这些预言动态查询,我只是想建立一个动态查询,这样我就可以根据它获得的记录。

这里是我的PL / SQL语句:

declare
sql_query varchar2(5000) := '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 ORDER BY PFS_SOURCE_ID ASC )
loop
    sql_query := sql_query ||
        ' , nvl(sum(case when FKBAB_SOURCE_ID = '||x.PFS_SOURCE_ID||' then FKOD_AMOUNT ELSE 0 end),0) as source_'||x.PFS_SOURCE_ID;
        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    
WHERE PFB_LEVEL_ID=2 GROUP BY FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
dbms_output.put_line(sql_query);
end;

如何从这个上面的说法得到记录,因为我希望查询似乎罚款?

Answer 1:

一种可能性是使用REF游标 - 你建立你的SQL语句,并打开这一说法裁判光标之后。

简化:

declare
  l_cursor sys_refcursor;
  sql_query varchar2(4000);
begin
  sql_query := 'select 1 as value from dual';
  open l_cursor for sql_query;
end;

根据您的IDE /宿主语言,然后你可以遍历光标等。

例如,要打印在SQL Plus中的Ref光标:

variable x refcursor
set autoprint on
declare
  sql_query varchar2(4000);
begin
  sql_query := 'select 1 as value from dual';
  open :x for sql_query;
end;

这个概念甚至在11g中更加强大,因为你可以

  • 使用SQL语句中的CLOB(从而使您可以动态生成任意长度的查询)
  • 转换REF光标到DBMS_SQL光标(反之亦然),如果你需要在运行时获取的列数和列类型,让你更大的灵活性


文章来源: oracle dynamic queries