@markdown
# PL/SQL
____
Oracle's Procedural Language extension to SQL의 약자
SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP,
WHILE, FOR)등을 지원하며, 오라클 자체에 내장되어 있는 절차적 언어로 SQL의 단점을 보완
## PL/SQL 기능
____
- 변수 선언
- 비교 연산 처리
- 반복 실행
## PL/SQL 프로그램 단위
____
- 익명 블록
- 함수
- 프로시저
- 패키지
- 패키지 사양
- 패키지 바디
- 트리거
## PL/SQL 구조
____
- 선언부
- 실행부
- 예외 처리부
- 코드 구조
<pre><code class="sql" class="sql" style="font-size:14px">BEGIN
...
my code
...
END;
/
</code></pre>
- 코드 실행
<pre><code class="sql" class="sql" style="font-size:14px">프로시저를 사용하여 출력해 주는 내용을 화면에 보여주도록 설정
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END;
/
</code></pre>
## PL/SQL 선언부 변수
____
### 스칼라 변수
____
- SQL 자료형과 비슷하게 선언하는 것을 스칼라 변수
- 주요 자료형 : `NUMBER`, `CHAR`, `VARCHAR2`, `DATE`, `TIMESTAMP`
<pre><code class="sql" class="sql" style="font-size:14px">v_empno number(4) := 100;
v_ename varchar2(20) :='lks';
</code></pre>
- `:=` 키워드를 사용하여 보통 프로그래밍 언어의 `=`와 같다. (오른쪽 값을 왼쪽 변수에 대입)
### 레퍼런스 변수
____
- DB 테이블의 특정 칼럼으로 변수 타입을 지정할때 사용
- `변수이름 테이블이름.컬럼이름%TYPE;`
- 테이블에서 컬럼의 자료형이 변경되더라도, PL/SQL에서의 변수 선언부분을 수정할 필요가 없다는 장점이 있다.
<pre><code class="sql" style="font-size:14px">v_deptno emp.deptno%type;
v_job emp.job%type;
</code></pre>
### DML 명령 사용하기
____
- PL/SQL에서 select 문 사용에는 INTO가 필요하다.
- INTO 절에는 select문에서 조회한 데이터를 저장할 변수를 기술한다.
- select 결과의 컬럼과 INTO 절의 변수가 1:1 일치해야만 함
- 하나의 행만 저장할 수 있다.
- 결과는 메모리에 저장되서 사용할 수 있다.
<pre><code class="sql" style="font-size:14px">declare
--스칼라 타입 변수 선언
v_empno number(4) := 100;
v_ename varchar2(20) :='lks';
--특정 칼럼의 레퍼런스 타입 선언
v_deptno emp.deptno%type;
v_job emp.job%type;
begin
--select한 결과를 저장 명령어 : into
select empno, ename, deptno, job
into v_empno, v_ename, v_deptno, v_job
from emp
where empno = 7876;
dbms_output.put_line('번호 : ' || v_empno);
dbms_output.put_line('이름 : ' || v_ename);
dbms_output.put_line('부서 : ' || v_deptno);
dbms_output.put_line('직책 : ' || v_job);
end;
/
</code></pre>
### PL/SQL 테이블 타입
____
- 배열처럼 사용할 수 있는 자료형
- 테이블 타입 정의
<pre><code class="sql" style="font-size:14px">type name_table_type is table of emp.ename%type
index by binary_integer;
</code></pre>
- 테이블 타입 선언
<pre><code class="sql" style="font-size:14px">v_emps name_table_type;
</code></pre>
- binary_integer 선언(for문에 사용되는 index)
- `i binary_integer := 0;`
- 반복문을 수행하면서 테이블 타입에 저장한다.
<pre><code class="sql" style="font-size:14px">for v_rec in(select ename, job from emp where deptno = v_dept) loop
i:=i+1;
v_emps(i) := v_rec.ename;
v_jobs(i) := v_rec.job;
dbms_output.put_line('이름 : ' || v_emps(i) || '--' || v_rec.ename);
dbms_output.put_line('직업 : ' || v_jobs(i) || '--' || v_rec.job);
end loop;
</code></pre>
### PL/SQL 레코드 타입
____
- C언어의 구조체와 비슷한 자료형
- 테이블의 Row를 읽어올 때 편리하다.(레코드 집합을 하나로 묶어줌)
- 가져온 데이터의 개별 컬럼을 참조, 초기화하기 위해서는 `.` 사용하여 가져온다.
- 레코드 타입 정의
<pre><code class="sql" style="font-size:14px">type emp_rec_type is record(
v_empno emp.empno%type,
v_ename varchar2(20),
v_sal emp.sal%type,
v_hiredate emp.hiredate%type
);
</code></pre>
- 레코드 변수 선언 : `v_emp emp_rec_type;`
## PL/SQL 문법
____
### if문
____
<pre><code class="sql" style="font-size:14px">IF(조건) THEN
...
ELSIF(조건) THEN
...
END IF
</code></pre>
### while문
____
<pre><code class="sql" style="font-size:14px">WHILE N <= 5 LOOP
DBMS_OUTPUT.PUT_LINE( N );
N := N + 1;
END LOOP;
</code></pre>
### for문
____
<pre><code class="sql" style="font-size:14px">FOR N IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE( N );
END LOOP;
</code></pre>
'PL SQL' 카테고리의 다른 글
PL/SQL - 프로시저, 함수, 커서, 패키지, 트리거 (0) | 2017.05.19 |
---|---|
PL/SQL 연습 (0) | 2017.05.18 |