분류 | 구문 | 설명 | 본문 |
---|---|---|---|
출력 | 출력문 켜기 | set serveroutput on | |
프로시져 | procedure | procedure 만들기 | create or replace procedure |
반복 | for loop | 구구단 출력 (값 하나 입력 받아서 출력하는 구문) sav gugu2 | create or replace procedure gugu2(su number) as begin for i in 1..9 loop dbms_output.put_line(su || 'X' || i || '=' || su*i); end loop; end; / |
출력 | dbms_output.put_line | exec dbms_output.put_line('test'); | |
선언 | declare begin end; as begin end; | 변수 선언 anonymous 블럭에서는 declare 와 begin 사이에 선언. procedure 에서는 as와 begin 사이에 선언. sav p2 | declare 선언, 정의 한번에 가능 declare create or replace procedure p2(su number) |
function | create or replace function | 함수생성 sav f1 | create or replace function f1(s1 number, s2 number) return number as begin return s1+s2; end; / |
function | create or replace function | 세금 구하는 function 세금 3.3% sav tax | create or replace function tax(sal number) select sal, tax(sal) TAX from emp; |
매개변수 | default | 매개변수 넣지 않을시 default 값 사용 sav p3 | create or replace procedure p3(su number default 0) as begin dbms_output.put_line(su); end; / |
procedure | 테이블 생성 | 대용량 테이블 생성 sav testSet | drop table tm / drop sequence tm_s / CREATE TABLE TM(ID NUMBER(10),DATA VARCHAR2(30), CONSTRAINT TM_PK PRIMARY KEY(ID)) / create sequence tm_s / create or replace procedure tm_i(su number,data varchar2 default 'abcedfg')as begin for i in 1..su loop insert into tm values(tm_s.nextval,data); commit; end loop; end; / exec tm_i(100) / select count(*) from tm / |
execute immediate | DDL 문 사용 | begin execute immediate 'create table xxxxx(x date)'; end; / | |
argument | out | argument 로 값 받기 | create or replace procedure p4(su in out number) as exec :x := 40; exec p4(x) print x; |
선언 | type, rowtype |
| declare |
procedure | rowtype select into | select into가 row가 한줄인 것 또는 vector값만 되나 rowtype를 사용해서 vector 값을 넣어서 사용 가능 sav depts | create or replace procedure depts(su dept.deptno%type) as depts dept%rowtype; begin select dname,loc into depts.dname, depts.loc from dept where deptno=su; dbms_output.put_line('dname= ' || depts.dname); dbms_output.put_line('loc= ' || depts.loc); end; / |
procedure | cursor execute immediate | scott.emp.enme로 user 만들기 | conn / as sysdba; |
procedure | execute immediate | scott.emp.enme로 만든 user 삭제
| conn / as sysdba; |
procedure | execute immediate | 테이블 생성 | create or replace procedure createT(tname varchar2 default 'a',su number default null) end loop; elsif su = 0 then else end; |
procedure | execute immediate | 테이블 삭제 | create or replace procedure dropT(tname varchar2,su number default null) if su >=0 then elsif su = 0 then execute immediate 'drop table '||tname||su; |
cursor | cursor fetch open %ISOPEN %NOTFOUND %ROWCOUNT | cursor의 기본형
sav empd | create or replace procedure empd(dn emp.deptno%type) as cursor ec is select * from emp where deptno=dn; e emp%rowtype; begin if ec%ISOPEN = FALSE then open ec; end if; loop fetch ec into e; exit when ec%NOTFOUND; dbms_output.put_line(e.ename ||' '||e.sal); end loop; dbms_output.put_line('count = '||ec%ROWCOUNT); end; / |
cursor | close | 값을 변환해서 사용할 수 있다. | declare dn emp.deptno%type; cursor ec is select * from emp where deptno=dn; e emp%rowtype; begin dn := 10; open ec; loop fetch ec into e; exit when ec%NOTFOUND; dbms_output.put_line(e.ename ||' '||e.sal); end loop; dbms_output.put_line('count = '||ec%ROWCOUNT); close ec; dn := 20; open ec; loop fetch ec into e; exit when ec%NOTFOUND; dbms_output.put_line(e.ename ||' '||e.sal); end loop; dbms_output.put_line('count = '||ec%ROWCOUNT); end; / |
exception | RAISE | user_define_error
sal을 올리는데 500 이하면 rollback | create or replace procedure raiseSal( begin for e in (select sal from emp where empno=empnox) loop exception
|
package | myPackage package | package와 package body 같이 붙여서 만들 것.
exec myPackage.gugu(3) | create or replace package myPackage is procedure gugu2(su number); procedure print(st varchar2); end; / |
package | myPackage package body |
exec myPackage.print('aaaa') | create or replace package body myPackage is procedure gugu2(su number) as begin for i in 1..9 loop dbms_output.put_line(su || 'X' || i || '=' || su*i); end loop; end; procedure print(st varchar2) as begin dbms_output.put_line(st); end; end; / |
DML | hr 계정에 emp 만들기 | conn / as sysdba conn hr/hr | |
function | empInsert | insert package | create or replace function empInsert( pEname emp.ename%type, pJob emp.job%type, pMgr emp.mgr%type, pHiredate emp.hiredate%type, Psal emp.sal%type, Pcomm emp.comm%type, PDeptno emp.deptno%type) return emp.empno%type as ret emp.empno%type; begin insert into emp values(emps.nextval, pEname,pJob,pMgr,pHiredate,Psal,Pcomm,PDeptno); select emps.currval into ret from dual; commit; return ret; exception when others then if SQLCODE=-2291 then dbms_output.put_line('no FK...ERROR '); return null; end if; end; / |
function | empUpdate | update package | create or replace function empUpdate( select count(*) into updateCount from emp where empno=pEmpno; |
procedure | empdelete
emp | delete package | create or replace procedure empDelete(pEmpno emp.empno%type) as begin delete from emp where empno= pEmpno; commit; end; / |
DML | truncate emp
| truncate emp | commit; drop table emp; drop table dept; drop sequence emps; drop sequence depts; @@empCreate.sql; truncate table emp; delete from dept; commit; |
DML | drop emp package | drop emp | rop table emp; |
반복 | case | decode 함수 대신해서 case 문 사용 | create or replace procedure CaseTest(dn dept.deptno%type) as empr emp%rowtype; cursor ec is select * from emp where deptno=dn; begin open ec; loop fetch ec into empr; exit when ec%NOTFOUND; case dn when 10 then dbms_output.put_line(empr.ename||' '||'ACCOUNT'); when 20 then dbms_output.put_line(empr.ename||' '||'RESEARCH'); when 30 then dbms_output.put_line(empr.ename||' '||'SALES'); when 40 then dbms_output.put_line(empr.ename||' '||'OPERATIONS'); else dbms_output.put_line('No such dname'); end case; end loop; close ec; end; / |
반복 | while | loop until sal > 15000 | WHILE sal <= 15000 LOOP SELECT salary, manager_id, last_name INTO sal, mgr_id, lname FROM employees WHERE employee_id = mgr_id; END LOOP; |
반복 | while | boolean 으로도 사용가능
If counter > 500, DONE = TRUE | DECLARE done BOOLEAN; counter NUMBER := 0; BEGIN done := FALSE; WHILE done != TRUE LOOP counter := counter + 1; done := (counter > 500); END LOOP; END; / |
반복 | while | IS NOT NULL | WHILE counter IS NOT NULL ~~~~~~ |
'DataBase > Oracle' 카테고리의 다른 글
Admin 1. 04장 Managing the Oracle Instance (0) | 2012.10.18 |
---|---|
Admin 1. 03장 Creating an Oracle Instance (0) | 2012.10.18 |
스크립트파일 (0) | 2012.10.17 |
oracle user 생성 (0) | 2012.10.17 |
oracle service 등록 (0) | 2012.10.17 |