您需要使用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
來源
2014-10-02 17:26:16
JBC
是什麼ROW1數據類型? – Aramillo 2014-10-02 16:42:39