막히고 있습니다.. ㅠㅠ 고수님들 좀 도와주세요.
다음의 테이블이 있는데요
posnum | 수량 |
0 | 19 |
1 | 20 |
2 | 20 |
3 | 15 |
4 | 5 |
수량에 들어가는 최대값은 20 입니다.
여기서 10 개의 새 수량을 빈 공간 (0, 3,4)에 비어있는지 확인해서 0 번부터 채워넣어야 하는데요.
즉 여기서 0번에 1개를 더하고
3번에 5개를 더하고
4번에 10개중 0번과 3번에 넣은 6개를 제외한 나머지 4개를 넣어서
posnum | 수량 |
0 | 20 |
1 | 20 |
2 | 20 |
3 | 20 |
4 | 9 |
이런식으로 업데이트 하는 프로시저를 짜야하는데
도저히 뭐부터 시작해야 할지 답이 안나오네요.. ㅠㅠ 좀 도와주세요
CREATE OR REPLACE PROCEDURE p_update(v_cnt NUMBER) IS CURSOR c1 IS SELECT posnum, cnt FROM t WHERE cnt < 20 ORDER BY posnum ; v_in_cnt NUMBER(2) := v_cnt; v_up_cnt NUMBER(2); user_define_error EXCEPTION; BEGIN FOR c IN c1 LOOP IF c.cnt + v_in_cnt > 20 THEN v_up_cnt := 20 - c.cnt; ELSE v_up_cnt := v_in_cnt; END IF; UPDATE t SET cnt = cnt + v_up_cnt WHERE posnum = c.posnum ; v_in_cnt := v_in_cnt - v_up_cnt; EXIT WHEN v_in_cnt <= 0; END LOOP; -- 입력값이 남는 경우 두가지 처리방법 소개 -- -- CASE 1. 사용자 에러 발생 -- -- IF v_in_cnt > 0 THEN -- RAISE user_define_error; -- END IF; -- CASE 2. 신규 데이터 생성 -- -- WHILE v_in_cnt > 0 LOOP -- IF v_in_cnt > 20 THEN -- v_up_cnt := 20; -- ELSE -- v_up_cnt := v_in_cnt; -- END IF; -- INSERT INTO t -- SELECT NVL(MAX(posnum), 0) + 1 -- , v_up_cnt -- FROM t -- ; -- END LOOP; -- COMMIT; EXCEPTION WHEN user_define_error THEN RAISE_APPLICATION_ERROR(-20001, '빈공간에 비해 입력수량이 너무 많습니다.'); END; /