PL/SQL(1)

inthyes·2023년 6월 24일
0

DB

목록 보기
1/4
post-thumbnail
💡 PL/SQL 소개
  • PL/SQL이란? 오라클에서 제공하는 SQL을 확장한 절차적 프로그래밍 언어 Procedural Language extension to SQL의 약자 [특징]
    • SQL문장에서 변수 정의, 조건 처리, 반복 처리 등 프로그래밍 언어가 보이는 제어 구조 제공
    • SQL과 프로그래밍 언어의 통합 접근 중 한 형태(SQL/PSM)
  • 언어구조 블록단위 구조
    • 임의의 수의 중첩된 하위 블록 포함
    • 선언부(DECLARE), 실행부(BEGIN…END), 예외처리부(EXCEPTION)로 구성
        DECLARE —선택
            —변수, 상수, 커서, 사용자 지정 예외 선언
        BEGIN —필수
            —SQL 문장
            —PL/SQL 제어 문장
        EXCEPTION —선택
            —에러 발생시 수행될 액션
        END; —필수
  • 블록유형 익명
    • 이름이 없는 PL/SQL블록

      저장 프로시저 및 함수

    • 매개 변수를 받을 수 있고, 반복해서 사용할 수 있는 이름이 있는 PL/SQL블록

      패키지

    • 관련된 저장 프로시저, 함수를 모은 이름이 있는 PL/SQL

      트리거

    • 데이터베이스의 테이블과 연결되어 자동적으로 실행되는 이름이 있는 PL/SQL블록

      ⇒ 대개의 경우 익명 블록 형태가 아닌 형태(저장 프로시저, 함수, 패키지, 트리거)로 사용

  • 식별자 첫 자리는 알파벳으로 시작 총 자릿수는 30자 이내 특수문자 사용가능(단, &,-,/,space제외) 대소문자 구별은 안함 예약어를 사용할 수 없음
  • 연산자
  • 리터럴 숫자
    • 일반 숫자값(예:123, -4.6)

    • 지수로 표현된 숫자 값(예:1.43E5)

      문자

    • 작은 따옴표로 구분된 문자열(예:’STRING’)

      불리언

    • TRUE, FALSE

      NULL

  • PL/SQL 작성 및 실행 방법 SQL을 작성하고 실행했던 방법과 동일하게 작성 및 실행
  • PL/SQL 결과 출력 PL/SQL의 결과를 확인하기 위해 출력하는 방법
    • Set ServerOutput On

    • DBMS_OUTPUT.PUT_LINE(문자형값);

      출력 방법 예)

      Set ServerOutput On
      
      BEGIN
      	DBMS_OUTPUT.PUT_LINE('Hello World');
      END;

      출력 결과

      	> Hello World
  • 주석 / ~ / : 한 줄 이상의 줄 주석 — : 한 줄 단위의 주석
💡 PL/SQL 데이터 타입
  • 개요

    SQL에서 제공하는 모든 데이터 타입 + 추가 데이터 타입 제공

    • PL/SQL추가 데이터 타입

      : BOOLEAN, %TYPE, %ROWTYPE, PL/SQL레코드 등

      데이터 타입의 유형

    • 스칼라 데이터 타입

      : 일반 단일 데이터 타입(NUMBER, CHAR, …), %TYPE

    • 복합 데이터 타입

      : %ROWTYPE, PL/SQL 레코드, PL/SQL 테이블

    • 참조 데이터 타입

  • 변수 선언

    형식

    식별자 [CONSTANT] 데이터타입 [NOT NULL] [:=상수 값이나 표현식];
    • 식별자 : 변수나 상수의 이름
    • CONSTANT : 식별자가 그 값이 변하라 수 없도록 선언, 반드시 초기화
    • NOT NULL : NOT NULL로 제한된 변수는 반드시 초기화 필요
    • 초기값을 정의하지 않으면 식별자는 NULL값을 가짐
  • 스칼라 데이터 타입

    단수 데이터형으로 하나의 데이터 값을 저장하는 데이터 타입

예시

  • v_gender : CHAR(1);
  • v_total_sal : NUMBER(9):=0;
  • v_order_date : DATE := SYSDATE + 7;
  • c_tax_rate : CONSTANT NUMBER(3,2) := 8.25;
  • v_valid : BOOLEAN NOT NULL := TRUE;

%TYPE데이터타입

  • 이미 선언된 다른 변수나 데이터베이스 칼럼의 데이터 타입을 사용
  • %TYPE앞에 올 수 있는 것은 데이터베이스 테이블과 칼럼, 이미 선언한 변수명
  • 예시) v_empno emp.empno%TYPE := 7900; → v_empno의 데이터 타입 : emp테이블의 empno컬럼의 데이터 타입 v_ename emp.enname%TYPE; → v_ename의 데이터 타입 : emp테이블의 ename컬럼의 데이터 타입
    DECLARE
    	v_ename emp.ename%TYPE;
    	v_sal emp.sal%TYPE;
    BEGIN
    	SELECT ename, sal
    	INTO v_ename, v_sal
    	FROM emp
    	WHERE empno = 7369;
    
    	DBMS_OUTPUT.PUT_LINE('Name:'||v_ename);
    	DBMS_OUTPUT.PUT_LINE('Salary:'||TO_CHAR(v_sal));
    END;
  • 복합 데이터 타입 개념
    • 하나 이상의 데이터 값을 가지는 데이터 타입

    • %ROWTYPE, PL/SQL 레코드

      %ROWTYPE

    • 테이블이나 뷰 내부의 컬럼 집합의 이름, 데이터 타입, 크기, 속성을 그대로 사용

    • %ROWTYPE앞에 오는 것은 테이블명

    • 예시)

      DECLARE
      	v_emp emp%ROWTYPE;
      BEGIN
      	SELECT empno, ename
      	INTO v_emp.empno, v_emp.ename
      	FROM emp
      	WHERE empno=7369;
      
      	DBMS_OUTPUT.PUT_LINE('No:'||TO_CHAR(v_emp.empno);
      	DBMS_OUTPUT.PUT_LINE('Name:'||(v_emp.ename);
      END;

PL/SQL레코드

  • 사용자 정의 데이터형
  • 형식)
TYPE type_ename IS RECORD
	(필드이름1 데이터타입,
	 필드이름2 데이터타입, ..);
Identifier type_name;
  • 예시)
DECLARE
	TYPE emp_record IS RECORD
		(v_ename VARCHAR2(30),
		 v_job VARCHAR2(9));
	
	emp_rec emp_record;
BEGIN
	SELECT ename, job
	INTO emp_rec.v_ename, emp_rec.v_job
	FROM emp
	WHERE empno = 7369;

	DBMS_OUTPUT.PUT_LINE('Name:'||emp_rec.v_ename);
	DBMS_OUTPUT.PUT_LINE('Name:'||(emp_rec.v_job);
END;
💡 PL/SQL 제어문
  • 개요 조건문 : IF-THEN-ELSE 반복문 : LOOP, FOR-LOOP, WHILE-LOOP 분기문 : EXIT
  • 조건문 형식)
    IF condition THEN
    		statements;
    [ELSEIF condition THEN
    		statements;]
    [ELSE
    		statements;]
    END IF;
    예)
    DECLARE
    	sMonth CHAR(2);
    BEGIN
    	sMonth:=TO_CHAR(SYSDATE,'MIM');
    
    	IF(sMonth>='03' and sMonth<='08')THEN
    		DBMS_OUTPUT.PUT_LINE('1학기');
    	ELSE
    		DBMS_OUTPUT.PUT_LINE('2학기');
    	END IF;
    END;
  • 반복문 LOOP
    • 형식)

      LOOP
      	statements;
      	...
      EXIT [WHEN condition];
      END LOOP;
    • 예)

      DECLARE
      	i NUMBER :=0;
      	nSum NUMBER :=0;
      BEGIN
      	LOOP
      		i    :=i+1;
      		nSum := nSum +i;
      		EXIT WHEN i>=100;
      	END LOOP;
      
      	DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
      END;

      FOR-LOOP

    • 형식)

      FOR index in [REVERSE] 시작값..끝값 LOOP
      	statements;
      END LOOP;
    • 예시)

      DECLARE
      i NUMBER :=0;
      nSum NUMBER :=0;
      BEGIN
      	FOR i IN 1..100 LOOP
      		nSum := nSum + i;
      	END LOOP;
      
      	DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
      END;

      WHILE-LOOP

    • 형식)

      WHILE condition LOOP
      	statements;
      	...
      END LOOP;
    • 예)

      DECLARE
      	i NUMBER :=0;
      	nSum NUMBER :=0;
      BEGIN
      	WHILE i<100 LOOP
      		i:=i+1;
      		nSum:=nSum+i;
      	END LOOP;
      
      	DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
      END;
  • 분기문 EXIT
    • 반복문을 빠져나감
    • 예)
      DECLARE
      	i NUMBER:=0;
      	nSum NUMBER:=0;
      BEGIN
      	WHILE TRUE LOOP
      		i := i+1;
      		nSum:=nSum+i;
      		IF i>=100 THEN
      			EXIT;
      		END IF;
      	END LOOP;
      	DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
      END;

NULL

  • 실행을 하지 않음을 나타냄

0개의 댓글