본문 바로가기
oracle/[SQL] PLSQL

1장. PL/SQL 시작

by #moonyz 2014. 10. 14.

1. PL/SQL (Procedural Language/SQL)

- ada 라는 언어를 기반으로 오라클에서 제작한 프로그래밍 언어

- 기존 SQL과 PL/SQL을 함께 활용함으로써 효과적으로 데이터베이스에 접근 할수 있다.

- 반복적이거나 조건을 받아서 처리하는 작업에서 편리하게 사용 가능.

- 데이터 트랜잭션 처리능력, 정보보호, 데이터보안, 예외처리 기능, 객체지향 등 데이터베이스 업무 최적화

- 단, 활용도는 아주 좋지만 성능은 느릴 가능성이 있음 (동일한 작업으로 SQL 함수와 PL/SQL 함수를 비교했을때)



2. PL/SQL 런타임 구조



- 데이터베이스에서 처리된 데이터를 PL/SQL이 저장하기 위해서 변수를 선언해야함

- 변수를 잘못선언할 경우 데이터베이스에서 처리된 결과를 PL/SQL 엔진이 사용할수 없음

- SQL 문장이 빨라야 PL/SQL이 빨리 실행된다. (성능상 문제가 되는 부분은 거의 SQL 문장 수행 문제)



[PL/SQL 실행 원리]

① DBA가 PL/SQL이 포함된 블록 실행

② 오라클 서버내에 메모리에 상주해있는 PL/SQL 엔진이 해당블록을 받음 

(application 종류에 따라 오라클 서버 또는 application 서버에 있기도 함)

③ 해당 블록에 있던 모든 SQL문장들은 오라클 서버 프로세스에게 전달되어 수행

④ PL/SQL 엔진은 해당 SQL 문장이 수행되어 결과가 돌아올때까지 기다림 

⑤ 결과를 받고 난후 나머지 PL/SQL 문장 실행

* 요약 : SQL발견시 context변환 >> 오라클 서버 프로세스전달 >> 오라클 서버 프로세스가 SQL 문장 수행 

   >> 값 리턴 >> SQL 리턴값을 받고 PL/SQL 나머지 수행



3. PL/SQL 기본 구조

- 블록구조 : 선언부(Declare), 실행부(Begin), 예외처리부(Exception)

- 중첩블록 (Nested Block) : 블록안에 블록을 포함


[블록 유형]

① Anonymous PL/SQL Block (익명블록)

- 주로 일회성으로 사용할 경우에 많이 사용


② Stored PL/SQL Block (저장된 블록)

- 서버에 파싱해서 저장해 놓고 주기적으로 반복해서 사용할 경우에 많이 사용

- 서브 프로그램, 프로그램단위

- 스키마를 구성하는 오브젝트

- 파싱 된 후 오라클 서버 내부에 저장되거나 오라클 틀 안에 라이브러리 형태로 저장되어있음.


1. Anonymous PL/SQL Block (익명블록)

선언부(Declare) : 모든 변수나 상수를 선언하는 부분

실행부(Begin) : 제어문, 반복문, 함수정의 등의 로직을 기술함

예외처리부(Exception) : 실행 도중 에러발생시 해결하는 문장들을 기술함, 생략가능


- 예약어들은 세미콜론(;)으로 끝나지 않지만, 나머지 명령어들은 SQL처럼 세미콜론(;)으로 끝남


* 처리된 PL/SQL 문장의 결과를 출력하고 싶을때

SQL > SET SERVEROUTPUT ON;


* 오류가 있을경우 오류에 대한 상세내용을 보고 싶을때

SQL > SHOW ERRORS;


- emp 테이블 조회


- emp 테이블에서 empno가 7900번인 사원의 사번과 이름 출력


- 예외처리부 테스트 : emp테이블에 없는 empno번을 입력하여 출력 확인




4. PL/SQL 블록 작성시 기본 규칙과 권장사항

- 문장은 여러줄에 걸쳐질수 있으나 키워드는 분리될 수 없음 (SQL 문법과 동일)

- 블록의 내용을 읽기 쉽도록 공백문자를 사용하여 키워드 또는 문장을 적절하게 분리함으로써 

   의미분석이 되도록 하며, 들여쓰기도 권장

- 예약어는 식별자명으로 사용될 수 없으나, alias로는 사용될 수 있음

   (즉, 이중부호(")를 함께 사용할수 있다. 예: "TABLE")

- 식별자명은 기본 오라클 naming rule을 준수함

- 리터럴(문자, 날짜)은 단일인용부호(')로 표시해야하며 널값은 null 상수로 기술함

- 주석처리를 하고자 할 경우에는 단일행은 --, 복수행은 /* */로 묶음

- PL/SQL 블록내의 명령에서는 오라클 함수를 사용할수 있으나 

   그룹함수와 DECODE함수는 SQL문장에 포함되어야만 사용될수 있음

- PL/SQL 에서 에서처리와 관련된 함수에는 SQLCODE 함수와 SQLERRM 함수가 별도로 존재 (exception)



5. PL/SQL 문 내에서 SQL 문장 사용

PL/SQL 블록내에서 SELECT(조회), DML(데이터조작), 트랜잭션 제어명령 등 지원

- PL/SQL 블록에서 DML문과 TCL문을 사용할 경우 주의사항 몇가지

END 키워드는 트랜잭션의 끝이아닌 PL/SQL 블록의 끝을 나타냄

PL/SQL은 DDL(데이터 정의어) 문을 직접 지원하지 않음 (동적 SQL 사용시 DDL문 실행가능)

PL/SQL은 GRANT 또는 REVOKE와 같은 DCL(데이터 제어문)은 직접 지원하지 않음 (동적 SQL 사용시 실행가능)


(1) PL/SQL 내에서의 SELECT

select select_list 

into variable_name --select_list 항목과 into 절의 변수의 개수와 데이터타입이 동일해야함.

from table

where condition;


예1. professor 테이블에서 교수번호가 1001번인 교수의 교수번호와 급여를 조회한후 변수에 저장해서 화면에 출력


예2. emp2 테이블을 사용하여 사원번호를 입력받아서 사원의 사번과 이름, 생일을 출력하세요.

& 사용자에게 값을 입력받아서 변수에 할당


예3. 교수번호를 입력받은후 professor 테이블을 조회하여 해당 교수의 교수번호, 이름, 부서번호, 입사일 출력



(2) PL/SQL 내에서의 DML : insert, update, delete, merge

- DML을 사용하여 PL/SQL 블록내에서 데이터 변경 가능


① INSERT

에1. pl_test 테이블에 시퀀스와 값 입력


예2. pl_test2 테이블을 생성하여 사용자로 부터 입력받은 번호, 이름, 주소를 pl_test2 테이블에 입력

:= 할당연산자 >> 변수를 선언하면서 사용자에게 입력받은 값을 바로 변수에 할당


② UPDATE

>> no가 2인 행의 name 을 'BBB'로 업데이트



③ DELETE

>> no가 1인 행 삭제



④ MERGE

>> merge 할 테이블 2개 생성 및 데이터 입력


>> PL/SQL 구문 내에서 merge




6. PL/SQL 에서의 Lexical (렉시칼)

- 특정 언어에 포함되는 문자들을 의미하는 영단어

- PL/SQL 안에서 사용되는 문자들을 의미

- 식별자, 구분자, 리터럴, 주석 등


① 식별자

- PL/SQL 객체에게 부여되는 이름 (테이블이름, 변수명 등)

- 식별자 중에서 쌍따옴표로 묶어서 사용가능 ( 대소문자 구분필요한경우, 공백 같은 문자포함, 예약어 사용 등)


② 구분자

- 특별한 의미를 지닌 기호

 +

 더하기

< > 

 부등호 

 -

 빼기 / 부정연산자 

 !=

 부등호 (같지 않다) 

 *

 곱하기 

 ||

 연결 

 /

 나누기 

 --

 단일행 주석 

 =

 등호 

 /*

 주석 시작 

 @

 원격 엑세스 표시자 

 */

 주석 종료 

 ;

 명령문 종료 

 :=

 할당 연산자 


③ 리터럴

- 변수에 할당되는 모든 값

- 식별자가 아닌 모든 문자, 숫자, 부울 또는 날짜 값

문자 리터럴 : 모든 문자열 리터럴은 데이터유형이 CHAR 또는 VARCHAR2  예) abce, 12f

숫자 리터럴 : 정수 또는 실수값 예) 123, 1.23

부울 리터럴 : 부울 변수에 할당된 값 예) TRUE, FLASE, NULL 등


④ 주석

- 프로그래밍 코드의 성능에 영향을 주지 않으면서 나중을 위해서 설명이나 해석등을 기록해두는것



7. PL/SQL 에서 사용되는 주요 연산자들

- SQL에서의 산술연산자, 비교연산자, 논리연산자 등의 사용이 모두 동일

- 연산자 순위를 조절하기 위한 괄호사용 (SQL과 동일)

 **

 제곱 

 +, - 

 일치, 부정 

 *, / 

 곱하기, 나누기 

 +, -, || 

 더하기, 빼기, 연결

 =, <, >, <=, >=, <>, !=, ~=, ^=

IS NULL, LIKE, BETWEEN, IN 

 비교 연산자

 NOT

 논리 부정 연산자 

 AND 

 두 조건 모두 참일 경우 참 반환 

 OR

 두 조건 중 한가지만 참일 경우 참 반환 



8. PL/SQL 에서 블록 구문 작성시 주의사항

- 문자 리터럴이나 날짜 리터럴 사용시에는 반드시 홑 따옴표로 묶어서 표시

- 주석 표시 : 단일행 --, 여러행 /* */ 기호로 표시

- 프로시저 내에서는 단일행 함수만 사용, 그룹함수나 decode함수는 사용 불가능

- 데이터 형변환 주의 : 묵시적 형변환(자동), 명시적 형변환(수동)



'oracle > [SQL] PLSQL' 카테고리의 다른 글

6장. PL/SQL Sub program  (0) 2014.10.16
5장. PL/SQL 예외처리  (0) 2014.10.16
4장. PL/SQL Cursor (커서)  (0) 2014.10.14
3장. PL/SQL 제어문  (0) 2014.10.14
2장. PL/SQL 변수  (0) 2014.10.14

댓글