-
[PLSQL] block, 출력, 변수, 자료형, SQLDataBase/PLSQL 2022. 9. 9. 16:50
block
PL/SQL은 여러 블럭으로 구성돼 있는데 쉽게 짐작할 수 있는 실행할 SQL 명령이 모여있는 블럭 등이 있으며 이는 명령의 실행단위가 됨. 이외 익명 블럭, 이름이 있는 블럭 등도 있고, 내부는 기능별로 이름부, 선언부, 실행부, 예외처리부로도 나누기도 함.
1. 구성
-- PL/SQL로 하나의 단위명령을 실행할 때 -- 아래와 같이 각 위치, 기능별 구성이 이루어짐 IS(AS) -- 이름부 DECLARE -- 선언부(변수 선언 등등) BEGIN -- 실행부(SQL 명령) EXCEPTION -- 예외처리부 END; -- BEGIN, END를 제외한 나머지는 필요에 의해 생략이 가능함
2. 익명 블럭
DECLARE num NUMBER; --변수 선언 BEGIN num :=100; --실행명령 DBMS_OUTPUT.PUT_LINE(num); --실행명령(화면출력) END;
출력 명령
-- 화면 출력을 하기 위해 기능을 on 함 SET SERVEROUTPUT ON -- 실행 시간을 출력하기 위한 기능을 on/off 함 SET TIMING ON SET TIMING OFF
변수 선언
변수명 변수자료형;
변수명 변수자료형 := 초기값;
-- SQL 명령 내의 ' = '과 구분하기 위해 ' := '으로 사용함PL/SQL의 자료형
-기존의 Oracle 자료형은 모두 포함하며 자유롭게 사용 가능
연산자
-- PL/SQL 블럭에 연산자를 사용한 예 DECLARE A INTEGER := 2**2*3**2; BEGIN DBMS_OUTPUT.PUT_LINE('A='||TO_CHAR(A)); END; -- BEGIN 등의 각 영역은 한 문장의 SQL문도 하나의 명령어로 -- 연산자를 포함한 일반 명령어도 하나의 명령어로 인식해서 -- 맨 뒤에 ';'이 있는 곳까지 실행함
SQL과 같이 사용하기
SQL Developer 쿼리창에는 반드시 블럭만 사용할 수 있는 건 아님. 일반적인 SQL문도 사용 가능
-- emp 테이블에서 사원번호가 7900인 사원의 이름을 출력 select ename from emp where empno=7900;
위 예를 PL/SQL의 블럭에 넣고 결과를 변수에 저장해 출력
DECLARE empname varchar2(30); BEGIN -- 블럭 안에 sql문은 다로 위치 지정 없이 -- 그냥 다른 명령과 같이 기술하면 됨 select ename into empname -- sql문의 결과를 변수에 담아내는 방법 -- select와 from 사이에 into 키워드를 넣고 -- 저장될 변수를 지정 from emp where empno=7900; DBMS_OUTPUT.PUT_LINE(empname); END;
SQL문의 결과로 나온 필드값이 여러 개면, 위와 같은 한 개의 변수에 담을 수 없음. select와 from 사이에 지정한 필드명이 두개 이상이라면 갯수만큼 into에 변수의 갯수도 맞춰줘야 함.
-- 사원번호가 7900인 사원의 이름과 급여 출력 DECLARE empname varchar2(30); empsal number; BEGIN select ename , sal into empname , empsal from emp where empno=7900; DBMS_OUTPUT.PUT_LINE('성명: '||empname||', 급여: '||to_char(empsal)); END;
변수의 갯수가 많은 경우 자료형을 일일이 맞춰서 선언하기가 번거로우므로 매칭할 필드의 이름과 %type을 이용하여 자동으로 자료형이 맞춰지도록 함.
DECLARE empname emp.ename%TYPE; -- emp 테이블의 ename 필드의 자료형으로 변수의 자료형 맞춰줌 empsal emp.sal%TYPE; BEGIN select ename , sal into empname , empsal from emp where empno=7900; DBMS_OUTPUT.PUT_LINE('성명: '||empname||', 급여: '||to_char(empsal)); END;
연습하기
-- DBMS_OUTPUT.PUT_LINE()을 9번 사용해 구구단 7단을 출력 -- 이어붙이기 연산 사용 -- 현재는 변수가 필요하지 않기 때문에 DECLARE도 쓰지 않아도 됨 BEGIN DBMS_OUTPUT.PUT_LINE('7*1='||7*1); DBMS_OUTPUT.PUT_LINE('7*2='||7*2); DBMS_OUTPUT.PUT_LINE('7*3='||7*3); DBMS_OUTPUT.PUT_LINE('7*4='||7*4); DBMS_OUTPUT.PUT_LINE('7*5='||7*5); DBMS_OUTPUT.PUT_LINE('7*6='||7*6); DBMS_OUTPUT.PUT_LINE('7*7='||7*7); DBMS_OUTPUT.PUT_LINE('7*8='||7*8); DBMS_OUTPUT.PUT_LINE('7*9='||7*9); END; -- 사원테이블(emp)에서 1788번 사원의 이름과 부서명을 출력하는 익명 블록. -- join 명령 사용 -- '이름-부서명' 형식으로 스크립트 출력창에 출력 DECLARE empname emp.ename%TYPE; deptname dept.dname%TYPE; BEGIN select a.ename , b.dname into empname , deptname from emp a, dept b where a.deptno=b.deptno and empno=7369; DBMS_OUTPUT.PUT_LINE(empname||' - '||deptname); END; -- select로 얻어낸 값을 insert 명령에 사용함 -- 사원테이블(emp) 테이블에서 가장 큰 사원번호로 조회하고 -- 그 사원번호보다 1만큼 큰 숫자를 -- 새로운 입력 레코드의 사원번호로 하여 레코드를 추가 -- ename: HARRISON, JOB: MANAGER, MGR: 7369, HIREDATE: 2022/06/14 -- SAL: 3000, COMM: 700, DEPTNO: 40 -- select 결과로 저장한 변수명은 -- insert에서도 바로 변수명으로 사용이 가능함 -- insert into emp values(변수이름, ...); -- SQL Debeloper 프로그램은 이클립스처럼 Auto Commit이 아니기 때문에 -- insert update delete 명령 뒤엔 반드시 commit;을 사용함 DECLARE max_empno emp.empno%TYPE; BEGIN select max(empno) into max_empno from emp; insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values(max_empno + 1,'HARRISON','MANAGER',7566,sysdate,3000,700,40); commit; END;
'DataBase > PLSQL' 카테고리의 다른 글
[PLSQL] cursor (0) 2022.09.09 [PLSQL] procedure (1) 2022.09.09 [PLSQL] function (0) 2022.09.09 [PLSQL] if, case, loop (0) 2022.09.09 [PLSQL] Procedural Language for SQL 설치 (0) 2022.09.09