-
[SQL] PL/ SQLDatabase/SQL (oracle, mysql) 2019. 5. 31. 18:56
PL / SQL
- SQL 의 장점은 잘만든 쿼리문 하나로 원하는 데이터를 검색 조작할 수 있다는 점인데, SQL문 자체는 비 절차적 언어이기 때문에 몇개의 쿼리문 사이에 어떠한 연결 및 절차성이 있어야 하는 경우는 사용할 수 없다.
- IF문, FOR문 안에 SQL를 사용할 수 있다.
- 이 점을 극복하기 위해서 SQL언어에 절차적인 프로그래밍 언어를 추가해서 만든 것이 PL/SQL이다.
PL / SQL 구조
DECLARE SECTION (선언부)
- PL / SQL에서 사용하는 모든 변수나 상수를 선언
ex. b emp.empno%type; <- 변수선언 / 존재하는 테이블 안의 컬럼이 갖는 자료형을 참조
c number(2) := 30; <-- 선언과 동시에 초기화가 가능하다. 새우
EXECUABLE SECTION (실행부)
- 절차적 형식으로 SQL을 실행할 수 있도록 절차적요소인 제어문, 반복문
- 함수정의 등 로직기술
- SQL문 1, 2, 3(DQL, DML) 작성
주의! SELECT EMPNO, ENAME, SAL INTO a,b,c FROM EMP;
dbms_output.put_line(a) <--조회 가능 (a,b,c라는 변수에 값을 담았기 때문
if else 조건문
if(조건식)
then -- if시작
SQL 4; (조건이 참일때 실행할 문장)
end if -- if끝
if 조건식
then 조건 결과가 참일때 실행할문장;
else 조건 결가가 거짓일때 실행할 문장;
end if;
if 조건식1
then 조건식1 참일때 실행할 문장
elseif 조건식2
then 조건식1이 거짓이고 조건식2가 참일때 실행할 문장
elseif 조건식3
then 조건식1,2가 거짓이고 조건식3 참일때 실행할 문장
else 조건식 1,2,3이 거짓일때 실행할 문장;
end if;
반복문
for 변수 in [reverse] 최소값 .. 최대값
Loop
반복실행할 문장;
end Loop;
loop(반복문)
Loop
반복실행할 문장1;
반복실행할 문장2;
exit [when 조건식] ; -- 탈출 조건
End Loop;
EXCEPTION SECTION (예외처리)
- 실행 중 발생되는 에러를 해결하기 위한 문장으로 구성
변수선언!
vempno number(4)
vempno2 emp.empno % type;
--> 존재하는 emp테이블의 empno컬럼이 갖는 자료형을 참조
레퍼런스 변수
- %TYPE (한개의 컬럼), %ROWTYPE(한 행을 구성하는 모든 컬럼을 참조)
vemp emp%ROWTYPE;
--> emp테이블이 갖는 모든 컬럼의 자료형을 vemp변수로 참조하겠음
저장프로시저 - Stored Procedure
- 자주 사용되는 DML, DQL을 모듈화 시켜서 DB에 저장하였다가 필요할때 호출해서 사용
- JAVA의 메소드와 같음
CREATE [ OR REPLACE ] PROCEDURE 프로시저명 (SU NUMBER, 변수명2 [ IN / OUT ] 자료형)
-- 매개변수가 없을시에는 ()를 빼줘야 한다.
IS
실행부 변수 선언
BEGIN
실행할 문장1 ;
실행할 문장2 ;
실행할 문장3 ;
-- 초기화, SQL문, 함수호출, 절차적요소( 조건문, 반복문 )
END;
/
실행방법!
EXECUTE 프로시저명 ( ) ;
바인딩변수 사용법
CREATE OR REPLACE PROCEDURE del_dept(delNo in number, tomorrow out varchar2)
IS
BEGIN
tomorrow := '토요일' ;
DML문
COMMIT; -- 동시에 여러번 수정된다면 문제가 생길 수 있어 commit
END;
저장함수 - Stored Function
- 실행 (함수호출) 후 결과를 되돌려 받을 수 있는 return 데이터';를 반드시 명시해야 한다.
형식.
CREATE [OR REPLACE] FUNCTION 함수명( 매개변수 선언)
RETURN 자료형
IS
변수선언 :바이드변수 := 함수명();
BEGIN
(순차적으로) 실행할 SQL문
RETURN 데이터;
END;
사용법.
1. CREATE FUNCTION ~ (함수를 DB에 저장) -- 함수 생성
2. VARIABLE 바인드 변수명 자료형; -- 변수 선언
3. EXEC 함수명 :바인드변수명 := 함수명() -- 함수호출, 결과값 저장
4. PRINT 바인드변수명; -- 저장값 확인
참고.
void hello(String name){
Sysout("안녕,"+name);
}
String hi(){
return "좋은하루!";
}
Cursor
select의 결과가 2개행 이상일 때 명시적으로 사용한다.
2개행 이상을 출력하는 select문을 저장하는 변수
declare
변수선언, 커서정의
CURSOR 커서명 IS SELECT문장;
BEGIN
커서 사용
OPEN 커서명;
FETCH 커서명 INTO 변수명;
CLOSE 커서명;
declare
CURSOR cur is select deptno, dname, loc from dept;
--변수명 테이블명.컬럼명%type; ==> 특정테이블의 컬럼에 정의된 자료형 참조!!
--변수명 테이블명%rowtype; ==> 특정테이블이 갖는 모든 컬럼에 정의된 자료형 참조!!
vdept dept%rowtype; -- %rowtype(테이블 타입- 테이블을 구성하는 모든 컬럼!!)
begin
OPEN cur;
dbms_output.put_line('부서번호/부서명/부서위치');
dbms_output.put_line('------------------------------');
loop
FETCH cur into vdept; -- vdept: deptno, dname, loc ( vdept== dept테이블!!)
exit when cur%notfound; -- 커서를 통해 인출된 행이 없다면
dbms_output.put_line(vdept.deptno ||'/' ||
vdept.dname || '/' || vdept.loc);
end loop;
CLOSE cur;
end;
/반응형'Database > SQL (oracle, mysql)' 카테고리의 다른 글
[SQL] rollup과 cube (0) 2019.06.04 [ SQL ] 패키지 선언 (0) 2019.06.04 [SQL] SEQUENCE 시퀀스 (0) 2019.05.31 [SQL] VIEW 란? (0) 2019.05.31 [SQL] 참조 CASCADE관한 설명 (0) 2019.05.30