본문 바로가기

DataBase/Oracle

Chapter 6 PL SQL(Procedural Language/SQL) - 3

PLT 6.3 PL/SQL 블록
PL/SQL은 프로그램을 논리적인 블록으로 나누게 하는 구조화된 블록 언어이다. PL/SQL 블록에서 사용하는 변수는 블록에 대해 논리적으로 선언할 수 있고 사용할 수 있다. 변수들과 그 외의 식별자를 참조하고 선언함으로써 PL/SQL 블록 내에서 값을 저장하고 변경할 수 있는 논리적인 단위이다.
 
PL/SQL 블록 구문과 지침
PL/SQL SQL의 확장이기 때문에 SQL에 적용하는 일반적인 구문은 PL/SQL 언어에 대해서도 적용 가능하다. 문장은 몇 라인 이상 계속될 수 있습니다. 문법적인 요소는 공백으로 분리될 수 있습니다.
 
식별자
식별자는 상수, 변수, 예외 ,커서 ,커서 변수, SUBPROGRAM, 패키지를 포함하는PL/SQL프로그램 항목과 요소를 명명하기 위해 사용됩니다. 식별자는 30문자까지 포함할 수 있지만 알파벳 문자로 시작해야 합니다. 블록에서 사용된 테이블의 열 이름과 동일한 이름으로 식별자를 사용할 수 없습니다. PL/SQL식별자가 동일 SQL명령에 있고 열로 동일 이름을 가지고 있다면, 이때 ORACLE은 참조 중인 열로 간주합니다. 예약어는 더블 인용 부호에  둘러싸여 있지 않으면 식별자로서 사용될 수 없습니다. 예약어는 읽기 쉽도록 대문자로 사용합니다.
 
구분 문자
구분 문자는 PL/SQL에 대한 특수한 의미를 가지는 단순 상징이거나 혼합 상징 입니다.
 
단순 상징
혼합 상징
기호
의미
기호
의미
+
덧셈 연산자
<> 
관계형 연산자
-
뺄셈 연산자
!=
관계형 연산자
*
곱셈 연산자
||
접속 연산자
/
나눗셈 연산자
--
단일 라인 주석 지시자
=
관계형 연산자
/*
주석 구분 문자 시작
@
원격 액세스 지시자
*/
주석 구분 문자 종료
;
문장 종결자
:=
지정 연산자(치환 연산자)
 
Literal
Literal은 식별자(identifier)로 표현되지 않은 숫자, 문자, 문자열, BOOLEAN 값입니다. 문자 Literal PL/SQL문자 집합 내에서 인쇄 가능한 모든 문자를 포함합니다. 숫자 Literal은 단순 값(:-32.5) 또는 과학적인 표기법
 
주석 코드
주석 코드 각 단계를 문서화하고 디버깅을 돕기 위해 코드에 주석을 기술합니다. 주석이 단일 라인에 있으면 두 개의 대쉬(--)을 기술하면뒤에 기술된 것은 주석으로 인식 하고, 주석 범위가 여러 줄이라면 기호 /* */사이에 주석을 기술 한다. 주석은 철저하게 정보를 제공해야 하고 기능적인 논리 또는 데이터에 대한 어떤 조건 또는 기능을 강요해서는 안됩니다. 좋은 주석은 읽기 쉽게 하고 코드 유지를 위해 매우 중요합니다.
 
PL/SQL에서 SQL함수
SQL에서 이용 가능한 대부분의 함수는 PL/SQL표현식에서도 유효합니다.
n         단일 행 숫자 함수
n         단일 행 문자 함수
n         데이터형 변환 함수
n         데이트 함수 그 밖의 함수
 
아래 함수는 절차적인 문장에서는 사용 불가능합니다.
n         GREATEST, LEAST, DECODE.
n         그룹 함수(AVG, MIN, MAX, COUNT, SUM, STDDEVE, VARIANCE)는 테이블에서 행 그룹에 적용되므로 PL/SQL블록에 있는 SQL문장에서만 이용 가능합니다.
V_total := SUM(number_table);  -- Error가 발생한다.
 
데이터형 변환
PL/SQL은 데이터형이 문장에서 혼합되었다면 동적으로 데이터형 변환을 시도 합니다. 예를 들면NUMBER값을 CHAR 변수가 지정되었다면 그것이 CHAR변수에 저장될 수 있도록 하기 위해 PL/SQL은 동적으로 숫자를 문자로 변환 합니다. 문자 표현을 숫자 값으로 나타내는 역의 상황도 적용됩니다. DATE변수에 대해 문자 값을 지정할 수 있고 역의 상황도 적용됩니다. 혼합된 데이터형이 표현식에서 생성되면 데이터를 전환하기 위해 해당 변환 함수를 사용하여야 합니다.
PL/SQL은 가능한 한 데이터형 변환을 시도하지만 성공은 수행 중인 작업에 달려있다. 명시적으로 데이터의 형 변환을 시도하는 것은 상당히 성능에 영향을 미치고 소프트웨어 버전이 변경되더라도 유효하게 유지될 수 있기 때문에 좋은 프로그램이 될 수 있다.
 
데이터형 변환 함수의 종류
n        TO_CHAR(value, format)
n        TO_DATE(value, format)
n        TO_NUMBER(value, format)
 
중첩 블록과 변수 범위
n        문장은 실행 명령이 허용하는 곳 어디에서든지 중첩될 수 있습니다.
n        중첩 블록은 하나의 문장이 됩니다.
n        예외 섹션에서도 중첩 블록을 사용할 수 있습니다.
n        객체 범위는 객체를 참조할 수 있는 프로그램 영역 입니다.
n        선언된 변수를 실행 섹션에서 참조할 수 있습니다.
n        한정시키지 않은 변수는 참조할 수 있는 영역에서 변수를 참조 가능합니다.
-
블록은 둘러싸는 블록을 참조할 수 있습니다
.
-
블록은 둘러싸인 블록을 참조할 수 없습니다.
DECLARE
             x            NUMBER;
             y            NUMBER;
BEGIN
             x := 1;
             y := 2;
             -- 이곳에서 x, y의 값은 x := 1, y := 2
             DECLARE
                           y            NUMBER;
                           z            NUMBER;
             BEGIN
                           -- 이곳에서 x, y, z의 값은 x := 1, y := NULL, z := NULL
                           x := 3;
                           y := 4;
                           z := 5;
                          -- 이곳에서 x, y, z의 값은 x := 3, y := 4, z := 5
             END;
             -- 이곳에서 x, y, z의 값은 x := 3, y := 2, z는 참조 불가능하다.
END;
/
 
PL/SQL에서 연산자
연산자는 논리, 산술, 연결, 연산 제어 명령인 괄호, 지수 연산자가 있다.
우선순위
   
    
1
**, NOT
지수 승, 논리 부정 연산자
2
+, -
식별, 부정 연산자
3
*, /
곱셈,나눗셈 연산자
4
+, - , ||
덧셈,뺄셈,연결 연산자
5
=,!=,<,>,<=,>=,IS NULL,LIKE,BETWEEN,IN
비교 연산자
6
AND
논리곱
7
OR
논리합
 
DECALRE
             v_cnt                   NUMBER := 0;
             v_eq                    BOOLEAN;
             v_valid                 BOOLEAN;
BEGIN
             V_cnt := v_cnt + 1;
             v_eq := (v_n1 = v_n2);
             v_valid := (v_empno IS NOT NULL);
END;
/
NULL로 작업할 때 아래 규칙을 명심함으로써 몇 가지 일반적인 실수를 피할 수 있습니다.
n        관계 연산자로 NULL을 비교하면 항상 NULL이 됩니다.
n        NULL에 논리 연산자 NOT을 적용하면 항상 NULL이 됩니다.
n        조건 제어 문장에서 조건이 NULL이 되면 관련된 문장은 실행되지 않습니다.
 
프로그래밍 지침 사항
PL/SQL 블록을 개발할 때 명확한 코드 생성과 유지를 경감하기 위하여 프로그래밍 지침을 수행 합니다.
 
코드 규약
   
대소문자 규약
사용 예
SQL명령어
대문자
SELECT, INSERT, UPDATE
PL/SQL 키워드
대문자
DECLARE, BEGIN, END
데이터형
대문자
NUMBER,VARCHAR2,CHAR
식별자와 매개변수
소문자
v_sal,v_ename,v_job
데이터베이스 테이블과 열명
소문자
emp, dept, salgrade
 
코드명 지정 규약
식별자
명명 규약
사용 예
변수
v_name
v_sal
상수
c_name
c_company_name
커서
name_cursur
emp_cursor
예외
e_name
e_too_many
테이블 형
name_table_type
amount_table_type
테이블
name_table
order_total_table
레코드 형
name_record_type
emp_record_type
레코드
name_record
customer_record
SQL*Plus 치환 매개변수
p_name
p_sal
SQL*Plus 전역변수
g_name
g_year_sal
 
코드 들여쓰기
명확성을 위해 또는 읽기 쉽도록 하기 위해 코드를 각 단계별로 들여 씁니다. 구조를 보여주기 위해 Carriage return을 사용합니다.
DECLARE
             v_deptno emp.deptno%TYPE;
BEGIN
             SELECT deptno
                           INTO v_deptno
                           FROM emp
                           WHERE empno = 7788;
             IF v_deptno IN (10,20) THEN
                           UPDATE emp
                                        SET sal = 3500
                                        WHERE empno = 7788;
             ELSE
                           UPDATE emp
                                        SET sal = 2500
                                        WHERE empno = 7788;
             END IF;
END;