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;