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) 데이터가 한건도 없습니다.
|
댓글 없음:
댓글 쓰기