PL/SQL 1: 문법

 

PL/SQL 1: 문법 

프로시저(PL/SQL) 피엘에스큐엘 문법

PL/SQL

1) 오라클에서 제공하는 절차적언어

2) 사용자 정의 함수(문법) : procedure, function

 2-1) function : 리턴형이 존재

   (셀렉트와 관련)
  => max, min, count 등 셀렉트 문법

 2-2) procedure: 리턴형이 존재하지 않는 함수

   (인서트, 업데이트와 관련)
– 프로시저는 캐시메모리에 저장 (속도가 빠르다)

– 여러개의 SQL문장을 동시에 처리할 수 있다

– 반복적으로 수행되는 문장에서 주로 사용(자바의 메소드와 비슷한 역할임)
  ex) 페이지나누기

3) 형식
 3-1) 선언부 => 변수 선언(지역변수)

 3-2) 구현부 => SQL
 

 3-3) 예외처리부 =>Exception

4) 변수 선언 방식
 4-1) 단일변수 선언
  vempno NUMBER(4);

   또는
  vempno emp.empno%TYPE;

  –emp테이블의 empno와 동일한 데이터 형으로 선언함

  (위의 것은 데이터 형의 크기를 외워야 하므로 주로 아래 것으로 사용함)

 4-2) ROW변수 선언
  vemp emp%ROWTYPE  => 레코드변수 (자바에서는 VO와 같다)

 4-3) 사용자 정의변수(RECORD) 선언
 필요한 데이터를 사용자 정의한다. 사용자 정의 타입(레코드)는 조인이 걸려도 쓸 수 있다.

  TYPE ed IS RECORD(
    vempno NUMBER,
    vename VARCHAR2(10)
  );

 4-4) 목록처리(CURSOR)
  CURSOR => ArrayList와 비슷. 자바에서는 ResultSet과 같다.

5) 제어문
 조건문, 반복문

 조건문: 단일, 다중, 선택

5-1) 조건문
  단일
   IF(조건문) THEN
     SQL
   END IF;

  다중
   IF(조건문) THEN
     SQL
   ELSE IF(조건문) THEN
     SQL
   ELSE
     SQL
   END IF;

  선택
   IF(조건문) THEN
     SQL
   ELSE
     SQL
   END IF;

5-2) 반복문
  FOR i IN 1..9 LOOP
    처리
  END LOOP;

예제1) 단일변수 선언/출력

1. sqlplus에서 set serveroutput on 이라고  칠것.

2. ed test 로 아래 내용을 작성

DECLARE

    vempno emp.empno%TYPE;

    vename emp.ename%TYPE;

    vjob emp.job%TYPE;

    vday emp.hiredate%TYPE;

    vsal emp.sal%TYPE;

BEGIN

    SELECT empno,ename,job,hiredate,sal INTO vempno,vename,vjob,vday,vsal

    FROM emp

    WHERE empno=7788;

    DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);

    DBMS_OUTPUT.PUT_LINE(‘사번:’||vempno);

    DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);

    DBMS_OUTPUT.PUT_LINE(‘직위:’||vjob);

    DBMS_OUTPUT.PUT_LINE(‘입사일:’||vday);

    DBMS_OUTPUT.PUT_LINE(‘급여:’||vsal);

END;

/

3. @test로 실행

예제2) 레코드 변수 선언/출력

DECLARE

  vemp emp%ROWTYPE;

BEGIN

  SELECT * INTO vemp

  FROM emp

  WHERE empno=7900;

  DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);

  DBMS_OUTPUT.PUT_LINE(‘사번:’||vemp.empno);

  DBMS_OUTPUT.PUT_LINE(‘이름:’||vemp.ename);

  DBMS_OUTPUT.PUT_LINE(‘직위:’||vemp.job);

  DBMS_OUTPUT.PUT_LINE(‘입사일:’||vemp.hiredate);

  DBMS_OUTPUT.PUT_LINE(‘급여:’||vemp.sal);

END;

/

예제3) 사용자 정의 레코드 변수 선언/출력

내가 원하는 형태로 정의할 수 있는게 레코드임. (VO를 만드는 것과 같음)

DECLARE

   TYPE empdeptRecord IS RECORD

   (

      empno emp.empno%TYPE,

      ename emp.ename%TYPE,

      job emp.job%TYPE,

      dname dept.dname%TYPE,

      loc dept.loc%TYPE

   );

   ed empdeptRecord;

BEGIN

   SELECT empno,ename,job,dname,loc INTO ed

   FROM emp,dept

   WHERE emp.deptno=dept.deptno

   AND empno=7900;

   DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);

   DBMS_OUTPUT.PUT_LINE(‘사번:’||ed.empno);

   DBMS_OUTPUT.PUT_LINE(‘이름:’||ed.ename);

   DBMS_OUTPUT.PUT_LINE(‘직위:’||ed.job);

   DBMS_OUTPUT.PUT_LINE(‘부서명:’||ed.dname);

   DBMS_OUTPUT.PUT_LINE(‘지역:’||ed.loc);

END;

/

예제4)

ACCEPT pno PROMPT ‘사번:’

   –자바의 SCANNER와 같다

DECLARE

   vempno emp.empno%TYPE:=&pno;

   –주소값을 넘김

   vename emp.ename%TYPE;

BEGIN

   SELECT ename INTO vename

   FROM emp

   WHERE empno=vempno;

   DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);

END;

/

/*

   int *p;

   int a;

   p=&a;

   int b=*p;

*/