본문 바로가기
Coding/데이터베이스

PL/ SQL 구조

by 찡콩찡 2022. 9. 19.
비밀번호 expired 나오면 sys로 접속 아래 문장을 쳐준다.

--1. ALTER USER SCOTT IDENTIFIED BY TIGER;

--2. ALTER USER MANDANG IDENTIFIED BY MADANG;

PL/SQL 프로그램의 기본 단위

구성 키워드 필수/선택 설명
DECLARE(선언부) 선택 실행에 사용될 변수. 상수, 커서 등을 선언
BDGIN(실행부) 필수 조건문,반복문, SELECT,DML, 함수 등을 정의
 EXCEPTION(예외 처리부) 선택 PL.SQL 실행 도중 발생하는 오류(예외상황)를 해결하는 문장 기술

변수와 상수

 변수: 데이터를 일시적으로 저장 / 저장되는 값의 변경 가능 / 이름, 저장할 자료형을 지정

①변수이름 ② 자료형 ③:=  ④값 또는 값이 도출되는 여러 표현식

상수: 한번 저장한 값이 프로그램 종료시까지 유지 / CONSTANT 키워드 사용 

①변수이름  ②CONSTANT  ③자료형 ④:= ⑤값 또는 값을 도출하는 여러 표현식;

변수의 기본값 지정

①변수이름 ②자료형 ③DEFAULT ④값 또는 값 도출되는 여러 표현식;

변수  NULL 값 저장 막기

①변수이름 ②자료형 ③NOT NULL ④:= 또는 DEFAULT ⑤값 또는 값을 도출하는 여러 표현식;

변수의 자료형

 스칼라형 : 냐부 구성 요소가 없는 단일 값

분류 자료형 설명
숫자 NUMBER 소수점을 포함할 수 있는 최대 38자리 숫자 데이터
문자열 CHAR 최대 32.767 바이트 고정 길이 문자열 데이터
VARCHAR2 최대 32.767 바이트 가변 길이 문자열 데이터
날짜 DATE 기원전 4712년 1월 1일부터 서기 9999 12월 31일까지 날짜 데이터
논리 데이터 BOOLEAN PL/SQL에서만 사용할 수 있는 논리 자료형 TRUE, FALSE,NULL을 포함

IF 조건문 IF 조건식 THEN 수행할 명령어; END IF;

종류 설명
IF-THEN 특정 조건을 만족하는 경우 작업 수행
IF-THEN-ELSE 특정 조건을 만족하는 경우와 반대 경우 각각 지정한 작업 수행
IF-THEN-ELSIF 여러 조건에 따라 각각 지정한 작업 수행

CASE 조건문

종류 설명
단순 CASE문 비교 기준이 되는 조건의 값이 여러 가지일 때 해당 값만 명시하여 작업 수행
검색 CASE문 특정한 비교 기준 없이 여러 조건식을 나열하여 조건식에 맞는 작업 수행
CASE 비교기준   WHEN 값1 THEN    수행할 명령어; 
  WHEN 값2 TEHN  수행할 명령어; 
END CASE;

결과물을 보고 싶다면 SERVEROUTPUT 설정 을 ON 으로 설정해 주어야 한다.

SET SERVEROUTPUT ON;  실행 후 삭제

 

 

--1

BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello, PL/SQL!');
END;

 

--2

DECLARE
  V_EMPNO NUMBER(4) :=7788;
  V_ENAME VARCHAR2(10);
BEGIN
  V_ENAME := 'SCOTT';
  DBMS_OUTPUT.PUT_LINE('V_ENAME:' || V_ENAME);
END;

 

 

 

--3

DECLARE
  V_EMPNO NUMBER(4) :=7788;
  V_ENAME VARCHAR2(10);
BEGIN
  V_ENAME := 'SCOTT';
  DBMS_OUTPUT.PUT_LINE('V_ENAME:' || V_ENAME);
  DBMS_OUTPUT.PUT_LINE('V_EMPNO:' || V_EMPNO);
END;

 

 

--4

DECLARE
  V_TAX CONSTANT NUMBER(1) :=3;
BEGIN
  DBMS_OUTPUT.PUT_LINE('V_TAX:' || V_TAX);
END;

 

--5.

DECLARE
 V_DEPTNO NUMBER(2) DEFAULT 10;
BEGIN
  DBMS_OUTPUT.PUT_LINE('V_DEPTNO:'||V_DEPTNO);
END;

--6.

DECLARE
 V_DEPTNO NUMBER(2) NOT NULL:=10;
BEGIN
  DBMS_OUTPUT.PUT_LINE('V_DEPTNO:'||V_DEPTNO);
END;

 

--7. NULL을 허용하지 않으며 디폴트 값은 10이야! 라는 의미

DECLARE
 V_DEPTNO NUMBER(2) NOT NULL DEFAULT 10;
BEGIN
  DBMS_OUTPUT.PUT_LINE('V_DEPTNO:'||V_DEPTNO);
END;

--8.

--V_DEPTNO DEPT테이블의 DEPTNO 타입과 같은 타입 정의하고 50으로 초기화
DECLARE
 V_DEPTNO DEPT.DEPTNO%TYPE :=50;
BEGIN
--V_DEPTNO 출력하기
  DBMS_OUTPUT.PUT_LINE('V_DEPTNO:'||V_DEPTNO);
END;

 

--9

DECLARE
  --V_DEPT_ROW DEPT 테이블의 ROW와 같은 타입 선언
  V_DEPT_ROW DEPT%ROWTYPE;
BEGIN
  SELECT DEPTNO, DNAME, LOC INTO V_DEPT_ROW --변수명
  FROM DEPT--테이블명
  WHERE DEPTNO =40;  --부서번호가 40번        
  DBMS_OUTPUT.PUT('DEPTNO:'||V_DEPT_ROW.DEPTNO); --부서번호 출력
  DBMS_OUTPUT.PUT('DNAME:'||V_DEPT_ROW.DNAME); --부서명 출력
  DBMS_OUTPUT.PUT('LOC:'||V_DEPT_ROW.LOC);   --부서위치 출력 
END;

--10.

DECLARE
  V_NUMBER NUMBER :=13;
BEGIN
IF MOD(V_NUMBER,2) = 1 THEN --홀수 여부 검사
    DBMS_OUTPUT.PUT_LINE('V_NUMBER의 값인'||V_NUMBER||'은/는 홀수입니다.'); --V_NUMBER가 홀수 또는 짝수 임을 출력
END IF;
END;

--11.

DECLARE
  V_NUMBER NUMBER :=14;
BEGIN
IF MOD(V_NUMBER,2) = 1 THEN --홀수 여부 검사
    DBMS_OUTPUT.PUT_LINE(V_NUMBER||'은/는 홀수입니다.'); --V_NUMBER가 홀수 또는 짝수 임을 출력
    ELSE
    DBMS_OUTPUT.PUT_LINE(V_NUMBER||':짝수');  
  END IF;
END;

--12.  IF 문으로 학점 출력하기 90점이상:A 80이상:B 70이상:C 60점이상:D 그외 F

DECLARE
 V_SCORE NUMBER :=87;
BEGIN
 
  IF V_SCORE>=90 THEN
    DBMS_OUTPUT.PUT_LINE('A');
  ELSIF V_SCORE>=80 THEN
    DBMS_OUTPUT.PUT_LINE('B');
  ELSIF V_SCORE>=70 THEN
    DBMS_OUTPUT.PUT_LINE('C');
   ELSIF V_SCORE>=60 THEN
    DBMS_OUTPUT.PUT_LINE('D');
  ELSE
    DBMS_OUTPUT.PUT_LINE('F');
  END IF;
END;

 

--13.

DECLARE
 V_SCORE NUMBER :=87;
BEGIN
 CASE TRUNC(V_SCORE/10) --10으로 나누고 소수 이해 절삭하면 앞자리만 남음
 WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('A');
 WHEN 9 THEN DBMS_OUTPUT.PUT_LINE('A');
 WHEN 8 THEN DBMS_OUTPUT.PUT_LINE('B');
 WHEN 7 THEN DBMS_OUTPUT.PUT_LINE('C');
 WHEN 6 THEN DBMS_OUTPUT.PUT_LINE('D');
 ELSE DBMS_OUTPUT.PUT_LINE('F');
 END CASE;
END;

 

--14. 13번과 동일하나 CASE 옆에 식을 쓰지 않고 WHEN에 작성해서 처리하기

DECLARE
 V_SCORE NUMBER :=87;
BEGIN
 CASE 
 WHEN V_SCORE>=90 THEN DBMS_OUTPUT.PUT_LINE('A'); 
 WHEN V_SCORE>=80 THEN DBMS_OUTPUT.PUT_LINE('B');
 WHEN V_SCORE>=70 THEN DBMS_OUTPUT.PUT_LINE('C');
 WHEN V_SCORE>=60 THEN DBMS_OUTPUT.PUT_LINE('D');
 ELSE DBMS_OUTPUT.PUT_LINE('F');
 END CASE;
END;

 

--15. LOOP와 END LOOP를 사용하여 1부터 5까지 출력하기

DECLARE
  V_NUM NUMBER :=1;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE(V_NUM);
    V_NUM := V_NUM +1;
    EXIT WHEN V_NUM >5;
  END LOOP;
END;

 

--16 5부터 1까지 찍어보기

DECLARE
  V_NUM NUMBER :=5;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE(V_NUM);
    V_NUM := V_NUM -1;
    EXIT WHEN V_NUM <1;
  END LOOP;
END;

--17 1,3,5,7,9 출력

DECLARE
  V_NUM NUMBER :=1;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE(V_NUM);
    V_NUM := V_NUM +2;
    EXIT WHEN V_NUM >9;
  END LOOP;
END;

 

--18.FOR문 이용해서 1부터 5까지 출력

BEGIN
  FOR i IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('I:'||i);
  END LOOP;
END;

 

--19  LOOP를 이용해서 1~10 숫자 중 짝수만 출력하기

BEGIN
  FOR i IN 1..10 LOOP
    CONTINUE WHEN MOD(I,2)= 1; --홀수이면 건너 뛰기
    DBMS_OUTPUT.PUT_LINE('I:'||i);
  END LOOP;
END;

 

--20. 

V_DEPTNO 값을 10으로 초기화 하되 변수의 자료형을 DEPT 테이블의 DEPTNO의 자료형과 같은
타입으로 참조형 선언하기
V_DEPT 값이 10이면 DNAME: ACCOUNTING 이라고 출력
V_DEPT 값이 20이면 DNAME: RESEARCH 이라고 출력
V_DEPT 값이 30이면 DNAME: SALES 이라고 출력
V_DEPT 값이 40이면 DNAME:OPERATIONS 이라고 출력
DECLARE
  V_DEPTNO DEPT.DEPTNO %TYPE :=10;
BEGIN
 CASE V_DEPTNO 
  WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('DNAME:ACCOUNTING');
  WHEN 20 THEN DBMS_OUTPUT.PUT_LINE('DNAME:RESEARCH');
  WHEN 30 THEN DBMS_OUTPUT.PUT_LINE('DNAME:SALES');
  WHEN 40 THEN DBMS_OUTPUT.PUT_LINE('DNAME:OPERATIONS');
  ELSE DBMS_OUTPUT.PUT_LINE('DNAME:N/A');
 END CASE;
END;