본문 바로가기

PL SQL

PL/SQL - 기초(구조, 변수, 문법)

@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