PL/SQL - Oracle's Procedural Language extension to SQL
SQL문장에서 변수 정의, 조건 처리(IF),반복처리(LOOP, WHILE,FOR)등을 지원하며, 오라클 내부에 절차적 언어로서(Procedure Language)로서 SQL의 단점을 보완
1.변수 선언할수 있음
2.비교 처리할수 있음
3.반복 처리할수 있음
PL/SQL 은 PASCAL 유사한 구조로 DECLARE~BEGIN~EXCEPTION~END순서를 갖는다. PL/SQL은 블록(BLOCK)구조의 언어로서 3부분을 나뉨
1. DECLARE SECTION(선언부)
2. EXECUTABLE SECTION(실행부)
3. EXCEPTION SECTION(예외 처리부)
1.선언부 (DECLARE SECTION)
PL/SQL 에서 사용되는 모든 변수나 상수를 선언하는 부분 DECLARE로 시작
2. 실행부(EXECUTABLE SECTION)
절차적 형식으로 SQL문을 실행할 수 있도록 절차적 언어의 요소인 제어문,반복문,함수 정의 등 로직을 기술할 수 있는 부분으로 BEGIN으로 시작.
3. 예외처리분(EXCEPTION SECTION)
PL/SQL문이 실행되는 중에 에러가 발생할 수 있는데 이를 예외 사항이고 이런 예외사항을 해결하기 위한 문장을 기술할 수 있는 부분으로 EXCEPTION으로 시작
PL/SQL 작성요령
- 블록내에서는 한문장이 종료될 때 마다 세미클론(;) 을 사용
- END뒤에 ; 사용하여 하나의 블록이 끝났다는것을 명시
- 블록은 파일로 작성할수도 있고프롬프트에서 바로 작성할수도 있음
- SQL*PLUS 환경에서는 DELCLARE나 BEGIN이라는 키워드로 PL/SQL 블록이 시작하는 것을 알수 있다.
- 단일행 주석은 --이고 여러행 주석은 /* */ 이다.
- 쿼리문을 수행하기 위해서 /가 반드시 입력되어야 하며 PL/SQL블록은 행에 /가 있으면 종결된 것으로 간주
-----------------------------------------
--간단한 소스.
SET SERVEROUTPUT ON;
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello PL/SQL!');
END;
/
-------------------------------------------
변수 선언
VNO NUMBER(4);
VNAME VARCHAR2(10);
VNO := 10;
VNAME := 'NICE';
예제)
------------------------------------------------
SET SERVEROUTPUT ON;
DECLARE
VNO NUMBER(4);
VNAME VARCHAR2(10);
BEGIN
VNO := 7;
VNAME := 'NICE';
DBMS_OUTPUT.PUT_LINE('번호/이름');
DBMS_OUTPUT.PUT_LINE('---------------------');
DBMS_OUTPUT.PUT_LINE(VNO||'/'||VNAME);
END;
/
-------------------------------------------------------
아래의 예제는 이데이터를 기준으로
스칼라 변수,레퍼런스 변수
스칼라 변수 는 일반적으로 그냥선언해서 쓰는 변수를 스칼라 변수
레퍼런스 변수는 이전엔 선언된 변수나 데이터베이스 컬럼에 맞추서 선언
레퍼런스변수 예제
--------------------------------------------------
SET SERVEROUTPUT ON;
DECLARE
VTEST TEST_02%ROWTYPE; //변수의 컬럼을 그대로 가져옴.
BEGIN
VTEST.NO:=10; //이렇게 변수를 사용하지.
DBMS_OUTPUT.PUT_LINE(VTEST.NO); //쉽징?
END;
/
-----------------------------------------------------
SELECT INTO
- DB에 있는 값을 변수에 대입할수 있음.
예제소스
---------------------------------------------------------
SET SERVEROUTPUT ON;
DECLARE
VTEST TEST_02%ROWTYPE;
BEGIN
SELECT * INTO VTEST
FROM TEST_02
WHERE NO=2;
DBMS_OUTPUT.PUT_LINE(VTEST.NO);
DBMS_OUTPUT.PUT_LINE(VTEST.ADDRESS);
END;
/
TABLE TYPE은 한가지 데이터만 읽어오므로 테이블의 ROW를 읽어올땐 TABLE TYPE를 여러개 선언하여야 한다.
이걸 한번에 읽어올수 있는게. 있는데 에게봐라 RECORD TYPE다.
IF ~THEN~END IF
IF(VNO=10) THEN
VNAME='3434';
END IF;
선택문이였고
IF ~ THEN ~ELSE~END IF
IF(VNO=19) THEN
VNAME='11919';
ELSE
VNAME='3939';
END IF;
이것은 IF ELS문이고
IF~THEN ~ELSIF ~THEN ~END IF
이런문도 있음
LOOP
EXIT;
END LOOP;
루프이고..
FOR문은
FOR N IN 1..5 LOOP
PRINT N;
END LOOP
WHILE
WHILE N<=5 LOOP
N
END LOOP;
'Oracle' 카테고리의 다른 글
오라클 오브젝트 LOB에 대해서 (0) | 2014.12.02 |
---|---|
탑엔분석? TOP N QUERY 탑엔쿼리 (0) | 2014.12.02 |
오라클 동의어 (0) | 2014.11.13 |
오라클 롤 권한을 일일이 부여하지 않고 묶음 패키지 관리자가 정의도 가능 (0) | 2014.11.13 |
오라클 데이터베이스 보안 과 권한 (0) | 2014.11.13 |