KIC/DB 오라클

day11_3 - 오라클 (PL/SQL, RECORD Type 변수, 컬렉션, 바인드 변수, 조건문, 반복문)

바차 2021. 7. 13. 02:59
반응형

[PL/SQL RECORD Type 변수]

1. TYPE type_name IS RECORD

(field_declaration[, field_declaration]...); 형식

 

 

 

-> select 문에서 여러개의 변수를 한번에 전달

 

 

 

 

 

 

[PL/SQL Table Type 변수(컬렉션)]

- 연관 배열 : 인덱스가 있는 변수의 다중 공간

- 중첩 테이블
- VARRAY

 

 

 

[연관 배열의 주요 특징]

- 연관 배열은 변수 선언 당시 채워지지 않으며 키나 값을 포함하지 않으므로 선언에서 연관 배열을 초기화할 수 없다.

 

- 연관 배열을 채우려면 명시적 실행 문이 필요.

 

- 데이터베이스 테이블의 크기와 마찬가지로 연관 배열의 크기에도 제약이 없다. 따라서 새 행이 추가됨에 따라 연관 배열이 증가하도록 행 수가 동적으로 늘어날 수 있다.

 

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

 

 

-> 추후에 커서를 사용하면 더 간단하게 구현 가능하다.

 

 

 

 

 

[비 PL/SQL 변수]

[바인드 변수]

- 바인드 변수는 호스트 환경에서 생성되어 데이터를 저장하므로 호스트 변수라고도 함.
- VARIABLE 키워드를 사용하여 생성되며 SQL 문과 PL/SQL 블록에서 사용.


      VARIABLE v_bind number; 

      var v_bind number; -> 이렇게 약자로 사용 가능하다.


- PL/SQL 블록이 실행된 후에도 액세스할 수 있다.


- 앞에 콜론을 사용하여 참조하며 PRINT 명령을 사용하여 값을 출력할 수 있다. 단 치환변수와는 구분을 해야 함.

 

- 치환 변수는 사용자에게 어떤 값을 입력 받아서 치환하며 접두 문자로 & (앰퍼샌트)를 사용.

 

1)

var v_bind number;

 

-> pl/sql 블록에서 실제 외부에 있는 변수를 만들어 놓은 것에 값을 넣을 수 있다.

 

2)

BEGIN SELECT (pay*12)+NVL(bonus,0) INTO :v_bind -- 이렇게 콜론으로 집어 넣어 외부에서 프린트 가능 

FROM professor 

WHERE profno=1001 ; 

END;


           (결과) PL/SQL procedure successfully completed.

 

3) PRINT v_bind -- 바인드 변수에 담긴 값을 출력하기

 

 

 

-> PRINT v_bind를 하지 않고 2) 번 실행 전에 set autoprint on; 구문을 실행하면 2)번 실행할때 자동으로 결과값 출력

 

 

 

 

 

 

 

[PL/SQL 조건문]

 

- 조건 문 : IF 문 , CASE 문

 

1. 조건 문 (IF 문) : 유형 1. IF~END IF 문장

 

 

 

--EX)

 

DECLARE

vempno emp.empno%TYPE; 

vename emp.ename%TYPE;

vdeptno emp.deptno%TYPE;
vdname VARCHAR2(20) := null ;

 

 

BEGIN 

SELECT empno , ename , deptno 

INTO vempno , vename , vdeptno 

FROM emp 

 WHERE empno=7900; 

 IF (vdeptno = 10) THEN -- IF 문이 시작. 

    vdname := 'ACCOUNT'; 

 END IF ; -- IF 문이 끝나면 반드시 END IF 로 마쳐야 함. 

IF (vdeptno = 20) THEN 

   vdname := 'RESEARCH';

END IF ; 

IF (vdeptno = 30) THEN

    vdname := 'SALES'; 

END IF ; 

IF (vdeptno = 40) THEN

    vdname := 'OPERATIONS'; 

END IF ; 

DBMS_OUTPUT.PUT_LINE (vempno||' '||vename||' '||vdeptno||' '||vdname);

END ; 

 

 

-- 조건문이 여러개인 경우

DECLARE vempno emp.empno%TYPE;
vename emp.ename%TYPE; 

vdeptno emp.deptno%TYPE; 

vdname VARCHAR2(20) := null ;
BEGIN 

SELECT empno , ename , deptno INTO vempno , vename , vdeptno 

FROM emp 

WHERE empno=7900;
IF (vdeptno = 10) THEN 
vdname := 'ACCOUNT'; 

elsif (vdeptno = 20) THEN vdname := 'RESEARCH'; 

elsif (vdeptno = 30) THEN vdname := 'SALES'; 

elsif (vdeptno = 40) THEN vdname := 'OPERATIONS'; 

end if; 

DBMS_OUTPUT.PUT_LINE (vempno||' '||vename||' '||vdname);
END ;

 

 

 

 

--CASE 문 예시

DECLARE 

v_empno emp.empno%TYPE ; 

v_ename emp.ename%TYPE ; 

v_deptno emp.deptno%TYPE ; 

v_dname varchar2(10) ; 

BEGIN 

SELECT empno , ename , deptno INTO v_empno , v_ename , v_deptno 

FROM emp 

WHERE empno = &empno ;
v_dname := CASE v_deptno 

                           WHEN 10 THEN 'ACCOUNT'

                           WHEN 20 THEN 'RESEARCH'

                           WHEN 30 THEN 'SALES'

                           WHEN 40 THEN 'OPERATIONS' END ;
DBMS_OUTPUT.PUT_LINE (v_empno||' '||v_dname); 

END ;

 

 

 

 

 

 

 

[PL/SQL 반복문]

-> PL/SQL애서 반복문이 매우 중요하다.

-> 반복횟수를 지정하는 FOR 문

-> 반복 횟수를 알 수 없는 경우에 사용하는 BASIC LOOP 문과 WHILE 문

 

 

 

 

[FOR 문]

declare num number :=0; 

begin 

   loop dbms_output.put_line(num); 

   num :=num + 1; 

   exit when num > 5; 

   end loop;
end ;

 

출력 결과

 

[반복 횟수 지정하기]

 

[역순으로 출력]

 

 

 

 

 

[WHILE 반복문]

- BASIC LOOP 문은 나중에 조건을 검색하지만 WHILE 문은 시작부터 조건을 먼저 검사한 후 PL/SQL 문장을 수행

 

- BASIC LOOP 문은 조건 이 틀려도 PL/SQL 문장이 1회는 실행이 되지만 WHILE 문은 아예 실행이 되지 않는다.

 

 

 

[BASIC LOOP 문]

declare num number :=5; 

Begin

   loop dbms_output.put_line(num); 

   num :=num - 1; 

   exit when num < 0;
   end loop;

end;

 

 

[WHILE 문]

declare num number :=5; 

Begin

   while num >=0 loop

   dbms_output.put_line(num);

   num :=num-1;
   end loop;

end;

 

 

동일한 출력 결과 화면

 

 

 

 

 

 

 

 

300x250