PLSQL02_기본문법

2 minute read



기본문법

  • DBMS_OUTPUT.PUT_LINE( ); 는 자바의 System.out.println( );과 같다.

    1. Block

    1-1. 구조

DECLARE
  V_EMPNO NUMBER(4)   :=0;
  V_ENAME VARCHAR2(10);
  V_DEPTNO NUMBER(2);
BEGIN
  V_EMPNO := 7778;
  V_ENAME := 'PL/SQL';
  INSERT INTO EMP(EMPNO, DEPTNO, ENAME) VALUES(V_EMPNO, V_DEPTNO, V_ENAME);
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('INSERT ERR : '||SQLERRM);
    ROLLBACK;
END;
/
  • SQLERRM : 오류메시지 반환
  • WHEN 예외명 THEN 예외처리구문

    WHEN OTHERS THEN 예외처리 구문 : 구체적인 예외명을 알 수 없을 때 사용.

  • Block 종류
    • Named Block : Stored Block
      • Block Name이 있다.
      • DBMS Server내에 저장
      • Client Process가 DBMS Server내에 저장되어있는 Block을 호출하여 실행
    • Anonymous Block
      • Block Name 없다.
      • Client Program 내에 저장되어 있거나, 별도의 SQL Script 파일 형태
      • 실행시마다 Client Program에서 해당 Block Source를 DBMS 서버에 전달하여 실행


2. 변수

  • DECLARE 에서 변수 정의하고 초기화
  • 관계형 테이블 컬럼 정의와 구조가 동일
  • 변수를 정의만 한 경우 NULL 지정
  • NOT NULL 이나 CONSTRAINT로 정의하여 제약사항 정의가능


3. 연산자

  • 산술연산자 : + , / , * ,-,**
  • 비교연산자 : = , != , <> , ~=, <, >, <=, >=
  • 논리연산자 : AND,OR,NOT
  • SQL연산자 : LIKE, BETWEEN,IN, IS NULL


4. 조건식

  • ELSE IF 가아니라ELSIF
  • END IF 부분도. 문장종결자;
  • condition이 TRUE인경우 실행되고 FALSE, NULL인 경우 패스


5. 반복문

  • LOOP ~ END LOOP;
DECLARE
    LOOP_INDEX  NUMBER(4) := 1;
    MAX_LOOP_INDEX NUMBER(4) := 30;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE('LOOP CNT => '||TO_CHAR(LOOP_INDEX));
        
        LOOP_INDEX := LOOP_INDEX+1;
        EXIT WHEN MAX_LOOP_INDEX < LOOP_INDEX;
    END LOOP;
END;
/
  • FOR ~ LOOP ~ END LOOP;
    • 작은값..큰값으로 작성해야한다. 안그러면 출력안됨.
    • REVERSE가 있어야 거꾸로 출력됨!
DECLARE
    LOOP_INDEX  NUMBER(4) := 1;
    MAX_LOOP_INDEX NUMBER(4) := 30;
BEGIN
      FOR LOOP_INDEX IN 1..30 --(O)
    --  FOR LOOP_INDEX IN 30..1 --(X)
    --  FOR LOOP_INDEX IN REVERSE 1..30 --(O)
    --  FOR LOOP_INDEX IN REVERSE 30..1 --(X)
    LOOP
        DBMS_OUTPUT.PUT_LINE('LOOP CNT => '||TO_CHAR(LOOP_INDEX));
    END LOOP;
END;
/
  • WHILE ~ LOOP ~ END LOOP;
    • TRUE일 동안 반복
    • NULL 결과 X
DECLARE
  --  V_INDEX NUMBER(3) := 0;
  --  V_INDEX NUMBER(3);
    V_INDEX NUMBER(3) := 30;
BEGIN
  WHILE(V_INDEX >= 0)
  LOOP
    DBMS_OUTPUT.PUT_LINE('WHILE LOOP [ '||TO_CHAR(V_INDEX)||' ]');
    V_INDEX := V_INDEX -1;
   END LOOP;
END;
/




6. NULL

DECLARE
  V_NUM1 NUMBER(4,2);
  V_NUM2 NUMBER(4,2) := 30;
BEGIN
  IF (V_NUM1 >1 AND V_NUM2 <31) THEN -- NULL AND TRUE 결과는?
    DBMS_OUTPUT.PUT_LINE('(V_NUM1 > 1 AND V_NUM2 < 31) IS TRUE ');
  ELSIF NOT (V_NUM1 > 1 AND V_NUM2 <31 ) THEN
    DBMS_OUTPUT.PUT_LINE('(V_NUM1 > 1 AND V_NUM2 < 31) IS FALSE ');
  ELSE
    DBMS_OUTPUT.PUT_LINE(' NOT TRUE, NOT FALSE... ???? ');
  END IF;
END;
/
  • 결과 : ELSE의 ‘ NOT TRUE, NOT FALSE… ???? ‘가 나온다.
    • NULL은 비교연산했을 시 NULL이다.
    • NULL과 BOOLEAN을 AND연산으로 비교했을 경우 FALSE와 비교했을 때만 FALSE가되고, TRUE일 경우에는 NULL을 반환한다.
    • NULL과 BOOLEAN을 OR연산의 경우 TRUE와 NULL을 비교할 경우 TRUE, FALSE와 비교했을 경우 NULL이 된다.

6-1. NULL과 BOOLEAN연산

  • AND연산
    • AND TRUE FALSE NULL
      TRUE TRUE FALSE NULL
      FALSE FALSE FALSE FALSE
      NULL NULL FALSE NULL
  • OR연산
    • OR TRUE FALSE NULL
      TRUE TRUE TRUE TRUE
      FALSE TRUE FALSE NULL
      NULL TRUE NULL NULL
  • NOT
    • NOT -
      TRUE FALSE
      FALSE TRUE
      NULL NULL