7.12

Oracle/PLSQL 2010/08/06 14:12

 begin
        execute immediate 'create table xce8(x date)';
exception
        when others then
                if sqlcode=-955 then
                        dbms_output.put_line('----------');
                        dbms_output.put_line(sqlerrm);
                        dbms_output.put_line('----------');
                end if;
end;
/


--user-defined exceptions : 논리적 error에 대한 처리
--ex) sal < 0 논리적 오류

--에러 지정 방법
declare
        min exception;
 begin
    for c in (select * from emp where deptno=30) loop
        if c.sal < 0 then
                RAISE min;
        else
            dbms_output.put_line(c.sal);
        end if;
    end loop;
exception
        when min then
                dbms_output.put_line('min error');
end;

--RAISE_APPLICATION_ERROR Procedure : error번호까지 만들어서 error발생 -> 프로그램단에서 처리하기가 용이.
-- error번호 기존 error번호와 겹칠 수 있음 그래서 특정 대역을 사용 –20000 ~ –20999
declare
        min exception;
begin
    for c in (select * from emp where deptno=30) loop
        if c.sal < 0 then
                raise min;
        else
            dbms_output.put_line(c.sal);
        end if;
    end loop;
exception
        when min then
                dbms_output.put_line('min');
                RAISE_APPLICATION_ERROR(-20111,'min error 2');
end;
/

-- 둘다 파라미터가 있음
/*
1.procedures : 리턴값이 없는 function, 재사용 가능
 subprograme : function, trigger

*/
-- functions : 리턴값이 있음

--객체생성
create procedure ce8
as
begin
        dbms_output.put_line('------------');
end;
/
--실행방법 exec ce8


--객체 확인
select object_name, object_type from user_objects where object_name='CE8'

--파마리터값 받아서 평균 출력(user defined function)
create or replace function avgsal(deptnox number)
     return number
  as
     sumx number(10);
 begin
     select avg(sal) into sumx from emp where deptno=deptnox;
  return sumx;
end;
 /

--실행 select ename from emp where sal < avgsal(10);

--EM(Enterprise Manager=(GUI관리툴))
--http://192.168.186.3:1158/em/
-- Performance(튜닝) Administration(셋팅) Maintenance(유지보수)

--구구단
create or replace procedure gugu(dan number)
as
begin
        for i in 2..9 loop
                dbms_output.put_line(dan || 'x' || i || ' = ' || dan*i);
        end loop;
end;

--실행방법 ( exec gugu(8) )

create or replace procedure tp2(su number, su2 out number) as
begin
        su2 := su+1;
end;
/

declare
        x number := 9;
begin
        tp2(1,x);
        dbms_output.put_line(x);
end;
/

--x 결과값은 2

--out의 용도 : 프로시저 내부에서 바꾼 값을 invoke해준 블록에서 적용이 되게 함
create or replace procedure tp3(su in out number) as
begin
        su := su+1;
end;

--in방식에서만 숫자 가능, out방식은 변수만 가능

--procedure 생성(파라미터를 in으로 받아서 out으로 보내는 것으로 이해)
CREATE OR REPLACE PROCEDURE getdl(pdeptno number, pdname out dept.dname%type, ploc out dept.loc%type) as
begin
        select dname, loc into pdname, ploc from dept where deptno = pdeptno;
end;

--생성된 프로시저 실행하기
declare
        dname dept.dname%type;
        loc dept.loc%type;
begin
        getdl(10, dname,loc);
        dbms_output.put_line(dname || ',' || loc);
end;

2010/08/06 14:12 2010/08/06 14:12

트랙백 주소 :: 이 글에는 트랙백을 보낼 수 없습니다