PLSQL02_기본문법
기본문법
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
-