2013-01-08 152 views
1

我是新來的這些oracle動態查詢,我只是試圖建立一個動態查詢,所以我可以根據它獲取記錄。oracle動態查詢

這裏是我的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; 

如何從這個上面的說法得到記錄,因爲我希望查詢似乎罰款?

回答

2

其中一種可能性是使用引用遊標 - 您將構建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再加上裁判光標:

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中更加強大,因爲你可以

  • 使用CLOB作爲SQL語句(從而允許您動態生成任意長度的查詢)
  • 將引用遊標轉換爲DBMS_SQL遊標(反之亦然),如果您需要獲取更多的靈活性列數和列類型在運行時
+0

感謝您的幫助,但我不明白你的解釋。我使用Toad作爲Oracle客戶端。我不能簡單地運行生成的動態SQL並獲取記錄嗎?是否必須使用光標? – hsuk

+0

我已經通過存儲過程使用引用遊標查看了記錄,對這些我沒有太多的瞭解,但是隻有Toad,我無法從服務器端PHP獲取這些記錄。 http://stackoverflow.com/questions/14208698/oracle-stored-procedure-passing-cursor-variable – hsuk

+0

當然,如果您只想「手動」檢查結果,則可以在TOAD中手動運行生成的SQL語句而不使用參考光標方法。 –