2014-10-02 59 views
0

我正在使用Oracle存儲過程。For循環與存儲過程中的表名稱

我的要求是低於

IF variable1 := 'true" 
THEN 
    tableName=abr 
ELSE 
    tableName=mvr 
END IF; 

    FOR i IN (select unique(row1) as sc from tableName t where t.row2 = 'name') LOOP 
    BEGIN 
     -- required Logic 
    END 
    END LOOP; 

但在這裏我不能在表名參數傳遞的表名。怎麼做?

+0

是什麼ROW1數據類型? – Aramillo 2014-10-02 16:42:39

回答

-1

你將不得不爲每個表格建立for循環,然後使用你的邏輯來確定你將執行哪個循環。

+0

嗨,循環非常大,如果我重複循環,那麼代碼冗餘度會很高。 – Shyam534 2014-10-02 15:21:18

+0

好吧,然後嘗試將您的選擇如下所示:
''select unique(row1)as sc from'|| tableName || 「哪裏...' – mmmmmpie 2014-10-02 15:34:15

2

您需要使用Execute Immediate - 它設計用於在運行時間之前不知道的操作。

對於正常的操作,Oracle必須在編譯時知道表和列。你不能做SELECT * FROM tableName,因爲它不知道tableName是什麼,因此它不能被正確編譯。

相反,你可以做EXECUTE IMMEDIATE 'SELECT * FROM ' || tableName;

您可以選擇您的結果INTO一個變量,循環結果集,或者BULK COLLECT到結構,然後重複這一點。

對於一個簡單的選擇之中,你可以這樣做:

EXECUTE IMMEDIATE 'SELECT COL1, COL2 FROM ' || tableName INTO V_COL1, V_COL2

V_COL1 & V_COL2只是局部變量,tablename是代表你的表名的字符串,並COL2和COL2是表中的列你正在選擇。您可以使用類似ALL_TAB_COLUMNS的動態獲取表格的結構。

下面是從Oracle文檔的例子:

CREATE OR REPLACE PROCEDURE query_invoice(
     month VARCHAR2, 
     year VARCHAR2) IS 
    TYPE cur_typ IS REF CURSOR; 
    c cur_typ; 
    query_str VARCHAR2(200); 
    inv_num NUMBER; 
    inv_cust VARCHAR2(20); 
    inv_amt NUMBER; 
BEGIN 
    query_str := 'SELECT num, cust, amt FROM inv_' || month ||'_'|| year 
     || ' WHERE invnum = :id'; 
    OPEN c FOR query_str USING inv_num; 
    LOOP 
     FETCH c INTO inv_num, inv_cust, inv_amt; 
     EXIT WHEN c%NOTFOUND; 
     -- process row here 
    END LOOP; 
    CLOSE c; 
END; 
/

http://docs.oracle.com/cd/B12037_01/appdev.101/b10795/adfns_dy.htm