-
day11_3 - 오라클 (PL/SQL, RECORD Type 변수, 컬렉션, 바인드 변수, 조건문, 반복문)KIC/DB 오라클 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 ;
BEGINSELECT 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_deptnoWHEN 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'KIC > DB 오라클' 카테고리의 다른 글
day12 - 오라클 (PL/SQL, 커서, 명시적 커서, 묵시적 커서, 프로시저 (0) 2021.07.14 day11_2 - 오라클 (PL/SQL 기본구조, 익명 블록, 작성 규칙, 주의 사항, 연산자, 변수) (0) 2021.07.13 day11_1 - 오라클 (user, schema, Role) (0) 2021.07.13 day10 - 오라클 (CREATE, ALTER, RENAME, MODIFY, 제약조건, 외래키, 인덱스, 뷰, 시퀸스) (0) 2021.07.13 day09 - 오라클 (sql 명령어, insert, delete, truncate, drop 차이, merge, commit, DML) (0) 2021.07.10