2014-04-07 31 views
0

我已經創建了一個過程。它給出了一個錯誤(ORA-01422:確切的提取返回比請求的行數多)。至於具體的department_id,有多個員工。但如何解決這個問題?PL/SQL:執行過程

Create Procedure PP1 
(ID in number, Percent in number, Sal out number, increase_sal out number) IS  
Begin 
Select salary, salary *(1+percent/100) into sal, increase_sal  
From employees  
where department_id= id;  
DBMS_OUTPUT.PUT_LINE (sal || ' ' || increase_sal);  
END;  
/ 

Variable a number 
Variable b number 
Exec PP1 (100, 10, :a, :b) 
Print a b 

感謝, Kuntal羅伊

+0

你期望你的輸出是什麼?一個變量一次只能保存一個值,所以你不能執行返回多行的'select ... into ...'。 – GriffeyDog

+0

是的。如果我將使用employee_id = id而不是department_id = id,則該過程將返回值。 但是如果我想增加特定部門的工資怎麼做? – user2788235

+0

正確,那麼當您使用'department_id'代替時,您希望'a'和'b'的值從您的過程中出來?你想達到什麼目的? – GriffeyDog

回答

1

我的猜測是,你想要的東西,像(未經測試)

CREATE TYPE num_tbl IS TABLE OF NUMBER; 

CREATE PROCEDURE raise_dept_salaries(p_dept_id IN employees.department_id%type, 
             p_raise_pct IN NUMBER, 
             p_old_sals OUT num_tbl, 
             p_new_sals OUT num_tbl) 
AS 
BEGIN 
    SELECT salary 
    BULK COLLECT INTO p_old_sals 
    FROM employees 
    WHERE department_id = p_dept_id; 

    UPDATE employees 
     SET salary = salary * (1 + p_raise_pct) 
    WHERE department_id = p_dept_id 
RETURNING salary 
    BULK COLLECT INTO p_new_sals; 
END; 

現在,分裂的事情了這種方式確實引入的可能性,一些其他的會議會修改您的第一個SELECT和您的UPDATE之間的數據,因此這在多用戶環境中使用並不安全。當然,因爲你已經知道他們將會直接相關,所以你真的不希望返回新舊薪水。如果你只返回新薪水的收集,那麼你只需要一個UPDATE聲明,你就不會有競爭條件。

+0

我已經做了同樣的事情,但通過使用記錄和光標。 但是你的過程要容易得多 – user2788235