기본적으로 블록 구조이다.
중첩 블록도 가능. 포함된 블록을 nested block 이라 한다.
블록 내에서 sql 문을 사용하여 데이터를 검새하고 수정
A>블록의 유형 : 익명블록 :일회성일때 주로 사용
저장된 블록: 서브 프로그램 또는 프로그램 단위 라고도 한다.
B>기본 구성 : 선언부(DECLARE) : 변수나 상수 선언
실행부(BEGIN) : 제어문, 반복문 등 실행
예외처리부(EXCEPTION)
C>문법 규칙 : 1.END 이외의 예약어 뒤에는 세미콜론을 안 붙임 , 그 외에는 붙임
2. 기본적으로 문장 결과 출력을 안해줌
결과를 화면에 출력하고 싶으면 SET SERVEROUTPUT ON
3. 리터럴(문자,날짜)은 단일인용부호(‘)로 표시, 널 값은 NULL 상수로 기술
4. 예약어는 식별자명으로 사용될 수 없음 , Alias 로는 가능
5. DDL 을 직접 지원하진 않음 - 대신 동적 sql 에선 가능
6. DCL 도 직접 지원 안함 - 마찬가지로 동적 sql에선 가능
7. INTO 시 순서, 개수 ,타입이 다 일치해야 함.
D> 예시
예시1.
DECLARE
vno NUMBER(4);
vname VARCHAR2(10);
BEGIN
SELECT empno,ename INTO vno, vname
FROM emp
WHERE empno = 7900;
DBMS_OUTPUT.PUT_LINE(vno||' ' ||vname);
END;
예시2. 변수의 타입 자동 설정
DECLARE
v_profno professor.profno%TYPE; -- %TYPE은 테이블에서 정의한 타입대로 하겠다는 뜻
v_pay professor.pay%TYPE;
BEGIN
SELECT profno ,pay INTO v_profno, v_pay
FROM professor WHERE profno = 1001;
--SELECT profno ,pay FROM professor WHERE profno = 1001의 결과를 v_profno, v_pay에
--넣는다고 생각하면 됨
DBMS_OUTPUT.PUT_LINE(v_profno|| '번 교수 급여'|| v_pay);
END;
예시3. 값 입력받기
DECLARE
v_profno professor.profno%TYPE ;
v_name professor.name%TYPE ;
v_deptno professor.deptno%TYPE ;
v_hdate professor.hiredate%TYPE ;
BEGIN
SELECT profno,name,deptno,hiredate INTO v_profno,v_name,v_deptno,v_hdate
FROM professor
WHERE profno = '&교수번호'; -- 입력할때 '교수번호' 라는 이름으로 입력을 받음
DBMS_OUTPUT.PUT_LINE(v_profno||' '||v_name||' '||v_deptno||' '||v_hdate);
END;
예시4.
--변수 선언이 없으면 DECLARE 가 없어도 됨
BEGIN
INSERT INTO 값을 삽입할 테이블 이름
VALUES(값1 ,값2);
END;
/
예시5. 변수에 값 대입하여 테이블에 행 추가
DECLARE
v_no number := '&no'; -- := 대입연산자
v_name varchar2(10) := '&name';
v_addr varchar2(10) := '&addr';
BEGIN
INSERT INTO pl_test2
VALUES(v_no,v_name,v_addr);
END;
/
SELECT * FROM pl_test2;
예시6. UPDATE 하기
BEGIN
UPDATE pl_test
SET name ='bbb'
WHERE no ='2';
END;
예시7. DELETE 하기
BEGIN
DELETE FROM pl_test
WHERE no=1;
END;
예시8. MERGE하기
BEGIN
MERGE INTO pl_merge2 m2
USING pl_merge1 m1
ON(m1.no = m2.no)
WHEN MATCHED THEN
UPDATE SET m2.name =m1.name
WHEN NOT MATCHED THEN
INSERT VALUES(m1.no,m1.name);
END; /
예시9. 조인하기
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_edeptno emp.deptno%TYPE;
v_deptno dept.deptno%TYPE;
v_dname dept.dname%TYPE;
BEGIN
SELECT e.empno, e.ename, d.deptno, d.dname
INTO v_empno,v_ename,v_deptno,v_dname
FROM emp e, dept d WHERE e.deptno = d.deptno
AND e.empno= '7900';
DBMS_OUTPUT.PUT_LINE(v_empno ||' '||v_ename ||' '||v_deptno||' '|| v_dname);
END; /
예시 10. 두 수 입력 받아서 출력하기
DECLARE
v_fisrt number(10) :='&첫숫자'; --- 주의!! '&첫 숫자' 같이 띄어쓰기가 있으면 오류난다.
v_second number(10) :='&두번째숫자'; ---- 입력을 받을 때 '첫' 이라고 뜨고 나머지 '숫자' 부분 때문에
---- 오류가 난다.
BEGIN
DBMS_OUTPUT.PUT_LINE(v_fisrt + v_second);
END;
/
'DB관련 > oracle' 카테고리의 다른 글
PL/SQL 3- 복합 변수, 제어문 (0) | 2021.01.20 |
---|---|
PL/SQL -2 스칼라 변수 (0) | 2021.01.20 |
복수행 함수 - 연산 함수와 그룹함수 (0) | 2021.01.15 |
일반 함수(nvl, nvl2, decode) (0) | 2021.01.15 |
형과 형 변환 함수 (0) | 2021.01.15 |