SQL을 이용하는 절차형 프로그램 언어
SQL은 구조화된 조회 언어라는 의미로, 집합적 언어라서 절차적 프로그래밍은 지원되지 않지만 SQL을 이용하면서 절차적인 프로그래밍도 함께 필요한 경우가 있음
크게 Procedure, Function, Trigger (프로시져, 사용자함수, 트리거 ) 로 나뉨 -> 내부에서 다양한 SQL을 복합적으로 구성이 가능
유저 프로세스가 PL/SQL 블록을 보내고
서버 프로세서는 PL/SQL Engine에서 해당 블록을 받고
SQL과 Procedural를 나눠서 SQL은 SQL Statement Executer로 보냄
SQL의 단점을 해결해줌 (변수가없고, 한번에 하나의 명령문으로 트래픽이 증가하고, 제어문X, 예외처리가 없는 단점)
성능 향상
모듈식 프로그래밍 가능
이식성 굿
예외 처리 가능
패키지를 사용한 모듈화를 지원
패키지는 연관성을 가지는 타입, 상수, 변수 , 커서, 예외처리, 서브프로그램들을 역어서 하나의 응용 단위로 구성하는 것
블록단위 실행 BEGIN, END 사용 하며 마지막라인에 / 입력 하면 실행
행에 '/'가 있으면 종결된 것
객체 지향 프로그래밍 지원 - 객체 타입을 제공
변수, 상수 선언 가능 ---> DECLARE절에서만 사용가능하며 BEGIN 섹션에서 새 값 할당 가능
다양한 내장 API
조건문, LOOP문 등
커서 사용해 여러행 검색하고 처리가능
사용가능 SQL은 Query, DML, TCL
DDL,DCL은 동적SQL 이용할때만 가능 (동적SQL 컴파일시 SQL문확정 되지않을때, PL/SQL블록상 ALTER SYSTEM/SESSION명령어 실행해야할때 등 SQL사용시 동적으로 바뀔때가 발생하는데, 문자열로 저장해놓고 가져다쓰면 재사용성과 유지보수가 용이함)
원시동적 SQL을 사용하는 방식과 DBMS_SQL이란 시스템 패키지를 사용하는 방식이 있다!
PL/SQL의 SELECT문 :
SELECT의 결과를 PL/SQL Engine으로 보내게 되는데 이를 캐치하기 위한 변수를 DECLARE해야 하고, INTO절을 꼭 선언하여 넣을 변수를 꼭 표현해주어야 함. SELECT 문장은 반드시 한 개의 행이 검색되어야 한다.
검색되는 행이 없으면 문제가 발생한다.
SET SERVEROUTPUT ON;
SHOW ERRORS;
https://www.ibm.com/docs/ko/db2/11.1?topic=data-plsql-support
참고해보자~!
선언부(DECLARE)에서 선언해야됨 변수명 다음 데이터타입 기술
뭔말인가 싶어서 예시를 살펴봐야겠다
DECLARE 변수이름 데이터타입
DECLARE NAME VARCHAR2(10)
DECLARE 변수이름 데이터타입 :=값;
DECLARE NAME VARCHAR2(10) :='고고';
DECLARE 변수이름 데이터타입 DEFAULT 기본값;
DECLARE NAME VARCHAR2(10) DEFAULT '고고';
DECLARE
NAME VARECHAR2(10);
AGE NUMBER(2);
GENDER VARCHAR(10) DEFAULT '안알랴줌';
DECLARE NM VARCHAR2(10):='고고';
BEGIN
DBMS_OUTPUT.PUT_LINE('고고'||NAME);
END
%ROWTYPE, %TYPE
DECLARE NM EMP%ROWTYPE;
BEGIN
SELECT * INTO DATA
FROM EMP
WHERE EMPNO = '1234';
DBMS_OUTPUT.PUT_LINE(DATA.ENM|| ',' ㅣㅣ DATA.ENO );
END
SELECT INTO 절 : 원본이 있지만 대상 테이블은 새로 생성하려고 할 때
EX SELECT * INTO COPY_TABLE FROM ORIGINAL_TABLE;
특정 컬럼만 가져올 때
SELECT * INTO COPY FROM(SELECT COL1,COL2,COL3 FROM ORIGINAL_TABLE) AS ORIGINAL;
그러면 INSERT INTO SELECT는?
원본, 대상 테이블 모두 존재
스키마가 둘다 동일해야함
INSERT INTO B_TABLE SELECT * FROM A_TABLE;
특정 컬럼 추출해서 맞춰줄수 있음~
신규 테이블을 만들땐?
CREATE TABLE NEW_TABLE
AS
SELECT * FROM OLD_TABLE;
DECLARE
V_EMPNM EMPLOYEE.EMPNM%TYPE;
V_DNO EMPLOYEE.DNO%TYPE;
BEGIN
SELECT EMPNM, DNO INTO V_EMPNM, V_DNO
FROM EMPLOYEE
WHERE EMPNO = '1234';
DBMS_OUTPUT.PUT_LINE(V_EMPNM || ','|| V_DNO);
END
https://gdtbgl93.tistory.com/147?category=755545
https://goddaehee.tistory.com/99
참고