된장님이 답변해 주셨는데.. 다른문제가 더 있는거 같아서요..
먼저 이전 질문 내용입니다.
===========================================================================
끙.. 이건 또 무슨 에러인지? ㅠ.ㅠ
ORA-01023: 커서 문맥이 없습니다(부적합한 커서번호).
어디를 찾아봐도 이런 에러가 있다라고는 되어 있는데 무슨 에러인지는 없네요...
프로시져를 만들어서 프로시져내에서 커서를 사용합니다.
에러 없이 만들어 졌는데 프로그램에서 사용하려고 실행하니 이런 에러를 리턴하네요.
유형에 따라 Select가 달라서 내부에 GOTO를 써서 커서를 사용하지 않을 수도 있습니다.
이거 때문일까요??
IS에 CURSOR CUR_AGTITINS IS 식으로 사용할 커서를 선언했고..
BEGIN
FOR CUR_AGTITIN IN CUR_AGTITINS LOOP
.
.
.
END LOOP;
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM||’에러발생’);
END;
식으로 본문에서 사용했습니다.
Oracle 초보임을 감안하셔서 자세히 설명해 주시면 감사하겠습니다.
위에 프로시져라고 했는데.. 패키지 입니다.. 요기서 리턴을 select형으로 하려고 cursor를 사용하는데..
이때문일까요????
======================= 여기까지가 저번 질문 이었습니다 =======================
된장님의 답변에 따르면 제가 사용한데 명시적 커서라는 말씀이신데..
가르쳐 주신데로 묵시적 커서로 변경하였습니다. (LOOP 문은 된장님이 빼먹으신거지요? ^^)
그래도 같은 에러가 발생하는데.. 혹.. 저 커서의 결과가 없으면 나오는 에러 일까요???
그렇다면 예외 처리를 어찌 하면 될까요?
그리고.. 저 커서 부분을 몽땅 주석 처리하고 해도 같은 에러가 나오는데..
제가 결과 반환 방법을 커서로 반환해서 그런듯 싶은데.. 역시 결과가 있으면 되는거 같고..
결과가 없으면 에러가 나는듯 싶습니다.
Record 의 수가 0로 반환하려면 어찌 하면 되지요??
모듈에서는 Record의 수는 체크 하거든요..
제가 사용한 커서 반환은 이런식으로 했습니다
PROCEDURE TEST_PRC(
o_cur OUT t_cur
)
IS
p_cur t_cur;
BEGIN
OPEN p_cur FOR
SELECT *
FROM TEST_TBL
WHERE IDX = i_IDX;
o_cur := p_cur;
END TEST_PRC;
제가 사용한 방식에서 결과가 없다면 에러 나는듯 싶은데.. 예외 처리를 어찌 하면 좋죠?
질문 정리...
1. 명시적, 묵시적 커서 사용시의 결과 없음의 예외 처리법
2. 커서형의 Record반환시 결과 없음의 반환 (Record 0 라고 반환할 수 있는방법)
3. 위의 제가 사용한 커서형 반환시 결과가 존재하지 않을때 예외 처리법
고수님들.. 가르쳐 주시면 복받으실꺼에요~~~
======================= 된장님의 답변입니다 ============================
- 된장 [2008-05-08 15:19]
Oracle Reference에 있는 예제를 그대로 올릴께요.
-------묵시적 Cursor---------
임의로 커서를 선언하지 않고 사용.
BEGIN
FOR item IN ( SELECT last_name, job_id
FROM employees
WHERE job_id LIKE ’%CLERK%’
AND manager_id > 120 )
DBMS_OUTPUT.PUT_LINE
(’Name = ’ || item.last_name || ’, Job = ’ || item.job_id);
END LOOP;
END;
/
----명시적 Cursor 선언-----------------
DECLARE
CURSOR c1 IS SELECT last_name, job_id FROM employees
WHERE job_id LIKE ’%CLERK%’ AND manager_id > 120;
BEGIN
FOR item IN c1
LOOP
DBMS_OUTPUT.PUT_LINE
(’Name = ’ || item.last_name || ’, Job = ’ || item.job_id);
END LOOP;
END;
/
한번 보시면 아실 수 있을 꺼에염..~~..