2014-10-26 57 views
0

我寫一個腳本,並得到了一個錯誤,同時節省行值到變量 我嘗試更新,我需要從其他相應的表來獲取表PL/SQL存儲一行到一個變量,並使用他們的循環

DECLARE 
cur SYS_REFCURSOR; 
dept_row department%rowtype; 
employee_row employee%rowtype; 
status number :=0; 
BEGIN 

FOR employee_details IN (select * from employee_details_table) 
LOOP 
select * into dept_row from department dept where employee_details.dept_id = dept.dept_id; 
select * into employee_row from employee emp where emp.dept_id = empoyee_details.dept_id; 

IF employee_details.valid <> employee_row.valid THEN 
// call SP which uses values from both dept_row & employee_row 
END IF; 
END LOOP; 
COMMIT; 
END; 
/

當我運行上面的SQL時出現錯誤。 ORA-01722 ORA-06512

我無法弄清楚上面的代碼有什麼問題。 請幫助

感謝

+0

您正在使用'集合'不正確。此外,最好避免使用for循環,並使用bulk collect和forall語句來儘量減少sql和plsql引擎之間的上下文切換開銷。檢查我的答案。 – 2014-10-26 15:22:30

回答

0

您正在使用collection不正確。此外,最好避免使用loopfor使用bulk collectforall statement減少sql and plsql engines之間的context switch的開銷。

 
DECLARE 
    TYPE t_bulk_collect_test_tab IS TABLE OF employee_table%ROWTYPE; 

    l_tab t_bulk_collect_test_tab; 

    CURSOR c_data IS 
    SELECT * 
    FROM employee_table; 
BEGIN 
    OPEN c_data; 
    LOOP 
    FETCH c_data 
    BULK COLLECT INTO l_tab LIMIT 10000; 
    EXIT WHEN l_tab.count = 0; 

....... 

End; 

有關集合的更多例子,散裝收集和FORALL語句,請參考這裏的例子http://oracle-base.com/articles/9i/bulk-binds-and-record-processing-9i.php

記住,最好避免loopsRow by rowslow by slow

相關問題