2012-11-16 30 views
1

我有通過創建一系列插入語句爲表創建備份的問題。Oracle本地動態SQL PL/SQL語句無開頭和結尾

輸入是表名,每個表可以有不同數量的列。假設數據類型可以是VARCHAR2,數字或日期僅

所以我有這行代碼:

execute immediate fetchStmt; 

其中fetchStmt可以是:

fetch tableColCursor into valuesArray(1), valuesArray(2), ..., valuesArray(n) 

這只是取每個並將其放入varray中,如果語句不在執行immediate語句中,則語句本身也可以工作。

我知道execute immediate只能處理SQL查詢或PL/SQL塊。 問題是我將如何能夠完成這項工作或者可以採取什麼類似的解決方案解決問題?

注意,它不是在編譯時已知的表及其列及其數據類型

+0

:你有一個包含所有DML語句表,如果是的話,你可以嗎?發佈表格或光標的結構? –

回答

2

EXECUTE IMMEDIATE只能過程中充分陳述,I-E:SQL語句或PLSQL塊(與[DECLARE]..BEGIN..END)。

此外,塊執行這樣不會看到從調用塊中的任何變量(他們不共享相同的範圍),例如,這將不起作用:

DECLARE 
    l NUMBER := 1; 
    k NUMBER := 0; 
BEGIN 
    EXECUTE IMMEDIATE 'BEGIN l := k; END;'; 
END; 

上面的代碼會產生錯誤,因爲lk未在子塊中定義。相反,你需要使用的輸入/輸出變量:

DECLARE 
    l NUMBER := 1; 
    k NUMBER := 0; 
BEGIN 
    EXECUTE IMMEDIATE 'BEGIN :P1 := :P2; END;' USING OUT l, k; 
    dbms_output.put_line(l); -- return 0 
END; 

你的情況,你不知道的變量的數目,所以你將無法使用EXECUTE IMMEDIATE。您可以使用DBMS_SQL,但我認爲有更簡單的方法:您可以找到已經工作的代碼(例如它存在於Oracle APEX中),或者您可以通過運行SELECT來編寫它,以生成必要的INSERT字符串。對於這種方法,您將不得不動態生成SQL語句(取決於表列)。該聲明是這樣的(一個表TEST(a,b,c)所有列都是整數[需要適應其他數據類型):

SELECT 'INSERT INTO test(a,b,c) VALUES ('||a||', '||b||', '||c||');' 
    FROM test