경진의 블로그

PL/SQL - SELECT INTO 조회한 값에 데이터를 넣는 방법(1건) 본문

자바개발과정/오라클(Oracle)

PL/SQL - SELECT INTO 조회한 값에 데이터를 넣는 방법(1건)

aith 2008. 6. 3. 13:30
SELECT INTO

PL/SQL 에서는 SELECT문과 INTO를 함께 사용하여 조회한 데이터값을 변수에 입력할 수 있다.
단 SELECT INTO문에서 중요한 것은 오직 1건만 적용할 수 있다는 사실이다.
SELECT만으로 조회했을 경우 한 건의 데이터만 조회가 되어야 한다는 말이다.
사실 SELECT문을 사용하면 여러 건 조회가 되는 건 기본인데 이상하다고 느낄 수 있지만, 여러 건 조회한 데이터를 다룰 때는 CURSOR문을 사용한다.

declare
    d_sysdate date;
begin
    select sysdate into d_sysdate
        from dual;
    dbms_output.put_line('오늘은 '||to_char(d_sysdate,'YYYYMMDD')||' 입니다.');
    update emp
        set hiredate = to_date(to_char(d_sysdate,'YYYY-MM-DD'))
    where ename = 'MILLER';
    dbms_output.put_line('d_sysdate '||to_char(d_sysdate,'YYYY-MM-DD'));
    commit;
end;
/

SELECT INTO문에서는 꼭 1건의 데이터만이 조회되어야 한다고 했다.
만약 조회된 데이터가 없거나 조회된 데이터가 2건 이상일 경우는?

여러건을 조회해서 입력한다 (에러 발생)

declare
    d_sysdate date;
begin
    select hiredate into d_sysdate
      from emp
    dbms_output.put_line('오늘은 '||to_char(d_sysdate,'YYYYMMDD')||' 입니다.');
end;
/

데이터가 없는 경우이다 (에러 발생)

declare
    d_sysdate date;
begin
    select hiredate into d_sysdate
      from emp
     where empno = '';
    dbms_output.put_line('오늘은 '||to_char(d_sysdate,'YYYYMMDD')||' 입니다.');
end;
/

데이터 유형이 다른 경우 (에러 발생)

declare
    d_sysdate date;
begin
    select empno into d_sysdate
      from emp
     where empno = '';
    dbms_output.put_line('오늘은 '||to_char(d_sysdate,'YYYYMMDD')||' 입니다.');
end;
/

다음과 같이 1개 row의 여러 개의 컬럼 정보를 가져오는 것은 가능하다

declare
    t_emp emp%rowtype;
begin
    select empno, ename into t_emp.empno, t_emp.ename
      from emp
     where empno = 7934;
    dbms_output.put_line('사번 :'||t_emp.empno);
    dbms_output.put_line('이름 :'||t_emp.ename);
end;
/

Select문 실행 이후의 결과를 SQL속성을 통해서 알 수 있고, 이를 활용할 수 있다.
다음은 Select Into 문 실행이후에 값을 가지고 있는 SQL 속성(Attribute) 이다.
이런 속성은 반드시 사용을 하거나 할 필요는 없고 이런 속성 값들이 제공된다는 사실을 알면, 적합한 곳에서 사용할 수 있다.

 속성  결과값
 (조회1건)
 결과값
 (조회0건)
 비고
 SQL%NOTFOUND  False  True  조회된 데이터가 없으면 True
 SQL%FOUND  True  False  조회된 데이터가 있으면 True
 SQL%ROWCOUNT  n  0  조회된 데이터 건수 (Row수)

declare
    t_emp emp%rowtype;
begin
    select empno, ename into t_emp.empno, t_emp.ename
      from emp
     where empno = 7934;
    if sql%found then
        dbms_output.put_line('<<< 조회결과 있음>>>');
    end if;
    if sql%rowcount = 1 then
        dbms_output.put_line('<<< 조회 결과>>>');
        dbms_output.put_line('사번 :'||t_emp.empno);
        dbms_output.put_line('이름 :'||t_emp.ename);
    elsif sql%rowcount = 0 then
        dbms_output.put_line('<<< ERROR >>>');
        dbms_output.put_line('에러내용 : 조회된 데이터가 없습니다.');
    elsif sql%rowcount > 0 then
        dbms_output.put_line('<<< ERROR >>>');
        dbms_output.put_line('에러내용 : 조회된 데이터가 너무 많습니다.');
    end if;
    exception
        when others then
        dbms_output.put_line('<<< ERROR >>>');
        dbms_output.put_line('에러코드 : '|| sqlcode);
        dbms_output.put_line('에러내용 : '|| substr(sqlerrm,1,100));       
end;
/

declare
    s_msg varchar2(50) := '';
begin
    begin
    update emp
       set ename = 'abcd';
    exception
       when others then
       s_msg := 'Update';
       raise;
    end;
    dbms_output.put_line('<<< 처리 결과>>> ==> Update');
    dbms_output.put_line('데이터 처리 갯수 :'||sql%rowcount);
    begin
    delete from emp
     where empno = '';
    exception
        when others then
            s_msg := 'Delete';
            raise;
    end;
    dbms_output.put_line('<<< 처리 결과>>> ==> Delete');
    dbms_output.put_line('데이터 처리 갯수 :'||sql%rowcount);
    begin
    insert into emp (empno, ename)
         values ('1111', '테스트');
    exception
        when others then
            s_msg := 'Insert';
            raise;
    end;
    dbms_output.put_line('<<< 처리 결과>>> ==> Insert');
    dbms_output.put_line('데이터 처리 갯수 :'||sql%rowcount);
    commit;
    exception
        when others then
        rollback;
        dbms_output.put_line('<<< ERROR >>>'|| s_msg);
        dbms_output.put_line('에러코드 : '|| sqlcode);
        dbms_output.put_line('에러내용 : '|| substr(sqlerrm,1,100));       
end;
/
0 Comments
댓글쓰기 폼