2013-12-16 71 views
0

我試圖重構一段代碼。我們在表和視圖上做了類似的選擇,我想在過程中導出select,並使用表名作爲輸入參數。因此,例如:PL/SQL:我可以直接在select語句中使用過程輸入嗎?

procedure show_table (
    i_table_name varchar2 
) 
is 
begin 
    for c in (
    select * 
    from i_table_name 
) loop 
    ... 
    end loop; 
end; 

但是PL/SQL認爲i_table_name是文字名稱(拋出PL/SQL:ORA-00942:表或視圖不存在)。有沒有辦法評估變量的內容?我想我可以立即執行,但我寧願不要:)

乾杯。

+1

這可能是有益的http://stackoverflow.com/questions/15184015/oracle-procedure-using-cursor中的動態查詢 –

+0

如果您不想動態聲明遊標,則可以聲明兩個遊標並根據參數值選擇要打開的遊標;取決於你是否擔心重複選擇或循環內的代碼重複? –

+0

@AlexPoole我想避免循環內的重複代碼,因爲選擇將會不同。 –

回答

3

一種可能的方法是使用一個參考遊標(這裏假設你的觀點有完全相同相同的列表):

create table test_tab(pk number, value varchar2(30)); 
insert into test_tab values (1, 'hello'); 
create view test_view as select pk, value || '_view' as value from test_tab; 

declare 
    procedure show_table(i_table_name varchar2) is 
    cur sys_refcursor; 
    rec test_tab%rowtype; 
    begin 
    open cur for 'select * from ' || i_table_name; 
    loop 
     fetch cur into rec; 
     exit when cur%notfound; 
     dbms_output.put_line(rec.pk ||' ' || rec.value); 
    end loop; 
    end; 
begin 
    show_table('TEST_TAB'); 
    show_table('TEST_VIEW'); 
end; 
+0

我想我無法避免動態查詢,據我所知。謝謝您的幫助 :) –

相關問題