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 [(전체자리수, 소수점이하 자리수)]

 전체 자리수와 소수점 이하의 자리수를 가진 숫자.   
 전체 범위 : 1부터  38까지

 소수점 이하 자리수의 범위 :  -84 부터  127 까지

 BINARY_INTEGER

 -2,147,483,647 - 2,147,483,647 사이의 정수를 저장하는 타입.

  PLS_INTEGER

 -2,147,483,647 - 2,147,483,647 사이의 부호 있는 정수.        
 NUMBER 값보다 저장 공간이 적게 필요하고 연산 속도가 더 빠르다.

 

 

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
   2  AS
   3       SELECT empno, ename , sal
   4       FROM emp ; 

 

 

- 조회하기.

 

 SCOTT>SET SERVEROUTPUT ON;

 SCOTT>DECLARE
   2  vno       emp3.empno%TYPE ;     3 개의  TYPE 변수를 선언하여 데이터를 저장
   3  vname  emp3.ename%TYPE ;      

   4  vsal         emp3.sal%TYPE ; 
   5
   6  BEGIN
   7    SELECT empno, ename, sal
   8    INTO vno, vname, vsal
   9    FROM emp3
  10    WHERE empno=7900 ;
  11
  12  DBMS_OUTPUT.PUT_LINE(vno||'   '||vname||'   '||vsal) ;
  13
  14  END ;
  15  /

7900   JAMES   950
 
PL/SQL procedure successfully completed.

 

  (2) ROWTYPE 변수를 활용하여 데이터 출력하기 
앞의 예  1번에서 출력했던 내용을 ROWTYPE  변수를 사용하여 출력.

 

 

SCOTT>SET SERVEROUTPUT ON;
SCOTT>DECLARE
   2    v_row  emp3%ROWTYPE ; 위  예에서  3개의  TYPE  변수를  사용했던  것을  1개의  ROWTYPE  변수로 간단히 작업 할 수 있다
   3
   4  BEGIN
   5    SELECT * INTO v_row
   6    FROM emp3
   7    WHERE empno=7900 ;
   8
   9    DBMS_OUTPUT.PUT_LINE(v_row.empno||'**'||v_row.ename||'**'||v_row.sal);
  10  END ;
  11  /
 
7900**JAMES**950
 
PL/SQL procedure successfully completed.

 

 

 

  (3) ROWTYPE 변수를 활용한 데이터의 입력

[준비과정]

 

 SCOTT>CREATE TABLE   row_test
   2  (   no NUMBER,
   3    name   VARCHAR2(10),
   4    hdate  DATE ); 
Table created.

SCOTT>CREATE  TABLE    row_test2
   2  AS    SELECT    *    FROM row_test;
Table created.

 

 

- ROWTYPE변수 활용한 데이터입력.


SCOTT>INSERT  INTO    row_test  VALUES (1,'AAA',SYSDATE);
  
1 row created.
 
SCOTT>INSERT    INTO row_test VALUES (2,'BBB',SYSDATE);
 
1 row created.
 
SCOTT>INSERT  INTO row_test VALUES (3,'CCC',SYSDATE);
 
1 row created.
 
SCOTT>COMMIT ;
 
SCOTT> DECLARE
   2     v_record    row_test%ROWTYPE ;
   3  BEGIN
   4    SELECT * INTO v_record
   5    FROM row_test
   6    WHERE no=1 ;
   7
   8     INSERT INTO row_test2    
   9    VALUES v_record ;
   10    END;
   11    /
 
PL/SQL procedure successfully completed.

SCOTT>SELECT    *    FROM row_test2;
 
    NO    NAME   HDATE
------ -------- --------------
       1    AAA    27-MAR-12     <-- 잘 입력됨.

 

 

 

  (4) ROWTYPE 변수를 활용한 데이터의 변경

 

 SCOTT>DECLARE
   2    v_record   row_test%ROWTYPE;
   3  BEGIN
   4    SELECT *  INTO v_record
   5    FROM row_test
   6    WHERE no=1 ;
   7
   8    v_record.name := 'DDD' ;
   9
  10    UPDATE row_test2
  11    SET row=v_record
  12    WHERE no=1;
  13  END ;
  14  /
 
PL/SQL procedure successfully completed.
 
SCOTT>SELECT * FROM row_test2;
 
     NO   NAME   HDATE
------ -------- ----------------
       1    DDD      27-MAR-12   <- 원래  ‘AAA’ 였던 값이 ‘DDD’ 로 변경됨.

 


 

 

변수 예제 2. 사용자로부터 두 개의 숫자를 입력 받아서 합을 구하세요.

 

SCOTT>SET VERIFY OFF
SCOTT>SET    SERVEROUTPUT ON
SCOTT>DECLARE
2   v_no1   NUMBER := &no1 ;
3   v_no2   NUMBER := &no2 ;
4   v_sum   NUMBER ;
5
6   BEGIN
7   v_sum := v_no1 + v_no2 ;
8    DBMS_OUTPUT.PUT_LINE('첫번째 수: '||v_no1||', 두번째 수  : '||v_no2||' , 합은  : '||v_sum||' 입니다');
9   END ;
10  /
 
Enter value for no1: 20
Enter value for no2: 40
첫번째 수: 20, 두번째 수  : 40 , 합은  : 60 입니다
 
PL/SQL procedure successfully completed.

 

 

 

 

2) 복합 변수 (조합 변수)

 : 변수 하나 안에 사용자가 원하는 여러 가지 다른 유형의 데이터를 포함해서 사용자가 원하는 새로운 형태로 만드는 형태. 

동일한 데이터 타입의 데이터를 여러 건 저장하고 싶을 경우 컬렉션 타입 (Table 타입)을 많이 사용하고

 데이터 타입이 다른 여러 건을 저장할 경우 레코드 타입의 변수를 많이 사용한다.

 

(1) Record Type 복합 변수   

 

* 테이블 기반(커서기반)의 Record Type : %ROWTYPE을 사용. (해당  테이블과  동일한  구조의  Record Type 변수가 생성.)

* 프로그래머 정의 기반 Record Type : 사용자가 원하는 컬럼만을 지정해서 만듦.
 
[문법] 

 

* PL/SQL Record 정의와 선언 


①  TYPE type_name IS RECORD
   ( field_declaration[, field_declaration]… ) ;
②  Identifier type_name

 

 

① 정의 부분 :

 - 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
SQL> DECLARE
   2    TYPE dept_record_type IS RECORD
   3    (
deptno  dept.deptno%TYPE,
   4      dname  dept.dname%TYPE,
   5      loc  dept.loc%TYPE );
   6
   7    v_dept  dept_record_type; -- 실제 복합 변수 v_dept를 선언

   8

   9  BEGIN
  10    SELECT deptno , dname , loc  
 11    INTO v_dept  
  12    FROM dept
  13    WHERE deptno=30;
  14
  15    DBMS_OUTPUT.PUT_LINE('부서번호      부서명      위치');
  16    DBMS_OUTPUT.PUT_LINE(v_dept.deptno||'         '||
  17                            v_dept.dname||'         '||
  18                            v_dept.loc);
  19  END ;
  20  /
 
부서번호         부서명         위치
30               SALES        CHICAGO
PL/SQL procedure successfully completed.

 

 

 

 

 

SCOTT> DECLARE
   2  TYPE e2_rec_type IS RECORD (
   3     vempno    emp2.empno%TYPE,
   4     vname     emp2.name%TYPE,
   5     vposition     emp2.position%TYPE,
   6     vbirth        emp2.birthday%TYPE,

   7     vtel          emp2.tel%TYPE,
   8     vpay          emp2.pay%TYPE );
   9
 10   v_e2_record  e2_rec_type ;

  11
  12   v_empno emp2.empno%TYPE := '&empno';
  13  BEGIN
  14      SELECT empno,name,NVL(position,'사원'),birthday,tel,pay
 15      INTO v_e2_record
  16      FROM emp2
  17     WHERE empno=v_empno ;
  18
  19     DBMS_OUTPUT.PUT_LINE('사원번호: '||v_e2_record.vempno);
  20     DBMS_OUTPUT.PUT_LINE('사 원 명: '||v_e2_record.vname);
  21     DBMS_OUTPUT.PUT_LINE('직    급: '||v_e2_record.vposition);
  22     DBMS_OUTPUT.PUT_LINE('생    일: '||v_e2_record.vbirth);
  23     DBMS_OUTPUT.PUT_LINE('연 락 처: '||v_e2_record.vtel);
  24     DBMS_OUTPUT.PUT_LINE('급    여: '||v_e2_record.vpay);
  25    END;
  26   /

 

 

 

(2) Table Type 변수  (컬렉션 타입)

 1 개의 컬럼만 저장을 하지만 Row Type 을 사용하여 Record Type 과 같이 여러 가지 유형의 데이터 컬럼을 가질 수도 있다. (권장하지 않음.)

  Table Type변수에는  연관 배열(가장 많이 사용), 중첩 테이블, VARRAY 세가지 종류가 있다. 

 

 * 연관배열 : 두 개의 칼럼으로 이루어진 형태.

 

Key 부분이 가상의 Primary Key 가 되어 인덱스로 사용하며  데이터를  구분.  Key  컬럼의  값은 사람이  임의로 조정 할 수 없다.

(오라클  8 과  8i 버전에서는 연관 배열을  INDEX BY Table 이라고도 한다.)

 

- (Unique) Key 열 
• 숫자일 경우  - BINARY_INTEGER 또는 PLS_INTEGER   
 : NUMBER보다 적은 저장 영역이 필요하며 해당 데이터 유형에 대한 산술 연산은 NUMBER 로 하는 산술 연산보다 빠르다. 
• 문자일 경우  – VARCHAR2 또는 하위 유형 중 하나 


- 값(value) 열: Value열은 실제 값이 들어가는 곳.

  입력되는 데이터의 종류에 따라 스칼라 데이터 유형 또는 레코드 데이터 유형으로 나눠진다.

 스칼라 데이터 유형의 열은 행당 하나의 값만 보유할 수 있지만, 레코드 데이터 유형의 열은 행당 여러 값을 보유할 수 있다.

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

* 연관 배열의 주요 특성 
- 연관 배열은 변수 선언 당시 채워지지 않으며, 키나 값을 포함하지 않으므로 선언에서 연관 배열을 초기화할 수 없다. 
- 연관 배열을 채우려면 명시적 실행문이 필요. 
- 데이터베이스 테이블의 크기와 마찬가지로 연관 배열의 크기에도 제약이 없다.

 따라서 새 행이 추가됨에 따라 연관 배열이 증가하도록 행 수가 동적으로 늘어날 수 있다.

- 키는 순차적이 아닐 수 있으며 양수 및 음수일 수 있다.

 

 

* PL/SQL Table (컬렉션 타입) 정의와 선언 
 
[문 법]

 
①  TYPE type_name IS TABLE OF
{column_type|variable%type|table.column%type} [NOT NULL]| table%ROWTYPE
[INDEX BY BINARY_INTEGER] ;
②  Identifier type_name

 


① 정의부분 :

- 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
SQL> DECLARE
   2    t_name  VARCHAR2(20);
   3
  4    TYPE  tbl_emp_name  IS  TABLE  OF   table type 변수 생성
  5    emp.ename%TYPE
  6    INDEX  BY  BINARY_INTEGER;
  7
  8    v_name tbl_emp_name;       table type 선언
   9
  10  BEGIN

  11    SELECT  ename  INTO  t_name      
  12    FROM emp  
  13    WHERE empno=7499;
  14
 15    v_name(0) := t_name;      --t_name에 있던 사원의 ename을 v_name의 1번째 칸에 할당. (두번째 칸에 할당하려면 v_name(1)로)
  16    DBMS_OUTPUT.PUT_LINE(v_name(0));    --변수에 있던 이름 출력
  17  END ;
  18  /

 


 

Table Type 변수 사용 예  2: 커서를 사용해서 생성하는 방법
professor  테이블의  rowtype  을  가지는  prof_table_type  이라는  이름으로  새로운  타입을  생성 한 후  v_prof_row 라는 변수에 할당합니다. 그리고  v_prof_row 변수의 첫 번째 행  (0번 행)에 데이터를 입력 한 후 화면에 출력합니다.

 

 

SCOTT>SET    SERVEROUTPUT  ON;
SCOTT> DECLARE
   2     TYPE   prof_table_type IS TABLE   OF   professor%rowtype
   3     INDEX    BY   binary_integer;
   4  v_prof_row  prof_table_type;
   5  BEGIN
   6   v_prof_row(0).profno    := 9000 ;
   7   v_prof_row(0).name   := 'imsy' ;
   8   v_prof_row(0).id         := 'imsy_id';
   9   v_prof_row(0).position := 'imsy';
  10   v_prof_row(0).pay        := '000';
  11   v_prof_row(0).hiredate := sysdate;

  12   DBMS_OUTPUT.PUT_LINE(v_prof_row(0).profno||' '||v_prof_row(0).name||' '||
  13                             v_prof_row(0).id||' '||v_prof_row(0).position||' '||
  14                             v_prof_row(0).pay||' '||v_prof_row(0).hiredate);
  15    END ;
  16  /
 
9000    imsy    imsy_id    imsy    0    01-JUL-13
 
PL/SQL procedure successfully completed.

 

 

 

* 참고 *

 

- 여러 건의 데이터 중 행을 지정하여 지우고 싶은 경우

 변수이름.delete(행번호);

- 해당 변수의 모든 행을 다 지우고 싶은 경우.

 변수명.delte ;

- 변수에 아주많은 데이터가 들어가있을 경우, 가장 첫번째 값과 가장 마지막값 조회하고 싶은 경우.

 변수이름.first

 변수이름.last

 

 

 

- Table Type 변수 사용 예 3: For 반복문을 사용하여 변수에 여러 건의 데이터를 입력하는 방법.

 

 

 SQL> DECLARE
   2
   3   TYPE e_table_type  IS  TABLE OF
   4     emp.ename%TYPE  
   5   INDEX BY  BINARY_INTEGER ;
   6   tab_type  e_table_type;
   7   a  BINARY_INTEGER := 0;
   8  BEGIN
   9     FOR i  IN (SELECT  ename FROM  emp)  LOOP
  10         a := a+1;
  11         tab_type(a) := i.ename;
  12     END  LOOP ;
  13     FOR j  IN  1..a  LOOP
  14       DBMS_OUTPUT.PUT_LINE (tab_type(j));
  15     END LOOP ;

  16 END ;  
  17  /
 
==========출력 결과============= 
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

 

 

 

 

3. 비 PL/SQL 변수 : PL/SQL 안에서만 사용되는 것이 아니라 외부에서도 사용될 수 있는 변수.

 

 * 바인드 변수 (호스트 변수 : 호스트 환경에서 생성되어 데이터를 저장하므로 호스트 변수라고도 부름.) 
 - VARIABLE 키워드를 사용하여 생성되며 SQL 문과  PL/SQL 블록에서 사용된다. (PL/SQL 블록이 실행된 후에도 액세스할 수 있다.)
 - 앞에 콜론을 사용하여 참조하며 PRINT 명령을 사용하여 값을 출력할 수 있다.

 - SQL에서 선언해두고 PL/SQL블록에서 불러서 값을 담을 수도 있고, 반대로도 가능하다.

 

아래의 예는 교수번호가  1001 인 교수의 연봉을 계산하여 바인드 변수에 할당 한 후 출력하는 예 입니다.

 

 

SCOTT> VARIABLE v_bind  NUMBER ;    --SQL 에서 변수를 선언.  
SCOTT> BEGIN
   2     SELECT (pay*12)+NVL(bonus,0) INTO :v_bind   -- PL/SQL 에서 값을 입력. 
   3     FROM professor
   4     WHERE profno=1001 ;
   5    END;
   6   / 

PL/SQL procedure successfully completed.
 
SCOTT>PRINT v_bind ;   -- SQL에서 바인드 변수에 담긴 값을 출력.
 
    V_BIND
-------------
       6700

 


 

 
SCOTT>SET AUTOPRINT ON ;    --PRINT문장을 매번 실행하지않아도, 자동으로 바인드 변수값을 출력해서 보여줌.
SCOTT> BEGIN
   2     SELECT (pay*12)+NVL(bonus,0) INTO :v_bind
   3     FROM professor
   4     WHERE profno=1001 ;
   5    END;
   6   /
 
PL/SQL procedure successfully completed.
 
    V_BIND
---------------
       6700

 

 

 

4. PL/SQL 과  SQL 에서 사용되는 주요 데이터 타입

 

 

5. 변수의 적용 범위  (Scope Rule)

 

 

 SCOTT>DECLARE --바깥쪽 declar시작.
   2    v_first VARCHAR2(5) := 'Outer';   --외부 블록에서 v_first 선언.
   3  BEGIN 

   4    DECLARE --안쪽 declar 시작.
   5      v_second  VARCHAR2(5) := 'Inner';  --내부 블록에서 v_second 선언.
   6    BEGIN 
   7      DBMS_OUTPUT.PUT_LINE(v_first--바깥에서선언했지만 안에서쓸수있다.
   8      DBMS_OUTPUT.PUT_LINE(v_second); 

   9    END ;  --안쪽declar끝
  10   DBMS_OUTPUT.PUT_LINE(v_first);
  11   DBMS_OUTPUT.PUT_LINE(v_second);  --안쪽에서 만들어진 변수이므로, 바깥에서못부름.
  12  END ;  --바깥쪽declar끝
  13  /
 DBMS_OUTPUT.PUT_LINE(v_second);
                       *
ERROR at line 11:
ORA-06550: line 11, column 23:
PLS-00201: identifier 'V_SECOND' must be declared
ORA-06550: line 11, column 2:
PL/SQL: Statement ignored

 

 

 - 문제가 되는 11번 라인 삭제 후 다시 위 문장 실행.

 

 SCOTT> DECLARE
   2    v_first VARCHAR2(5) := 'Outer';
   3  BEGIN
   4    DECLARE
   5      v_second  VARCHAR2(5) := 'Inner';
   6    BEGIN
   7       DBMS_OUTPUT.PUT_LINE(v_first);
   8      DBMS_OUTPUT.PUT_LINE(v_second);
   9    END ;
  10   DBMS_OUTPUT.PUT_LINE(v_first);
  11    END ;
  12   /
Outer    7번 줄의 결과값
Inner     8번 줄의 결과값
Outer    10번 줄의 결과값
 
PL/SQL procedure successfully completed.

 

 

 

'[기타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
Print Friendly and PDF Posted by JJ*
: