PL/SQL
▶ PL/SQL
-- 쿼리 ;(세미콜론)을 통해서 항상 한문장 한문장 실행을 했습니다.
-- A 쿼리실행 다음에 B쿼리를 실행해야하는 경우가 발생
-- SQL 순차적으로 처리하기 위한 확장된 언어
-- SQL + 일반프로그래밍언어 결합 : 변수개념도 생기고 제어문개념도 생김
-- 성능향상, 무결성때문에 여러 SQL문장을 하나의 블록으로 구현하는 방법
▶ SQL 단점
-- 한번에 하나의 쿼리만 실행
-- if 문을 통해서 쿼리문 전체를 제아가 불가능
-- 변수가 없음
-- 에러처리가 없음
▶ PL/SQL 의 유형
-- 익명블록 : 이름이 없고 1회 실행하는 유형
-- 프로시저 : 이름이 존재, 반복된 로직을 실행하는 유형 > DB에 저장된 형태
-- 함수 : 프로시저 중에 리턴이 반드시 있는 유형
▶ PL/SQL 구조
-- 블록단위 샐행 : BEGIN END DECLEAR
▶DECLEAR
-- 선언부 PLSQL에서 사용하는 모든 변수, 상수를 선언하는 영역
-- DECLARE 변수이름 데이터타입;
-- DECLARE 변수이름 데이터타입 := 값;
-- DECLARE 변수이름 데이터타입 DEFAULT 값;
▶ BEGIN
-- 실행부 순차적으로 실행할 SQL을 작성하는 영역
-- 제어문, 반복, 함수 등등 사용 가능
▶ END
-- PL/SQL종료 >> END; /
▶EXCEPTION
-- 예외처리부 : 에러, 오류가 발생했을 때 예외처리하는 영역
구조
DECLARE(선언부)
-- 변수, 상수, 입력받은 값들을 선언
BEGIN(실행부)
-- 순차적으로 진행할 SQL을 작성
EXCEPTION(예외처리부)
END;
/
▶ F5를 누르면 pl을 실행해라
▶ 출력메시지가 나오지 않는다면?
>>SET serveroutput ON
SET serveroutput ON
▶ 출력내용이 나오지않고 > 실행되었습니다. >오류났습니다. 라는 메시지만 출력하는 것이 기본설정
▶ 기본설정을 변경해야합니다. >> SET serveroutput ON
SET serveroutput ON
예제
▶예제 1
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World!');
DBMS_OUTPUT.PUT_LINE('Hello, World!');
DBMS_OUTPUT.PUT_LINE('Hello, World!');
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
/
▶ 예제 2
DECLARE
name varchar2(15) := '너의이름';
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World! ' || name);
END;
/
▶ 예제 3
DECLARE
v_empno VARCHAR2(10);
v_ename VARCHAR2(20);
BEGIN
SELECT empno INTO v_empno FROM emp WHERE ename = 'SMITH';
DBMS_OUTPUT.PUT_LINE('Hello World! ' || v_empno);
-- 이름 : 사원번호에 대한
SELECT ename INTO v_ename FROM emp WHERE empno = v_empno;
DBMS_OUTPUT.PUT_LINE('Hello World! ' || v_ename);
END;
/
▶ 예제 4
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_hiredate emp.hiredate%TYPE;
BEGIN
SELECT empno, ename, hiredate
INTO v_empno, v_ename, v_hiredate
FROM emp
WHERE ename='SMITH';
DBMS_OUTPUT.PUT_LINE('사번 # ' || v_empno);
DBMS_OUTPUT.PUT_LINE('이름 # ' || v_ename);
DBMS_OUTPUT.PUT_LINE('입사일 # ' || v_hiredate);
END;
/
▶ 예제 5
ACCEPT p_ename PROMPT '조회할 사원 이름은?';
DECLARE
emp_record emp%ROWTYPE;
v_ename emp.ename%TYPE := '&p_ename';
BEGIN
SELECT * -- * : 테이블%ROWTYPE 이 정의되었을때만 사용가능
INTO emp_record
FROM emp
WHERE ename = UPPER(v_ename);
DBMS_OUTPUT.PUT_LINE('사번 # ' || emp_record.empno);
DBMS_OUTPUT.PUT_LINE('이름 # ' || emp_record.ename);
DBMS_OUTPUT.PUT_LINE('업무 # ' || emp_record.job);
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('&p_ename'||' 자료가 없습니다.');
WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('&p_ename'||' 자료가 2건 이상입니다.');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('검색시 오류가 발생했습니다.');
END;
/
'Programming > 오라클[SQL]' 카테고리의 다른 글
오라클[sql] 반복문 (0) | 2022.09.24 |
---|---|
오라클[sql] 조건문 IF / CASE (0) | 2022.09.24 |
오라클[sql] 시퀀스 / 인덱스 (0) | 2022.09.24 |
오라클[sql] merge / commit / rollback (0) | 2022.09.24 |
오라클[sql] 연습문제 (0) | 2022.09.24 |
댓글