2014-04-07 4 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

예. department_id = id 대신 employee_id = id를 사용했다면 프로 시저가 value를 반환했을 것입니다. 하지만 특정 부서의 급여를 늘리려면 어떻게해야합니까? – 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; 

지금, 분할 일까지이 방법은 다른 세션이 될 가능성을 소개하지 첫 번째 SELECTUPDATE 사이의 데이터를 수정하면 다중 사용자 환경에서 사용하는 것이 안전하지 않습니다. 물론, 당신이 정말로 서로에게 직접적으로 관련 될 것이라는 것을 이미 알고 있기 때문에, 당신은 처음에 오래된 연봉과 새로운 연봉을 모두 반환하기를 원하지 않을 것입니다. 새 급여의 징표 만 반환하면 UPDATE 문 하나만 필요하므로 경쟁 조건이 없습니다.

+0

동일한 작업을 수행했지만 레코드 및 커서를 사용했습니다. 하지만 프로세스가 훨씬 쉽습니다. – user2788235

관련 문제