2015년 9월 7일 월요일

PL/SQL에서 SELECT사용(NO_DATA_FOUND, TOO_MANY_ROWS)

PL/SQL에서 SELECT사용(NO_DATA_FOUND, TOO_MANY_ROWS)

SELECT문의 사용

 SELECT문의 종료는 세미콜론(;)으로 표시한다.
 SELECT절의 칼럼목록과 INTO절의 칼럼목록은 개수 및 데이터 타입이 동일해야 한다.
 SELECT * 인 경우 %ROWTYPE을 사용하면 좀 더 효율적이다.
 INTO절은 필수이며 BEGIN~END 사이에서 사용되는 SELECT는 반드시 한 건만 SELECT 되어야 한다. 한 건도 SELECT 되지 않는다면 ORA-01403(NO_DATA_FOUND) 오류가 발생하고 여러 건 SELECT 된다면 ORA-01422(TOO_MANY_ROWS) 오류가 발생한다.

[기본형식]
SELECT  select_list
INTO    변수명 or 레코드이름
FROM    table
WHERE  conditions

-- EMP 테이블에서 이름을 입력받아 해당 사원의 급여 및 입사일자를 표시
SQL> edit ojc14

set serveroutput on
create or replace procedure ojc14
(v_ename in emp.ename%type)
is
v_sal emp.sal%type;
v_hiredate emp.hiredate%type;
begin
select sal, hiredate
into v_sal, v_hiredate
from emp
where ename = v_ename;
 
dbms_output.put_line('급여 : '||to_char(v_sal,'999,999'));
dbms_output.put_line('입사일자 : '||to_char(v_hiredate, 'yyyy.mm.dd'));
end;
/

SQL> @ojc14
프로시저가 생성되었습니다.

SQL> exec ojc14('SMITH')
급여 :    4,500
입사일자 : 1980.12.17


-- SELECT예외 처리예제
SQL> set serveroutput on
SQL> create or replace procedure ojc15
  2  (v_sal in emp.sal%type)
  3  is
  4    v_ename emp.ename%type;
  5    v_hiredate emp.hiredate%type;
  6  begin
  7    select ename, hiredate
  8    into v_ename, v_hiredate
  9    from emp
 10    where sal = v_sal;
 11
 12    dbms_output.put_line('이름 : '||v_ename);
 13    dbms_output.put_line('입사일자 : '||to_char(v_hiredate, 'yyyy.mm.dd'));
 14  end;
 15  /

프로시저가 생성되었습니다.

SQL> exec ojc15(950);
이름 : JAMES
입사일자 : 1981.12.03

SQL> exec ojc15(1250);
BEGIN ojc15(1250); END;
*
1행에 오류:
ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
ORA-06512: "SCOTT.OJC15",  7행
ORA-06512:  1행

-- 예외처리 예문
SQL> set serveroutput on
SQL> create or replace procedure ojc15
  2  (v_sal in emp.sal%type)
  3  is
  4    v_ename emp.ename%type;
  5    v_hiredate emp.hiredate%type;
  6  begin
  7    select ename, hiredate
  8    into v_ename, v_hiredate
  9    from emp
 10    where sal = v_sal;
 11
 12    dbms_output.put_line('이름 : '||v_ename);
 13    dbms_output.put_line('입사일자 : '||to_char(v_hiredate, 'yyyy.mm.dd'));
 14
 15  exception
 16    when too_many_rows then
 17      dbms_output.put_line('데이터가 여러건 추출 되었습니다.');
 18    when no_data_found then
 19      dbms_output.put_line('데이터가 한건도 없습니다.');
 20    when others then
 21    dbms_output.put_line('SQL ERROR CODE : ' || SQLCODE);
 22    dbms_output.put_line('SQL ERROR MSG  : ' || SQLERRM);
 23  end;
 24  /

프로시저가 생성되었습니다.

SQL> exec ojc15(1250)
데이터가 여러건 추출 되었습니다.

SQL> exec ojc15(9999)
데이터가 한건도 없습니다.

댓글 없음:

댓글 쓰기