ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다 0 7 33,229

by Albothyl [2012.03.26 23:22:30]



ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다

이 에러코드가 왜 발생하고 어떻게 해결하는지 모르겠습니다. 아래

프로시저를 한번 예제로 짜보았는데 왜 이 에러가 발생하는지 모르겠

습니다.

<parameterMap class="java.util.HashMap" id="test">
 <parameter property="bbsNo" javaType="Integer" jdbcType="NUMBER" mode="IN"/>
 <parameter property="title" javaType="String" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>
<procedure id="readboardtest" parameterMap="test" resultClass="java.lang.String">
 { call proc_rowids(?,?) }
</procedure> 

위 구문은 자바에서 아래 프로시저 호출하는 호출문이고, 아래는 호출되는 프로시저입니다.

---------------------------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE proc_rowids(bbsNo IN NUMBER, 
 title OUT VARCHAR2)
IS

 fastcall tbl_board.FASTCALL_B%TYPE;

BEGIN

    SELECT ROWID
    INTO  fastcall
    FROM TBL_BOARD
    WHERE bbsno = bbsNo;

    UPDATE TBL_BOARD
    SET    TBL_BOARD.FASTCALL_B = NVL(fastcall_b, fastcall), TBL_BOARD.READCNT = TBL_BOARD.READCNT + 1
    WHERE  TBL_BOARD.BBSNO = bbsNo;

    SELECT TBL_BOARD.TITLE
    INTO title
    FROM TBL_BOARD
    WHERE TBL_BOARD.BBSNO = bbsNo;

END;
---------------------------------------------------------------------------------------------------------------------------------------------------

by 티메로 [2012.03.27 11:24:25]
bbsNo가 디비에 중복되서 들어가 있진 않죠?

by 제로 [2012.03.27 12:38:08]

    SELECT ROWID
    INTO  fastcall
    FROM TBL_BOARD
    WHERE bbsno = bbsNo;
에서의 결과 행수가 2건 이상일때 에러 발생합니다.

by 부쉬맨 [2012.03.27 13:31:51]
into는 두개의 로우를 동시에 받아올수가없습니다.
max, min으로 한건을 표현하셔야됩니다.

by 손님 [2012.03.27 22:02:20]

우선 bbsno는 pk로서 유니크합니다. 그래서 select문을 실행하면 오직 1건만 출력이 됩니다.
때문에 위 구문은 오직 1행의 row만 출력하는데 저런 에러가 발생합니다.

by Albothyl [2012.03.27 22:09:50]

바로위 손님은 제가 쓴 댓글입니다. 그리고 본문의 프로시저구문안의 SQL문만 따로 실행해도 1개의 ROW만 출력됩니다. 그런데 저런 에러가 왜 발생하는지 모르어요..

by 마농 [2012.03.28 08:05:54]

변수명을 컬럼명과 동일하게 사용하셨네요?
변수명은 컬렴명과 구별해서 선언해 사용하세요.
위 구문을 그대로 실행하셨다고 하셨는데 그대로가 아니라 특정값으로 실행해서 1건인거겠죠.
위 구문을 정말 그대로 실행하셨다면 전체행이 나올수밖에 없습니다.
같은 컬럼끼리 이퀄비교를 하고 있는 샘이죠.


by Albothyl [2012.03.30 00:12:15]

음 앞에 테이블명.컬럼명 = 변수명 해줘도 컬럼명과 변수명이 같으면 그렇게 되는군요. 답변 감사합니다. !!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입