2013-10-14 53 views
2

請幫我解決問題,下面我面對,我必須將數據插入到內FORALL一個表(使用變量值和表已經創建genereted表名)..在FORALL語句執行即時編譯問題

Declare 
TYPE dept_data_rec IS RECORD 
(
    Dept_no number, 
    Dept_name varchar2(100), 
    Dept_loc Varchar2(20) 
); 

TYPE nt_dept_data IS TABLE OF dept_data_rec ; 

l_dept_data_nt nt_dept_data; 

BEGIN 

FORALL j IN 1..l_dept_data_nt.COUNT SAVE EXCEPTIONS 
EXECUTE IMMEDIATE 'INSERT INTO '||l_get_dept_rec.dept_seq_no||'_Dept_Data VALUES '|| 
l_dept_data_nt(j); 
COMMIT; 

編譯此代碼時,我收到以下錯誤: PLS-00306:調用'||'時參數的數量或類型錯誤

然而,當使用實際的表名的代碼它的工作原理

FORALL j IN 1..l_dept_data_nt.COUNT SAVE EXCEPTIONS 
INSERT INTO A1_dept_data VALUES 
l_dept_data_nt(j); 
COMMIT; 
+0

沒錯。 'l_dept_data_nt(j)'是行類型或記錄類型;你只能連接一個字符串,或者可以轉換成字符串的東西。我不認爲你可以使用綁定變量來做到這一點,即使它被定義爲'%rowtype',但我不是100%確定的。您可能需要查看'dbms_sql'。有人可能有一個更好的主意,雖然* 8-) –

+0

謝謝..我覺得問題是與l_dept_data_nt(j),我想下面以及同樣的錯誤消息來了。 EXECUTE IMMEDIATE'INSERT INTO A1_dept_DATA VALUES'|| l_dept_data_nt(j); – user1717270

+0

請提供'l_dept_data_nt'的聲明。似乎是一個集合。問題是標量或複合數據類型集合的元素是什麼? –

回答

1

的Oracle 10g -

在Oracle版本11克之前,您不能使用FORALLEXECUTE IMMEDIATE,只有INSERTUPDATEDELETE

http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems021.htm

這是一個特殊的語法

  1. 讀取像一個FOR循環,但也沒有了,
  2. 是使用PL/SQL進行膨體DML操作,只有用確切的關鍵字,而不是動態SQL或任何其他代碼。

的Oracle 11g +

在11g,使用EXECUTE IMMEDIATE的限制被解除。請參閱http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/forall_statement.htm

但是,字符串中允許的唯一變量是來自USING子句中單個數組的下標元素。

該文檔尚不清楚您是否可以使用FORALL語法動態「更改」每行的表。請記住,PL/SQL使用FORALL來執行批量DML操作,並且需要使用一個表來獲得任何性能優勢。對於上述問題

最佳性能溶液你應該陣列的兩個級別,所述第一定義哪些表和第二定義該表中的數據。

在表格數組中使用普通的FOR循環,並在該循環內部使用特殊的FORALL語法爲該表執行所有DML。

+0

文檔不清楚單表限制是否實際執行,或者是否靜靜地導致性能下降! –