PL / SQL
Oracle's Prodecural Language extension to SQL
변수 정의, 조건 처리, 반복 처리
절차적 언어로, SQL의 단점을 보완해 좀 더 효율적으로 SQL문을 사용할 수 있게 해준다.
구조
1. 선언부
DECLARE로 시작
모든 변수나 상수를 선언하는 부분.
2. 실행부
BEGIN으로 시작
내용을 기술.
3. 예외처리부
EXCEPTION으로 시작
(잘 쓰지 않는다.)
'Hello World'를 SQL Developer 콘솔창에 출력해보는 실습을 해 보았다.
제일 먼저 환경 변수를 설정해주어야 한다.
기본 값이 off 인데 이것을 바꿔주지 않으면 아무리 명령문을 실행해도 콘솔창에 나타나지 않는다.
set serveroutput on
이어서 다음과 같이 작성하고 실행한다.
BEGIN
dbms_output.put_line('Hello World!');
END;
/
1. 변수 선언
declare로 시작하는 선언부에서 선언해야 한다.
1) 스칼라(SCALAR) 형식
2) 레퍼런스 형식
1) 스칼라 형식
변수 선언시 '=' 이 아닌 ' := ' 로 선언해 주어야 한다.
set severoutput on
DECLARE
vempno number(4);
vename varchar2(10);
BEGIN
vempno := 7788;
vename := 'SCOTT';
dbms_output.put_line('사번 / 이름');
dbms_output.put_line(vempno || ' / ' || vename);
END;
/
자바에서는 system.out.println(); 을 쓸때 괄호 안에서 문자와 변수를 섞어쓸 때
vempno + " / " + vename 같이 입력을 했지만
이 쪽에서는 || 를 이용해서 연결을 해주어야 한다.
vempno + " / " + vename (x)
vempno || ' / ' || vename (O)
2) 레퍼런스 형식
여기서 %의 의미는
emp테이블의 empno 타입과 같은 자료형 형식을 똑같이 한다는 뜻이다.
vempno emp.empno%type;
vename emp.ename%type;
%type : 컬럼 하나를 참조하는 레퍼런스 변수 선언
%rowtype : 로우 전체를 참조하는 레퍼런스 변수 선언
2. SELECT문
BEGIN으로 시작되는 선언부 안에 들어가며, into 절이 필요하다.
select 절의 컬럼은 into절의 변수와 1:1 대응을 하기에 개수와 데이터의 형, 길이가 일치해야 한다.
Q. SCOTT 사원의 사번과 이름 검색하기 (레퍼런스 형식으로 변수 선언)
set SERVEROUTPUT ON
DECLARE
vempno emp.empno%type;
vename emp.ename%type;
BEGIN
SELECT empno, ename INTO vempno, vename
FROM emp
WHERE ename = 'SCOTT';
dbms_output.put_line('사번 / 이름');
dbms_output.put_line(vempno || ' / ' || vename);
END;
/
같은 결과가 나오도록 출력했지만,
스칼라 변수 선언과 레퍼런스 변수는 다른 형식이다.
변수 선언시 타입과 저장 공간을 직접 지정하는 것과, 이미 존재하는 테이블의 형식을 그대로 따오는 것.
3. 선택문
1) IF ~ THEN ~ END IF
TRUE : THEN 이하의 문장 실행
FLASE or NULL : END IF 다음 문장 실행
사원 테이블에서 SCOTT 사원의 연봉을 구하는 PL/SQL문을 작성해보는 실습
set SERVEROUTPUT ON
DECLARE
vemp emp%rowtype;
vsal number(7,2);
BEGIN
SELECT * INTO vemp FROM emp WHERE ename='SCOTT';
IF vemp.comm is null THEN vemp.comm := 0;
END IF;
vsal := vemp.sal * 12 + vemp.comm;
DBMS_OUTPUT.PUT_line('사번 / 이름 / 연봉');
DBMS_OUTPUT.PUT_line(vemp.empno || ' / ' || vemp.ename || ' / ' || vsal);
END;
/
scott 사원의 일부 컬럼만 뽑아 쓰는 것보다는 rowtype으로 전체 데이터를 참조하는 것이 더 간단하므로 %rowtype
2) IF - THEN - ELSE - END IF
SET SERVEROUTPUT ON
DECLARE
vemp emp%rowtype;
vsal number(7,2);
BEGIN
SELECT * INTO vemp FROM emp WHERE ename = 'SCOTT';
IF vemp.comm is null THEN
vsal := vemp.sal*12;
ELSE
vsal := vemp.sal+12+vemp.comm;
END IF;
DBMS_OUTPUT.PUT_line('사번 / 이름 / 연봉');
DBMS_OUTPUT.PUT_line(vemp.empno || ' / ' || vemp.ename || ' / ' || vsal);
END;
/
위의 IF ~ THEN ~ END IF; 문과 다른 점은
1)은 comm 컬럼의 null 값을 0으로 치환하여 계산했다는 것이고,
2)는 comm 컬럼이 null 인 경우 계산 방식과 null 이 아닌 경우의 계산 방식을 각각 지정하여 처리했다는 점이다.
3) IF ~ THEN ~ ELS IF ~ ELSE ~ END IF
SCOTT 사원의 부서번호를 이용해서 부서명을 구하는 PL/SQL문 작성해보기
SET SERVEROUTPUT ON
DECLARE
vemp emp%rowtype;
vdname varchar2(14);
BEGIN
SELECT * INTO vemp FROM emp WHERE ename = 'SCOTT';
IF vemp.deptno = 10 THEN vdname = 'ACCOUNTING';
ELSIF vemp.deptno = 20 THEN vdname = 'RESEARCH';
ELSIF vemp.deptno = 30 THEN vdname = 'SALES';
ELSE vemp.deptno = 40 THEN vdname = 'OPERATIONS';
END IF;
DBMS_OUTPUT.PUT_line('사번 / 이름 / 부서');
DBMS_OUTPUT.PUT_line(vemp.empno || ' / ' || vemp.ename || ' / ' || vdname);
END;
/
'오라클 데이터베이스' 카테고리의 다른 글
저장 프로시저 - 기본형태, 매개변수 (0) | 2022.08.01 |
---|---|
PL / SQL - 반복문 (0) | 2022.08.01 |
동의어 Synonym (0) | 2022.07.29 |
DCL> 롤 권한 제어 (0) | 2022.07.29 |
DCL> 사용자 관리와 Grant, Revoke (0) | 2022.07.29 |