2013-01-07 73 views
0

我一直在試圖創建PL/SQL語句來創建動態查詢以獲取動態列。由於我對這些Oracle PL/SQL語句不太瞭解,我對幾件事感到困惑。動態查詢從行中獲取動態列

存儲過程是否必須創建動態查詢?

以下查詢不會引發任何錯誤,甚至不會導致任何結果。我試圖在下面的查詢做的是根據FKBAB_SOURCE_ID這是PFS_SOURCE_ID外鍵得到的FKOD_AMOUNT總和。

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'?

+0

@bluefeet:你能幫助嗎?主持人關閉了我以前的問題。 – hsuk

+0

你可以使用'execute immediate sql_query'來做到這一點。但是你想要結果去哪裏? –

+0

你想要結果去哪裏?我無法在同一頁面上運行獲取結果嗎? – hsuk

回答

1

要得到一個答案(刪除我的評論),這是pl/sql,而不是一個選擇語句,所以你不能只運行它。可以使用INTO子句將結果存儲到某些變量或數組中。

但是你可能使查詢光標,把光標移動到一個管道函數,然後

select * from table(your_pipelined_function) 
+0

你能舉個例子嗎? – hsuk

+0

[http://www.oracle-base.com/articles/misc/pipelined-table-functions.php](http://www.oracle-base.com/articles/misc/pipelined-table-functions.php )[http://www.akadia.com/services/ora_pipe_functions.html](http://www.akadia.com/services/ora_pipe_functions.html)[http://www.adp-gmbh.ch/ora/ PLSQL/exec_immediate.html](http://www.adp-gmbh.ch/ora/plsql/exec_immediate.html) –