상세 컨텐츠

본문 제목

Oracle -PLSQL 실습1

IT/DBMS

by TMI1 2025. 7. 11. 16:01

본문

SELECT USER
FROM DUAL;
--==>> SCOTT
/* SQL 접속 모두 해제 
같은 시트에 작업해도 상관없지만, 그럼 헷갈림. 
SQL 워크시트와 PL SQL 워크시트 구분해서 작업할것임 */ 

-- ■■■ PL/SQL ■■■--

-- 1. PL/SQL(Procedural Language extension to SQL)은
--    프로그래밍 언어의 특성을 가지는 SQL 의 확장이며,
--    데이터 조작과 질의 문장은 PL/SQL 의 절차적 코드 안에 포함된다.
--    또한, PL/SQL 을 사용하면 SQL로 할 수 없는 절차적 작업이 가능하다.
--    여기에서 [절차적] 이라는 단어가 가지는 의미는
--    어떤 것이 어떤 과정을 거쳐 어떻게 완료되는지
--    그 방법을 정확하게 코드에 기술한다는 것을 의미한다.

-- 2. PL/SQL 은 절차적으로 표현하기 위해
--    변수를 선언할 수 있는 기능, 
--    참과 거짓을 구별할 수 있는 기능,
--    실행 흐름을 컨트롤할 수 있는 기능 등을 제공한다.

-- 3. PL/SQL 은 블럭 구조로 되어 있으며,
--    블럭은 선언 부분, 실행 부분, 예외 처리 부분의
--    세 부분으로 구성되어 있다.
--    또한, 반드시 실행 부분은 존재해야 하며, 구조는 다음과 같다.

-- 4. 형식 및 구조
/*
([] : 생략가능)
[DECLARE]
    -- 선언문(declarations)  
BEGIN
    -- 실행문(startments)
        
    [EXCEPTON]
    -- 예외 처리문(exception handlers)
END;            
*/

-- 5. 변수 선언
/*
DECLARE
    변수명 자료형;
    변수명 자료형 := 초기값;
    
BEGIN
    PL/SQL 구문;
END;
*/
-- ERD 클라우드    
-- 트랜잭션 ROLLBACK;

SET SERVEROUTPUT ON;
--==>> 작업이 완료되었습니다.(0.064초) 
-- DBMS_OUTPUT.PUT.LINE()을 통해 
-- 화면에 결과를 출력하기 위한 환경변수 설정 

--○ 변수에 임의의 값을 대입하고 해당 변수에 담긴 값을 출력하는 
-- PL/SQL 구문 작성 

--  ■■■ ■■■ 블럭 잡아서 실행 해 줘야 함. 
DECLARE
    -- 선언부
    D1  NUMBER := 10; --D1의 데이터타입은 NUMBER이야. 
    D2  VARCHAR(30) := 'HELLO';
    D3  VARCHAR(20) := 'ORACLE';
BEGIN
    -- 실행부 
    -- System.out.prntln(D1);
    DBMS_OUTPUT.PUT_LINE(D1); -- 패키지 안에 담겨있는 PUT_LINE 함수 호출 
    DBMS_OUTPUT.PUT_LINE(D2);
    DBMS_OUTPUT.PUT_LINE(D3);
END;
--==>> 
/*
10
HELLO
ORACLE

PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/ 

--○ 변수에 임의의 값을 대입하고 추가 연산 처리하여 
--   해당 변수에 담긴 값을 출력하는 PL/SQL 구문 작성 

DECLARE
    --선언부
    V1  NUMBER := 20;
    V2  VARCHAR(30) := 'HELLO';
    V3  VARCHAR(20) := 'ORACLE';
BEGIN
    --실행부
    V1 := V1 + 10;  -- V1 +=10 ; << 자바 형식 
    -- 위의 V1 값인 20에 10을 더한값이 출력됨 
    
    V2 := V2 || '주형이'; 
    V3 := V3 || 'World';
    DBMS_OUTPUT.PUT_LINE(V1);
    DBMS_OUTPUT.PUT_LINE(V2);
    DBMS_OUTPUT.PUT_LINE(V3);
END;
/*
30
HELLO주형이
ORACLEWorld

PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
-- JAVA

    구문
    { --시작
    
    } --끝


-- ORACLE ( {}를 사용하지 않음. )

    구문
    
    END 구문
    
    (IF (IF 시작) ~ END IF (IF문 종료))
*/

-- 블레이스가 없으므로 들여쓰기를 잘 해줘야 함 
--○ IF 문(조건문)
--   IF ~ END IF;
--   IF ~ THEN ~ ELSE ~ END IF; 
--   IF ~ THEN ~ ELSIF ~ THEN ~ ELSIF ~ THEN ~ END IF; -- ELSIF라고 쓴다. 

-- 1. PL/SQL 의 IF 문장은 다른 언어의 IF 조건문과 거의 유사하다.
--    일치하는 조건에 따라 선택적으로 작업을 수행할 수 있도록 한다.
--    TRUE 이면 THEN 과 ELSE 사이의 문장을 수행하고
--    FALSE 나 NULL 이면 ELSE 와 END IF; 사이의 문장을 수행하게 된다.

-- 2. 형식 및 구조
/*
IF 조건
    THEN 처리구문; 
END IF; -- IF시작했다 IF 끝났다. 라고 조건 잡아주기 
*/
--※ ELSE 에는 THEN 을 사용하지 않는다! 주의!

/*
IF 조건
    THEN 처리구문;
ELSE
    처리문; -- 아닐때 처리는 THEN이 없음 
END IF;
*/

--중첩구문
/*
IF (조건) -- 조건에 ()를 쓰는 걸 강사님 추천
    THEN 처리문;
ELSIF (조건)
    THEN 처리문
ELSIF (조건)
    THEN 처리문
ELSE
    처리문;
END IF;
*/

--○ 변수에 담겨있는 값에 따라
--   Excellent, Good, Fail 로 구분하여
--   결과를 출력하는 PL/SQL 구믄을 작성한다.

DECLARE
    -- 선언부
    GRADE   CHAR;
BEGIN
    GRADE := 'B';
    
    --DBMS_OUTPUT.PUT_LINE(GRADE);
    
    IF GRADE = 'A'                               
        THEN DBMS_OUTPUT.PUT_LINE('EXCELLENT');           
    ELSIF GRADE = 'B'                            
         THEN DBMS_OUTPUT.PUT_LINE('GOOD');  
    ELSE
        DBMS_OUTPUT.PUT_LINE('FAIL');
    
    END IF;
   
END;
--==>> EXCELLENT
--==>> GOOD
--==>> FAIL

--※ 외부 입력 처리

-- 1. ACCEPT 문
-- ACCEPT 변수명 PROMPT '메세지';
-- 외부 변수로부터 입력받은 데이터를 내부 변수에 전달할 때
-- [&외부변수명] 형태로 접근하게 된다. 

--○ 정수 2개를 외부로부터(사용자로부터) 입력받아
--   이들의 덧셈 연산 결과를 출력하는 PL/SQL 구문을 작성한다.

ACCEPT N1 PROMPT '첫 번째 정수를 입력하세요'; 
-- 창에서 10을 입력하면 외부변수인 N1에 값이 담김
ACCEPT N2 PROMPT '두 번째 정수를 입력하세요'; 

DECLARE
    --선언부
    -- → 주요 변수 선언 및 초기화
    --VNUM1    NUMBER := 10;
    VNUM1    NUMBER := &N1; -- 위에서  입력한 10을 VNUM1 으로 끌고들어온다. 
    --VNUM2    NUMBER := 20;
    NUM2    NUMBER := &N2;
    VRESULT   NUMBER := 0;
BEGIN
    -- 실행부
    -- → 연산 및 처리
    VRESULT := VNUM1  + VNUM2;
    
    -- → 결과 출력
    DBMS_OUTPUT.PUT_LINE('처리결과 : ' || VRESULT);
END;

-- 문제
-- 사용자로부터 입력받은 금액을 화폐 단위로 출력하는 프로그램을 작성한다.
-- 단, 반환금액은 편의상 1천원 미만, 10원 이상만 가능하다고 가정한다.
/*
실행 예)
바인딩 변수 입력 대화창 → 금액 입력 : 990 OR 980 이라고 입력하면
입력받은 금액 총액 : 980원
화폐단위 : 오백원 1, 백원 4, 오십원 1, 십원 3 
*/

ACCEPT INPUT PROMPT '금액 입력';
DECLARE
    --○ 주요 변수 선언 및 초기화
    MONEY   NUMBER := &INPUT;       -- 연산을 위해 담아둘 변수
    MONEY2  NUMBER := &INPUT;       -- 결과 출력을 위해 입력값을 담아둘 변수(→ 연산과정에서 값이 변하기 때문에)
    M500    NUMBER;                 -- 500원짜리 갯수를 담아둘 변수
    M100    NUMBER;                 -- 100원 짜리 개수를 담아둘 변수
    M50     NUMBER;                 --  50원 짜리 개수를 담아둘 변수
    M10     NUMBER;                 --  10원 짜리 개수를 담아둘 변수  
BEGIN
    --○ 연산 및 처리
    -- MONEY 를 500으로 나눠서 몫을 취하고 나머지는 버린다.   → 500원의 갯수
    M500 := TRUNC(MONEY / 500);
    
    -- MONEY를 500으로 나눠서 몫은 버리고 나머지를 취한다.<< MOD(MONEY, 500)  → 500원의 갯수를 뺀 나머지. 
    -- 500원짜리는 빠져나가고 남은 금액으로 처리해야 하기에 
    MONEY := MOD(MONEY, 500); 
    
    -- MONEY 를 100으로 나눠서 몫을 취하고 나머지는 버린다.   → 100원의 갯수
    M100 := TRUNC(MONEY / 100);
    
    -- MONEY 를 100으로 나눠서 몫은 버리고 나머지를 취한다.   → 100원의 갯수 확인하고 남은 금액
    -- 이 금액으로 MONEY 를 갱신.    
    MONEY := MOD(MONEY, 100);
    
    -- MONEY 를 50으로 나눠서 몫을 취하고 나머지는 버린다.    → 50원의 갯수
    M50 := TRUNC(MONEY / 50);
 
    -- MONEY 를 50으로 나눠서 몫은 버리고 나머지를 취한다.    → 50원의 갯수 확인하고 남은 금액
    -- 이 금액으로 MONEY 를 갱신
    MONEY := MOD(MONEY, 50);
    
    -- MONEY 를 10으로 나눠서 몫을 취하고 나머지는 버린다.    → 10원의 갯수
    M10 := TRUNC(MONEY / 10);

    MONEY := MOD(MONEY, 10);
    
    --○ 결과 출력
    -- 취합된 결과(화폐 단위별 개수)를 형식에 맞게 최종 출력한다.
    
   DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || MONEY2 || '원');
   DBMS_OUTPUT.PUT_LINE('화폐 단위 : 오백원 ' || M500   
                                       || ', 백원 '  ||  M100 
                                       || ', 오십원 '||  M50   
                                       || ', 십원 '  ||  M10);                             
END;

/*
END;
입력받은 금액 총액 : 950원
화폐 단위 : 오백원 1, 백원 4, 오십원 1, 십원 0

PL/SQL 프로시저가 성공적으로 완료되었습니다.

*/

 

'IT > DBMS' 카테고리의 다른 글

Oracle -PLSQL 함수  (0) 2025.07.11
Oracle -PLSQL 실습2(반복문)  (0) 2025.07.11
Oracle -DELETE, VIEW 생성  (3) 2025.07.11
Oracle - 테이블 전체 컬럼 이름UPDATE  (1) 2025.07.11
Oracle - UPDATE 실습2  (0) 2025.07.10

관련글 더보기

댓글 영역