2014-10-02 46 views
0
DECLARE 
L_DEPT_ID employees_test_1.department_id%type; 
L_DEPT_NAME VARCHAR(255) := '&2'; 
columns_updated VARCHAR(255) := 'My check is hopes'; 

CURSOR CHECK_1 
IS 
SELECT first_name, last_name, job_id, salary, manager_id, department_id, COMMENTS_RESTORE 
from employees_test_1 
where salary > 1000 
and department_id=L_DEPT_ID; 

BEGIN 

SELECT department_id 
INTO L_DEPT_ID 
FROM DEPARTMENTS 
WHERE DEPARTMENT_NAME=L_DEPT_NAME; 



FOR C1 IN CHECK_1 
LOOP 
UPDATE employees_test_1 BRD 
SET BRD.COMMENTS_RESTORE=columns_updated 
WHERE BRD.first_name=C1.first_name 
AND BRD.salary=C1.salary 
AND BRD.last_name=C1.last_name; 
COMMIT; 
END LOOP; 
END; 

嗨我只更新此查詢中的一列。但是它花費了很多時間。你能建議我可以調整的地方 - 這個查詢。如何使用批量採集替換此光標的循環

回答

3

你不需要批量收集在這裏,只是一個JOIN子查詢。

UPDATE employees_test_1 BRD 
SET BRD.COMMENTS_RESTORE=columns_updated 
WHERE EXISTS (
    SELECT 1 
    FROM employees_test_1 ET1 
    INNER JOIN DEPARTMENTS D ON ET1.department_id = ET1.department_id 
    WHERE D.DEPARTMENT_NAME = L_DEPT_NAME 
    AND ET1.first_name = BRD.first_name 
    AND ET1.salary = BRD.salary 
    AND ET1.last_name = BRD.last_name 
) 

你還在做字符串一堆比較,有一個自引用的子查詢,所以這將是一個耗時的操作......但這應該是比快一點光標。

編輯:通過BULK操作添加替代方式做到這一點。這裏假設你有在employees_test_1表

DECLARE 
TYPE employee_block IS RECORD (first_name VARCHAR2(50), salary NUMBER, last_name VARCHAR2(50); 
TYPE employee_ids_t IS TABLE OF employee_block 
l_employees employee_ids_t; 

SELECT et.first_name, et.salary, et.last_name 
BULK COLLECT INTO l_employees 
FROM employees_test_1 et 
INNER JOIN DEPARTMENTS D ON D.department_id = et.department_id 
WHERE D.DEPARTMENT_NAME = L_DEPT_NAME 
AND salary > 1000; 

FORALL indx IN 1..l_employees.COUNT 
UPDATE employees_test_1 BRD 
SET BRD.COMMENTS_RESTORE = columns_updated 
WHERE BRD.first_name = l_employees(indx).first_name 
AND BRD.salary = l_employees(indx).salary 
AND BRD.last_name = l_employees(indx).last_name; 

沒有測試此主鍵列,所以語法可能是觸摸過......這裏是一個很好的參考,爲您排憂解難。 http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

+0

嗨,謝謝你知道我的意思是如何編寫批量更新語句,我實際上已經與它的語法混淆了。在聲明部分,聲明完成後就像'是'的表格。我不明白這是什麼意思實際上 – user2647888 2014-10-02 15:15:17

+1

的更新,你會使用FORALL。這裏是一篇很好的文章,介紹它的工作原理以及如何使用它:http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html我會稍微介紹一下如何在我的答案工作,給我一分鐘 – guildsbounty 2014-10-02 15:23:23

+1

好的觀點,但你不能在plsql塊中創建對象類型,而是我建議你使用這樣的記錄:'TYPE employee_block是RECORD(first_name VARCHAR2( 50),工資NUMBER,姓氏VARCHAR2(50);' – Aramillo 2014-10-02 16:12:42