oracle trigger 질문입니다. 0 4 2,204

by 오재민 [2012.11.27 14:57:52]



디비 이제 시작하는 초짜입니다..ㅜㅜ공부 중인데요..

create or replace
trigger setorderlineprice before insert on order_line
for each row

declare
i_productnumber int := :new.productnumber;
i_count int := :new.numberofproduct;
i_price int;
i_ordernumber int := :new.ordernumber;

i_customerid varchar(12) := 'S9';
i_workerid varchar(10);

row_count int := 0;
begin

select productprice into i_price
from product
where productnumber = i_productnumber;

:new.price := i_price * i_count;

select count(*) into row_count
from purchase_order
where purchase_order.ordernumber = i_ordernumber;

if row_count = 0 then

select workerid into i_workerid
from employee
where employee.departmentname = '주문';

insert into purchase_order(ordernumber, orderdate, customerid, workerid, totalprice)
values(i_ordernumber, sysdate, i_customerid, i_workerid, :new.price);

else

update purchase_order
set totalprice = (totalprice + i_price)
where purchase_order.ordernumber = i_ordernumber;

end if;

end;

위 코드는 order_line 테이블에 행 한줄 삽입하기 전에 price 값을 product 테이블의 productnumber에 해당하는 가격을 가지고 와서 numberofproduct랑 곱해줘서 그 값을 price에 넣어주고
purchase_order테이블에 현재 삽입을 시도하는 ordernumber랑 같은행이 있는지 알아보고 같은놈이 없으면 purchase_order 테이블에 행은 한줄 삽입해주고 같은 ordernumber를 가진 행이 있으면 purchase_order 테이블의 totalprice속성의 값을 update해주는 before insert 트리거인데
오류가 나네요ㅣㅣ..ㅠㅠ

아래는 시퀄문과 오류보고 인데 뭐가 잘못되엇나요..ㅜㅜ

명령의 1 행에서 시작하는 중 오류 발생:
declare

i_ordernumber int := purchase_order_seq.NEXTVAL;

begin

insert into order_line(ordernumber, orderlinenumber, productnumber, price, numberofproduct)
values(i_ordernumber, 1, 1221000001, 0, 3);

end;
오류 보고:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "HR.SETORDERLINEPRICE", line 25
ORA-04088: error during execution of trigger 'HR.SETORDERLINEPRICE'
ORA-06512: at line 7
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested


그리고 현재 purchase_order테이블에 한 행도 없는 상태인데 왜 더 많은 요청이 넘어왔는지 이해가 안되네요..ㅜㅜ

by 마농 [2012.11.27 15:16:28]
select workerid
into i_workerid
from employee
where employee.departmentname = '주문'
;
이 문장이 문제인듯 보입니다.
주문부서에 근무하는 직원이 달랑 한명은 아니겠지요?
Select Into 절의 조회 결과는 반드시 1건이어야 합니다.

by 오재민 [2012.11.27 15:24:32]

네 당연히 주문부서에 일하는 인원은 여러명있습니다.ㅜ

by 오재민 [2012.11.27 15:38:08]
아.......그러면 주문부서에서 일하는 사람중 아무나 한명의 아이디가 필요하면 어떻게 해야 하나요?

by 마농 [2012.11.27 15:55:28]
AND ROWNUM = 1
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입