본문 바로가기

DB관련/oracle

PL/SQL -1

기본적으로 블록 구조이다.

중첩 블록도 가능. 포함된 블록을 nested block 이라 한다.

블록 내에서 sql 문을 사용하여 데이터를 검새하고 수정

 

 

A>블록의 유형 : 익명블록 :일회성일때 주로 사용

                  저장된 블록: 서브 프로그램 또는 프로그램 단위 라고도 한다.

 

 

B>기본 구성 : 선언부(DECLARE)  : 변수나 상수 선언

               실행부(BEGIN) : 제어문, 반복문 등 실행 
               예외처리부(EXCEPTION)

 

 

C>문법 규칙 : 1.END 이외의 예약어 뒤에는 세미콜론을 안 붙임 , 그 외에는 붙임 

                   2. 기본적으로 문장 결과 출력을 안해줌

                      결과를 화면에 출력하고 싶으면  SET SERVEROUTPUT ON

                   3. 리터럴(문자,날짜)은 단일인용부호(‘)로 표시,  널 값은 NULL 상수로 기술

                   4. 예약어는 식별자명으로 사용될 수 없음 , Alias 로는 가능

                   5. DDL 을 직접 지원하진 않음 - 대신 동적 sql 에선 가능

                   6. DCL 도 직접 지원 안함 - 마찬가지로 동적 sql에선 가능

                   7. INTO 시 순서, 개수 ,타입이 다 일치해야 함.

 

D> 예시

 

예시1.

DECLARE 
    vno NUMBER(4);
    vname VARCHAR2(10);
BEGIN
    SELECT empno,ename INTO vno, vname
    FROM emp
    WHERE empno = 7900;
    DBMS_OUTPUT.PUT_LINE(vno||' ' ||vname);
END;     

 

 

예시2.  변수의 타입 자동 설정

DECLARE

        v_profno professor.profno%TYPE; -- %TYPE은 테이블에서 정의한 타입대로 하겠다는 뜻

        v_pay professor.pay%TYPE;

BEGIN

        SELECT profno ,pay INTO v_profno, v_pay  

        FROM professor WHERE profno = 1001;

--SELECT profno ,pay FROM professor WHERE profno = 1001의 결과를 v_profno, v_pay에

--넣는다고 생각하면 됨

DBMS_OUTPUT.PUT_LINE(v_profno|| '번 교수 급여'|| v_pay);

END;

 

 

예시3.  값 입력받기

DECLARE

        v_profno professor.profno%TYPE ;

        v_name professor.name%TYPE ;

        v_deptno professor.deptno%TYPE ;

        v_hdate professor.hiredate%TYPE ;

BEGIN

        SELECT profno,name,deptno,hiredate INTO v_profno,v_name,v_deptno,v_hdate

        FROM professor

        WHERE profno = '&교수번호';          -- 입력할때 '교수번호' 라는 이름으로 입력을 받음

DBMS_OUTPUT.PUT_LINE(v_profno||' '||v_name||' '||v_deptno||' '||v_hdate);

END;

 

 

예시4. 

--변수 선언이 없으면 DECLARE 가 없어도 됨 

BEGIN 
    INSERT INTO 값을 삽입할 테이블 이름
    VALUES(값1 ,값2);
END;
/

 

 

예시5. 변수에 값 대입하여 테이블에 행 추가

DECLARE
    v_no number := '&no';                         -- := 대입연산자
    v_name varchar2(10) := '&name';
    v_addr varchar2(10) := '&addr';
BEGIN
    INSERT INTO pl_test2
    VALUES(v_no,v_name,v_addr);
END;
/
SELECT * FROM pl_test2;

 

 

예시6. UPDATE 하기

BEGIN 
    UPDATE pl_test
    SET name ='bbb'
    WHERE no ='2';
END;

 

 

예시7. DELETE 하기

BEGIN 
    DELETE FROM pl_test
    WHERE no=1;
END;

 

 

예시8.  MERGE하기

BEGIN

        MERGE INTO pl_merge2 m2

        USING pl_merge1 m1

        ON(m1.no = m2.no)

        WHEN MATCHED THEN

        UPDATE SET m2.name =m1.name

        WHEN NOT MATCHED THEN

        INSERT VALUES(m1.no,m1.name);

END; /

 

 

예시9. 조인하기

DECLARE

        v_empno emp.empno%TYPE;

        v_ename emp.ename%TYPE;

        v_edeptno emp.deptno%TYPE;

        v_deptno dept.deptno%TYPE;

        v_dname dept.dname%TYPE;

BEGIN

        SELECT e.empno, e.ename, d.deptno, d.dname

        INTO v_empno,v_ename,v_deptno,v_dname

        FROM emp e, dept d WHERE e.deptno = d.deptno

        AND e.empno= '7900';

DBMS_OUTPUT.PUT_LINE(v_empno ||' '||v_ename ||' '||v_deptno||' '|| v_dname);

END; /

 

 

예시 10. 두 수 입력 받아서 출력하기

DECLARE
    v_fisrt number(10) :='&첫숫자';               ---   주의!! '&첫 숫자' 같이 띄어쓰기가 있으면 오류난다. 

    v_second number(10) :='&두번째숫자';     ---- 입력을 받을 때  '첫' 이라고 뜨고 나머지 '숫자' 부분 때문에 

                                                           ---- 오류가 난다. 
BEGIN
DBMS_OUTPUT.PUT_LINE(v_fisrt + v_second);
END;
/

'DB관련 > oracle' 카테고리의 다른 글

PL/SQL 3- 복합 변수, 제어문  (0) 2021.01.20
PL/SQL -2 스칼라 변수  (0) 2021.01.20
복수행 함수 - 연산 함수와 그룹함수  (0) 2021.01.15
일반 함수(nvl, nvl2, decode)  (0) 2021.01.15
형과 형 변환 함수  (0) 2021.01.15