2. PL/SQL 변수.
[기타SQL]/PL_SQL 2014. 10. 13. 11:38 |2장. PL/SQL 변수.
1.
1) 변수를 사용하는 이유.
- 변수는 데이터의 임시 저장 영역입니다.- 저장된 값을 조작하기 위해 사용합니다.
- 저장된 값을 반복해서 재 사용할 수 있습니다.
2) 변수의 규칙.
- 반드시 문자로 시작해야만 합니다.
- 문자나 숫자, 특수문자를 포함할 수 있습니다.
- 변수명은 30 bytes 이하여야 합니다.
- 예약어를 포함하면 안됩니다. (SELECT, FROM, WHERE)
3) 변수의 작업 순서.
- 선언부에서 선언되고 원한다면 특정 값으로 초기화도 가능합니다.
- 실행부에서 실행되면서 값이 할당이 됩니다.
- 서브 프로그램의 파라미터로 전달되기도 하며 서브 프로그램의 출력결과를 저장하기도 합니다.
2. 주요 변수들의 종류 ★★
- 파라미터(parameter) : 서브 프로그램과 값을 (상호)전달하는 역할 담당. (매개변수(argument)라고 부름)
즉 파라미터에 값을 담아서 서브 프로그램에게 전달해 주고 반대로 서브 프로그램(프로시저, 함수, 패키지, 트리거 등)에서 수행 한 결과값을 파라미터에 담아서 변수로 가져오기도 한다.
- PL/SQL 변수는 기억장소로서 메모리에 확보되는데, 이 변수의 동작 범위는 해당 블록시작에서부터 해당 블록 종료되는 시점까지이다.
즉 블록의 실행이 시작되면 메모리 공간에 해당 변수의 값만큼 공간 확보가 되고, 블록의 실행이 종료가 되면 변수는 메모리에서 제거된다.
-> 변수의 Scope Rule : 만약 블록이 새롭게 실행된다고 해도 이전 실행에서 할당되었던 값을 그대로 재사용할 수는 없다.
만약 모든 블록에서 공통적으로 사용될 전역변수(Global Variable)를 선언하고자 한다면 패키지를 만들어서 사용해야 한다.
1) 단순 변수
- Scalar(스칼라) 변수 와 Reference 변수
(1) Scalar 변수 : 단일 값을 가지는 변수의 데이터 형을 직접 지정해 주는 변수
[문법]
Identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
|
* Identifier : 변수의 이름 (다른 변수와 구별되는 식별자의 역할)
- 블록 내에서는 유일해야 한다.
- 오라클 Naming Rule에 합당한 이름을 지정해야 한다.
* CONSTANT : 읽기전용 변수. 즉 상수로 선언하기 위한 키워드.
- 기본적으로 초기값이 반드시 지정되어야 한다. (값이 없을 경우에는 생략이 가능합니다)
예) V_RATE CONSTANT NUMBER := 0.2;
* Datatype
- %TYPE 을 사용하여 테이블내의 컬럼과 동일한 데이터 형을 선언할 수도 있고, %ROWTYPE 을 사용하여 테이블의 레코드 구조와 동일 형태의 레코드를 선언할 수도 있다.
* NOT NULL : 항상 값을 가지도록 제약을 주는 키워드.
- 초기값이 반드시 지정되어야 하며, 없을 경우 생략가능.
예) V_NAME VARCHAR2(14) NOT NULL := ‘이순신’;
* := 또는 DEFAULT : 변수에 기본값을 할당하기 위한 키워드.
예) V_DATE DATE DEFAULT SYSDATE;;
* expr : 변수에 부여할 기본값.
- 단순한 값에서부터 다른 변수, 수식, 함수가 올 수 있다.
* 기타 변수 : PL/SQL 블록이 실행되는 환경(Precompiler, iSQLPlus, …)에서 선언한 변수로, 실행환경과 블록내부에서 참조된다.
* 주요 스칼라 변수 선언 예
Vno number(5,3) |
숫자를 저장하는 변수로 총 5자리이며 소수점이하 3자리. |
Vname varchar2(10) |
문자를 저장하는 변수로 총 10 바이트의 길이. |
Vday date |
날짜 저장 |
(2) 주요 Scalar 변수의 데이터 타입
CHAR [(최대길이)] |
고정 길이의 문자. (기본 최소값 : 1) 최대 32,767 바이트값을 저장. |
VARCHAR2 (최대길이) |
가변 길이의 문자. (기본값 없음.) 최대 32,767 바이트 값을 저장. |
NUMBER [(전체자리수, 소수점이하 자리수)] |
전체 자리수와 소수점 이하의 자리수를 가진 숫자. 소수점 이하 자리수의 범위 : -84 부터 127 까지 |
BINARY_INTEGER |
-2,147,483,647 - 2,147,483,647 사이의 정수를 저장하는 타입. |
PLS_INTEGER |
-2,147,483,647 - 2,147,483,647 사이의 부호 있는 정수. |
2) Reference 변수 : (참조 변수) 변수의 데이터 형을 다른 컬럼에서 참조 후 지정하는 방식.
저장되어야 할 정확한 데이터 형태를 모를 경우 해당 데이터가 들어 있는 컬럼의 정보를 참조하게끔 설정.
Vno emp.empno%TYPE <- emp 테이블의 empno와 동일한 데이터형으로 선언함
Vname emp.ename%TYPE <- emp 테이블의 ename 과 동일한 데이터형으로 선언함.
Vrow emp%ROWTYPE <- emp 테이블의 여러 컬럼을 한꺼번에 저장할 변수로 선언함. 예를 들어 tno number , tname varchar2(10) ,tday date 로 이루어진 test 테이블이 있을 경우, test%ROWTYPE 으로 선언되면 하나의 변수에 위의 세가지(number, varchar2(10) ,date )를 모두 저장 할 수 있는 변수로 선언이 된다.
(1) TYPE 변수를 사용하여 데이터 조회하기
emp3 테이블에서 empno가 7900 번인 사원의 empno, ename , sal 을 조회하여 화면에 출력.
[준비과정]
- emp 테이블을 복사해서 emp3 테이블을 아래와 같이 생성.
SCOTT>CREATE TABLE emp3
|
- 조회하기.
SCOTT>SET SERVEROUTPUT ON; SCOTT>DECLARE 4 vsal emp3.sal%TYPE ; 7900 JAMES 950 |
(2) ROWTYPE 변수를 활용하여 데이터 출력하기
앞의 예 1번에서 출력했던 내용을 ROWTYPE 변수를 사용하여 출력.
SCOTT>SET SERVEROUTPUT ON;
|
(3) ROWTYPE 변수를 활용한 데이터의 입력
[준비과정]
SCOTT>CREATE TABLE row_test SCOTT>CREATE TABLE row_test2
|
- ROWTYPE변수 활용한 데이터입력.
SCOTT>SELECT * FROM row_test2;
|
(4) ROWTYPE 변수를 활용한 데이터의 변경
SCOTT>DECLARE
|
변수 예제 2. 사용자로부터 두 개의 숫자를 입력 받아서 합을 구하세요.
SCOTT>SET VERIFY OFF
|
2) 복합 변수 (조합 변수)
: 변수 하나 안에 사용자가 원하는 여러 가지 다른 유형의 데이터를 포함해서 사용자가 원하는 새로운 형태로 만드는 형태.
동일한 데이터 타입의 데이터를 여러 건 저장하고 싶을 경우 컬렉션 타입 (Table 타입)을 많이 사용하고
데이터 타입이 다른 여러 건을 저장할 경우 레코드 타입의 변수를 많이 사용한다.
(1) Record Type 복합 변수
* 테이블 기반(커서기반)의 Record Type : %ROWTYPE을 사용. (해당 테이블과 동일한 구조의 Record Type 변수가 생성.)
* 프로그래머 정의 기반 Record Type : 사용자가 원하는 컬럼만을 지정해서 만듦.
[문법]
* PL/SQL Record 정의와 선언
|
① 정의 부분 :
- type_name 은 RECORD 유형의 이름으로, 일반적인 프로그래밍 언어에서 사용되는 구조체와 비슷한 유형.
- 여러 가지 유형의 변수가 하나의 레코드(구조체) 단위로서 처리되며, 레코드 내의 변수(필드)를 참조할 경우에는 type_name.field_name 과 같은 방식으로 사용.
(참고적으로 테이블내의 행 구조와 동일하게 레코드 변수를 선언하고자 할 경우에는 %ROWTYPE 키워드를 사용).
- Field_declaration 은 일반 변수의 선언과 동일한 문법형태를 사용.
- 메모리에 공간이 확보되지는 않으며 단지 복합데이터형에대한 정의만 이루어짐.
② 선언 부분 :
- 복합형데이터는 우선 정의를 하고 해당 정의를 통해 실제 복합 변수를 선언하는 단계로 구성.
- 즉 정의부분에서 원하는 형태의 새로운 데이터 형을 생성한 후, 선언 부분에서 별도로 선언을 해야만 사용이 가능하며, 이 선언부분에서 실제 복합 변수에 대한 기억공간이 확보된다.
- 프로그래머 정의 Record Type 변수 사용 예 1:
Record type 변수를 활용하여 부서번호가 30번인 부서의 부서번호와 부서명과 지역명을 Record type 변수에 저장한 후 출력.
(record type 의 type 명은 dept_record_type)
SQL> SET SERVEROUTPUT ON 8 9 BEGIN
|
SCOTT> DECLARE 7 vtel emp2.tel%TYPE,
|
(2) Table Type 변수 (컬렉션 타입)
1 개의 컬럼만 저장을 하지만 Row Type 을 사용하여 Record Type 과 같이 여러 가지 유형의 데이터 컬럼을 가질 수도 있다. (권장하지 않음.)
Table Type변수에는 연관 배열(가장 많이 사용), 중첩 테이블, VARRAY 세가지 종류가 있다.
* 연관배열 : 두 개의 칼럼으로 이루어진 형태.
Key 부분이 가상의 Primary Key 가 되어 인덱스로 사용하며 데이터를 구분. Key 컬럼의 값은 사람이 임의로 조정 할 수 없다. (오라클 8 과 8i 버전에서는 연관 배열을 INDEX BY Table 이라고도 한다.)
- (Unique) Key 열
입력되는 데이터의 종류에 따라 스칼라 데이터 유형 또는 레코드 데이터 유형으로 나눠진다. 스칼라 데이터 유형의 열은 행당 하나의 값만 보유할 수 있지만, 레코드 데이터 유형의 열은 행당 여러 값을 보유할 수 있다.
|
* 연관 배열의 주요 특성
- 연관 배열은 변수 선언 당시 채워지지 않으며, 키나 값을 포함하지 않으므로 선언에서 연관 배열을 초기화할 수 없다.
- 연관 배열을 채우려면 명시적 실행문이 필요.
- 데이터베이스 테이블의 크기와 마찬가지로 연관 배열의 크기에도 제약이 없다.
따라서 새 행이 추가됨에 따라 연관 배열이 증가하도록 행 수가 동적으로 늘어날 수 있다.
- 키는 순차적이 아닐 수 있으며 양수 및 음수일 수 있다.
* PL/SQL Table (컬렉션 타입) 정의와 선언
[문 법]
|
① 정의부분 :
- type_name : 동일한 유형의 데이터(또는 데이터 구조)들을 하나의 연속적인 메모리 공간에 확보하기 위해 사용. (Record Type은 다른 유형의 데이터 타입 사용.)
- INDEX BY 절 : 그 배열내의 요소(element)에 접근하기 위한 첨자(위치) 값으로 사용, 범위는 BINARY_INTEGER 의 범위(-2,147,483,647 - 2,147,483,647 사이의 정수) 에 속한다.
② 선언부분 : 기본적으로 복합형의 데이터는 우선 정의를 하고 해당 정의를 통해 실제 복합 변수를 선언하는 단계로 구성.
Record Type 형태와 사용방법은 동일하며 이 선언부분에서 실제 복합 변수에 대한 기억공간이 확보된다.
(정의 부분에서는 메모리에 공간이 확보되지는 않으며 단지 복합 데이터 형에 대한 기술이 이루어지는 부분입니다)
- Table Type 변수 사용 예 1:
Table Type 변수를 사용하여 사원번호가 7499 인 사원의 이름을 조회해서 해당 변수에 저장 한 후 출력하세요.( Table Type 명은 tbl_emp_name)
SQL> SET SERVEROUTPUT ON 11 SELECT ename INTO t_name
|
Table Type 변수 사용 예 2: 커서를 사용해서 생성하는 방법
professor 테이블의 rowtype 을 가지는 prof_table_type 이라는 이름으로 새로운 타입을 생성 한 후 v_prof_row 라는 변수에 할당합니다. 그리고 v_prof_row 변수의 첫 번째 행 (0번 행)에 데이터를 입력 한 후 화면에 출력합니다.
SCOTT>SET SERVEROUTPUT ON; 12 DBMS_OUTPUT.PUT_LINE(v_prof_row(0).profno||' '||v_prof_row(0).name||' '||
|
* 참고 *
- 여러 건의 데이터 중 행을 지정하여 지우고 싶은 경우 변수이름.delete(행번호); - 해당 변수의 모든 행을 다 지우고 싶은 경우. 변수명.delte ; - 변수에 아주많은 데이터가 들어가있을 경우, 가장 첫번째 값과 가장 마지막값 조회하고 싶은 경우. 변수이름.first 변수이름.last
|
- Table Type 변수 사용 예 3: For 반복문을 사용하여 변수에 여러 건의 데이터를 입력하는 방법.
SQL> DECLARE 16 END ;
|
3. 비 PL/SQL 변수 : PL/SQL 안에서만 사용되는 것이 아니라 외부에서도 사용될 수 있는 변수.
* 바인드 변수 (호스트 변수 : 호스트 환경에서 생성되어 데이터를 저장하므로 호스트 변수라고도 부름.)
- VARIABLE 키워드를 사용하여 생성되며 SQL 문과 PL/SQL 블록에서 사용된다. (PL/SQL 블록이 실행된 후에도 액세스할 수 있다.)
- 앞에 콜론을 사용하여 참조하며 PRINT 명령을 사용하여 값을 출력할 수 있다.
- SQL에서 선언해두고 PL/SQL블록에서 불러서 값을 담을 수도 있고, 반대로도 가능하다.
아래의 예는 교수번호가 1001 인 교수의 연봉을 계산하여 바인드 변수에 할당 한 후 출력하는 예 입니다.
SCOTT> VARIABLE v_bind NUMBER ; --SQL 에서 변수를 선언.
|
|
4. PL/SQL 과 SQL 에서 사용되는 주요 데이터 타입
5. 변수의 적용 범위 (Scope Rule)
SCOTT>DECLARE --바깥쪽 declar시작. 4 DECLARE --안쪽 declar 시작. 9 END ; --안쪽declar끝
|
- 문제가 되는 11번 라인 삭제 후 다시 위 문장 실행.
SCOTT> DECLARE
|
'[기타SQL] > PL_SQL' 카테고리의 다른 글
6. Oracle Subprogram ★★★ (0) | 2014.10.16 |
---|---|
5. Oracle Exception (예외처리) (0) | 2014.10.15 |
4. PL/SQL Cursor(커서) 정리해야됨. (1) | 2014.10.14 |
3. PL/SQL 제어문. (0) | 2014.10.13 |
1. ORACLE PL/SQL 시작하기 (0) | 2014.10.13 |