1

私はこれらのオラクルの動的クエリを初めて使用します。動的クエリを作成しようとしているだけなので、それに応じてレコードを取得できます。

これが私の 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;

クエリがうまくいくことを願っているので、この上記のステートメントからレコードを取得するにはどうすればよいですか?

4

1 に答える 1

2

可能性の 1 つは、ref カーソルを使用することです。SQL ステートメントを作成し、後でこのステートメントの ref カーソルを開きます。

簡略化:

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 カーソルに変換する (およびその逆)。これにより、実行時に列数と列型を取得する必要がある場合の柔軟性が大幅に向上します。
于 2013-01-08T07:21:30.357 に答える