반응형

PL/SQL (ORACLE'S PROCEDURAL LANGUAGE EXTENSION TO SQL)

- 오라클 자체에 내장되어 있는 절차적 언어 (PROCEDURAL LANGUAGE)로서,
 SQL의 비절차적 언어의 단점을 보완, 확장한 언어
- SQL문장에서 변수 정의, 조건(IF), 반복(LOOP, WHILE, FOR) 처리 등을 지원
- 블록(BLOCK) : PL/SQL 프로그램의 기본 단위
- 데이터에 대한 조작을 SQL만으로 처리하는데 한계가 있는 경우,
 DB안에서 데이터 값에 대한 처리를 하고 싶은 경우 (함수-리턴값o, 프로시저-리턴값x, 트리거 등) 사용
1. 절차적 언어
- 개발자가 처리 절차(순서, 방법)을 처음부터 끝까지 정해야함
2. 비절차적 언어
- 개발자가 처리절차를 지정하지 않고 원하는 결과를 정의하여 요청
구성
- DECLARE(선언부)
: 기술선택, 실행에 사용될 변수, 상수,커서 등을 선언
- BEGIN(실행부) ~ END
: 기술필수, 조건문,반복문,SELECT, DML,함수 등을 정의
- EXCEPTION(예외 처리부)
: 기술선택, PL/SQL 실행 도중 발생하는 오류 (예외상황)를 해결하는 문장 서술
PL/SQL 작성 주의사항
1. PL/SQL 블록을 구성하는 DECLARE, BEGIN ~ [;] END, EXCEPTION 키워드에는 세미콜론(;)을 사용하지 않는다.
 (단, BEGIN문 안에 기술하는 SQL명령문에는 세미콜론을 사용해야 한다.)
2. PL/SQL블록의 각 부분에서 실행해야 하는 문장 끝에는 세미콜론 (;)을 사용.
 ex) DBMS_OUTPUT.PUT_LINE('HELLO.PL/SQL !' ) ;
3. SQL에서와 마찬가지로 PL/SQL내부에서도 주석 사용가능
- 한 줄 주석 : --
- 여러 줄 주석 : /* 주석내용 */
4. PL/SQL문 작성을 마치고 실행하기 위해 마지막에 슬래시(/)를 사용(SQLDeveloper에서는 생략 가능)
5. 선언조건 (권장)
- 변수 : 변수 앞에 v를 붙여 준다. variable 약자
- 상수 : 상수 앞에 c를 붙여 준다. constant 약자
- 매개변수 : 매개변수 앞에 p를 붙여 준다. parameter 약자

익명블록(ANNOYMOUS BLOCK) 형식 

: 이름없이 선언된 PL/SQL문 DECLARE
    VEMPNO NUMBER(4); --NULL
    VENAME VARCHAR2(10);--NULL
BEGIN
    VEMPNO := 7788;
    VENAME := 'SCOTT';
    DBMS_OUTPUT.PUT_LINE('사번 / 이름');
    DBMS_OUTPUT.PUT_LINE('----------');
    DBMS_OUTPUT.PUT_LINE(VEMPNO || '/' || VENAME);
END;
SYNTAX

[ DECLARE -- 선언부(DECLARE SECTION)
     변수나 상수를 선언
BEGIN -- 실행부(EXECUTABLE SECTION)
     SQL문 --- ;
     제어문, 반복문, 출력문
     커서 사용
   [ EXCEPTION -- 예외 처리부(EXCEPTION SECTION)
END;
BEGIN
    DECLARE
    var VARCHAR2(15);
    BEGIN
    VAR := '안녕 PL/SQL' ;
    DBMS_OUTPUT.PUT(var);
    DBMS_OUTPUT.PUT_LINE('hello PL/SQL');
    END;
    DBMS_OUTPUT.PUT_LINE('바깥 BEGIN문 종료');
END;

--DECLARE 선언부를 BEGIN 실행부 이내에 기술 시 BEGIN절을 중첩하여 사용가능

DBMS_OUTPUT

- java의 System.out 객체와 유사 DECLARE 
    var VARCHAR2(15);
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello Oracle~');
    VAR := '안녕 PL/SQL' ;
    DBMS_OUTPUT.PUT(var||' ');
    DBMS_OUTPUT.PUT_LINE('hello');
    DBMS_OUTPUT.NEW_LINE;
    DBMS_OUTPUT.PUT_LINE('PL/SQL');
END;
DBMS_OUTPUT패키지는 문자열 출력을 위해 3가지 프로시저를 지원함
- PUT_LINE : 문자열을 출력한 다음 라인으로 이동.
- PUT : 문자열을 출력한 후 대기. 반드시 다음 줄로 넘어갈 수 있는 무언가가 지정되어있어야 한다.
- NEW_LINE : 다음 라인으로 이동. 매개인자값 입력x

--System.out.printl()과 다르게 값을 입력해야 한다.

SET SERVEROUTPUT ON  

- DBMS_OUTPUT이 정상 작동하도록 설정을 ON하는 기능
- SET SERVEROUTPUT ON을 기술해주지 않으면 출력결과를 확인하기가 어렵다.
 단, SQLDeveloper에서는 생략가능

연산자 

 
제곱연산자 : **  ex)2**3 => 2의3승
부호연산자 : +(양수), -(음수) 식별 연산자  
산술연산자 : + (덧셈), -(뺄셈), *(곱셈), /(나눗셈몫)  
논리연산자

- NOT (부정을 의미)
- AND : 교집합을 의미 (둘 다 참인 경우만 참, 참 없이 둘 중 하나라도 FALSE인 경우 FALSE, TRUE가 존재하고 둘 중 하나라도 NULL이면 NULL)
- OR : 합집합을 의미 (둘 중 하나라도 TRUE인 경우엔 TRUE, TRUE없이 NULL NULL, NULL FALSE조합이면 NULL)
비교연산자 
=, <, >, <=, >=, <>, !=, ~=, \^=  
BETWEEN 값1 AND 값2  
IN  
LIKE   
IS NULL
IS NOT NULL
 

데이터 타입

 
- 스칼라타입 : 숫자(NUMBER), 문자(CHAR, VARCHAR2), 날짜(DATE, TIMESTAMP), BOOLEAN 등
- 스칼라변수 : SQL자료형과 비슷하게 선언하는 변수를 말함.
- DBMS_OUTPUT 출력문을 통해 출력가능(BOOLEAN제외)  

--ORACLE에서의 BOOLEAN자료형
--값 : TRUE, FALSE, NULL값을 가질 수 있다. 
 (대소문자 섞어 사용 가능)
--DBMS_OUTPUT으로 바로 값을 출력할 수 없다.(오류)
 

변수 VARIABLE 

- 테이블의 컬럼 정의와 구조가 동일하다.
SYNTAX
변수명 자료형(데이터타입) ;
변수명 자료형(데이터타입) :=초기값;
변수명 자료형(데이터타입) [NOT NULL] [ :=초기값 ];
* := PL/SQL에서의 대입연산자
- 변수를 초기화 하지 않고 정의만 한 경우는 해당 변수에 NULL값이 지정된다.
- 변수 정의시 NOT NULL이나 CONSTANT로 정의하여 변수의 데이터에 일부제약(CONSTRAINT) 사항을 정의할 수도 있다.
- 초기값 대입없이 선언만 한 경우, 자료형 상관 없이 모두 NULL을 가짐

상수 CONSTANT 

- 한 번 값을 할당 받으면 변하지 않는 수
SYNTAX
상수명 CONSTANT 자료형(데이터타입) : =상수값;
*꼭 CONSTATNT 키워드를 붙여야 한다.
**꼭 선언과 동시에 초기화도 해주어야 한다.
변수, 상수
DECLARE -- 변수 선언
    va INTEGER := 2**2*3**2;
    vb POSITIVE := 5; --0미포함 양수, 1이상의 양수, NULL가능
    vc SIGNTYPE ; -- -1, 0, 1, NULL만 가능
    vd NATURALN := 0; -- 0포함 양수, NULL불가
    ce constant VARCHAR2(20) := '상수 테스트' ;
BEGIN
    /*
    여러줄 주석 : 실행부
    DBMS_OUTPUT을 이용한 변수 값 출력
    */
    --에러
    --Ce : '상수값 변경';
    DBMS_OUTPUT.PUT_LINE('va = '||va||', vb = '||vb||', vc = ' ||vc|| ', vd = '||vd);
    DBMS_OUTPUT.PUT_LINE('va = '|| TO_CHAR(va));
    DBMS_OUTPUT.PUT_LINE('상수 ce = '||ce);
END;​
va = 36, vb = 5, vc = , vd = 0
va = 36
상수 ce = 상수 테스트

 

 

반응형
DECLARE 
    --테이블의 컬럼의 데이터타입과 일치시켜 주는 것이 좋다. 에러 예방
    --스칼라 변수 선언
    VEMPNO NUMBER(4); --NULL >
    VENAME VARCHAR2(10); --NULL >
    VDEPTNO NUMBER(2); --NULL >
    VDNAME VARCHAR2(14); --NULL >
BEGIN
    --테이블 안의 데이터를 받아오는 경우 SELECT절 안에 INTO를 이용한다.
    --SELECT절 컬럼의 데이터타입, 개수, 순서와
    --INTO절의 변수의 데이터타입, 개수, 순서가 일치해야한다.
    --SELECT절 출력값이 한 줄이여야 한다.
    SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
    --변수 대소문자 구분 안 함.
    INTO vempno, vename, vdeptno, vdname
    FROM EMP E, DEPT D --[INNER JOIN]
    WHERE E.DEPTNO = D.DEPTNO AND E.ENAME ='SMITH'; --[JOIN조건]
    
    DBMS_OUTPUT.PUT_LINE('사번/이름/부서번호/부서명');
    DBMS_OUTPUT.PUT_LINE('---------------------');
    DBMS_OUTPUT.PUT_LINE(VEMPNO||'/'||VENAME||'/'||VDEPTNO||'/'||VDNAME);
END;
사번/이름/부서번호/부서명
---------------------
7369/SMITH/20/RESEARCH

 

반응형

'[ORACLE]' 카테고리의 다른 글

[ORACLE] PL/SQL - NDS  (1) 2024.01.25
[ORACLE] PL/SQL - LOOP, FOR LOOP, WHILE LOOP  (0) 2024.01.25
[ORACLE] 집합연산자 UNION, UNION ALL, INTERSECT, MINUS  (0) 2024.01.24
[ORACLE] MERGE  (0) 2024.01.23
[ORACLE] PSEUDO - ROWNUM  (0) 2024.01.23

+ Recent posts