-- 1. PL/SQL (Procedual Language extension to SQL) 은
-- 프로그래밍 언어의 특성을 가지는 sql 의 확장이며,
-- 데이터 조작과 질의 문장은 pl/sql 의 절차적 코드 안에 포함된다,
-- 또한 pl/sql 을 사용하려면 sql로 할 수 없는 절차적 작업이 가능하다.
-- 여기에서 절차적 이라는 단어가 가지는 의미는 어떤 것이 어떤 과정을
-- 거쳐 어떻게 완료되는지 그 방법을 정확하게 코드에 기술한다는 것을 의미한다
--2. pl/sql 은 절차적으로 표현하기 위해 변수를 선언할 수 있는 기능,
-- 참과 거짓을 구별할 수 있는 기능,
-- 실행 흐름을 컨트롤 할 수 있는 기능들을 제공한다,
--3. PL/SQL 은 블럭 구조로 되어있으며
-- 블럭은 선언/ 실행 / 예외처리 부분의 세 부분으로 구성되어 있다.
-- 또한, 반드시 실행 부분은 존재해야 하며, 구조는 다음과 같다
-- 4. 형식 및 구조
/*
[DECLARE]
--선언문(DECLATATIONS)
BEGIN
--실행문(STATEMENT)
[EXCEPTION]
--예외처리문(EXCEPTION HANDLERS)
END;
*/
--(엄밀히 따지면 예외처리문은 실행문에 포함되는 것)
--5. 변수 선언
/*
DECLARE
변수명 자료형;
변수명 자료형 := 초기값; (:=이게 대입연산자이다 . 우측에 있는걸 좌측으로 )
BEGIN
PL/SQL구문;
END;
*/
/*
이미지로 이해하기로는 := <= 이렇게 이해하면 된다 이런애는 없어요
이렇게 작성했다고 이렇게 한다 아니에요 자바와 같이 우를 좌에 대입하는데
그 약속이 이렇게 구성되어 있다, 처리하는실행구문을 작성하게됩니다
써봅시다 */
SET SERVEROUTPUT ON; --==>> 작업이 완료되었습니다.(0.08초)
--> System.out.println()
--> 『DBMS_OUTPUT.PUT_LINE()』
-- 화면에 결과를 출력하기 위한 환경변수 설정
/*
DECLARE
.......;
.......;
BEGIN
...;
..........;
.......;
END;*/
-- ● 변수에 임의의 값을 대입하고 출력하는 구문 작성
DECLARE
BEGIN
END;
(이 뼈대부터 작성하고 시작하도록 하자)
DECLARE
-- 선언부
D1 NUMBER := 10; --모두 선언과 동시에 초기화
D2 VARCHAR2(30) := 'HELLO';
D3 VARCHAR2(20) := 'Oracle';
BEGIN
-- 실행부
DBMS_OUTPUT.PUT_LINE(D1);
DBMS_OUTPUT.PUT_LINE(D2);
DBMS_OUTPUT.PUT_LINE(D3);
END;
/*
10
HELLO
Oracle
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
DECLARE
-- 선언부
D1 NUMBER := 10; --모두 선언과 동시에 초기화
D2 VARCHAR2(30) := 'HELLO';
D3 VARCHAR2(20) := 'Oracle';
BEGIN
-- 실행부
D1 := D1 * 10; --(오라클 복합대입연산자 없어용~ EX. D1 *= 10)
D2 := D2 || '민지';
D3 := D3 || ' World';
DBMS_OUTPUT.PUT_LINE(D1);
DBMS_OUTPUT.PUT_LINE(D2);
DBMS_OUTPUT.PUT_LINE(D3);
END;
/*
100
HELLO민지
Oracle World
PL/SQL 프로시저가 성공적으로 완료되었습니다.*/
-- ● IF문(조건문)
--IF ~ END IF ;
--IF ~ THEN ~ ELSE ~ END IF ;
-- IF ~ THEN ~ ELSIF~ THEN~ ELSIF ~THEN ~ELSE ~ END IF ;
-- 1. PL/SQL 의 IF 문장은 다른 언언의 IF 조건문과 거의 유사하다.
-- 일치하는 조건에 따라 선택적으로 작업을 수행할 수 있도록 한다,
-- TRUE 이면 THEN 과 ELSE 사이의 문장을 수행하고
-- FALSE 나 NULL 이면 ELSE 와 END 사이의 문장을 수행하게 된다,
2. 형식 및 구조
/*
IF 조건
THEN 처리구문;
ELSIF 조건
THEN 처리구문;
ELSIF 조건
THEN 처리구문;
ELSE
처리구문;
END IF;
*/
-- ● 변수에 들어있는 값에 따라...
-- Excellent, Good, Fail 로 구분하여
-- 결과를 출력하는 pl/sql 구문을 작성한다.
DECLARE
GRADE CHAR;
BEGIN
GRADE := 'B';
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;
/*
Fail
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
-- ● CASE문(조건문)
-- CASE ~ WHEN ~ THEN ~ ELSE~END CASE;
-- 1. 형식 및 구조
/*
CASE 변수
WHEN 값1
THEN 실행문;
WHEN 값2
THEN 실행문;
ELSE
실행문;
END CASE;
*/
-- ● 변수에 들어있는 값에 따라...
-- Excellent, Good, Fail 로 구분하여
-- 결과를 출력하는 pl/sql 구문을 작성한다.
DECLARE
GRADE CHAR;
BEGIN
GRADE := 'A';
CASE GRADE
WHEN 'A'
THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN 'B'
THEN DBMS_OUTPUT.PUT_LINE('Good');
ELSE DBMS_OUTPUT.PUT_LINE('Fail');
END CASE;
END;
/*
Excellent
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
-- ● 외부 입력 처리
--1 .ACCEPT 문
-- ACCEPT 변수명 PROMPT '메세지';
-- 외부 변수로부터 입력받은 데이터를 내부 변수에 전달할 때
-- 『&외부변수명 형태로 접근하게 된다,
-- ● 정수 2개를 외부로부터(사용자로부터) 입력받아
-- 이들의 덧셈 결과를 출력하는 PL/SQL 구문을 작성한다.
ACCEPT N1 PROMPT '첫 번째 정수를 입력하세요';
ACCEPT N2 PROMPT '두 번째 정수를 입력하세요';
DECLARE
--주요 변수 선언 및 초기화
NUM1 NUMBER := &N1;
NUM2 NUMBER := &N2;
TOTAL NUMBER := 0;
BEGIN
-- 연산 및 처리
TOTAL := NUM1 + NUM2;
-- 결과 출력
DBMS_OUTPUT.PUT_LINE('★'|| TOTAL || '★');
END;
-- ● 사용자로부터 입력받은 금액을 화폐 단위로
-- 출력하는 프로그램을 작성한다.
-- 단, 반환 금액은 편의상 1천원 미만, 10원 이상만 가능하다고 가정한다.
/*
실행 예)
바인딩 변수 입력 대화창 → 금액 입력 : 990
입력받은 금액 총액 : 990원
화폐단위 : 오백원 1, 백원 4, 오십원 1, 십원 4
*/
ACCEPT VAR1 PROMPT ' 금액 입력 : ';
DECLARE
TOTAL NUMBER := &VAR1;
FHUN NUMBER := TRUNC(&VAR1/500);
HUN NUMBER := TRUNC(MOD(&VAR1,500)/100);
FIF NUMBER := TRUNC(MOD(MOD(&VAR1,500),100)/50);
TEN NUMBER := MOD(MOD(MOD(&VAR1,500),100),50)/10;
BEGIN
DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || TOTAL||'원');
DBMS_OUTPUT.PUT_LINE('오백원 : ' || FHUN ||' 백원 : ' || HUN || ' 오십원 : ' || FIF || ' 십원 : ' ||TEN );
END;
/*
입력받은 금액 총액 : 990원
오백원 : 1 백원 : 4 오십원 : 1 십원 : 4
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
위와 같은 문제 / 다른 풀이 방식
ACCEPT INPUT PROMPT '금액 입력';
DECLARE
-- ● 주요 변수 선언 및 초기화
MONEY NUMBER := &INPUT;-- 연산을 위해 담아둔 변수
MONEY2 NUMBER := &INPUT;-- 출력을 위해 담아둔 변수
M500 NUMBER;-- 500원 짜리 갯수를 담아둘 변수
M100 NUMBER;-- 100원 짜리 갯수를 담아둘 변수
M50 NUMBER;-- 500원 짜리 갯수를 담아둘 변수
M10 NUMBER;-- 10원 짜리 갯수를 담아둘 변수
BEGIN
-- ● 연산 및 처리
-- MONEY 를 500 으로 나눠서 몫을 취하고 나머지는 버린다. → 500원의 갯수
M500 := TRUNC(MONEY/500);
-- MONEY 를 500 으로 나눠서 몫은 버리고 나머지는 취한다.
MONEY := MOD(MONEY,500);
--ㅡMONEY 를 100 으로 나눠서 몫을 취하고 나머지는 버린다. → 100원의 갯수
M100 := TRUNC(MONEY/100);
-- MONEY 를 100 으로 나눠서 몫은 버리고 나머지는 취한다.
MONEY := MOD(MONEY,100);
--ㅡMONEY 를 50 으로 나눠서 몫을 취하고 나머지는 버린다. → 50원의 갯수
M50 := TRUNC(MONEY/50);
-- MONEY 를 50 으로 나눠서 몫은 버리고 나머지는 취한다.
MONEY := MOD(MONEY,50);
--ㅡMONEY 를 10 으로 나눠서 몫을 취하고 나머지는 버린다. → 10원의 갯수
M10 := TRUNC(MONEY/50);
-- MONEY 를 10 으로 나눠서 몫은 버리고 나머지는 취한다.
MONEY := MOD(MONEY,10);
-- 결과 출력
DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || MONEY2);
DBMS_OUTPUT.PUT_LINE('화폐단위 : 오백원 ' || M500 || ;', 백원 '||M100||', 오십원 '
여기 나중에 마무리하기
END;
'📚Study Note > ORACLE' 카테고리의 다른 글
[ ORACLE ] 자료형 참조하는 %TYPE 퍼센트타입 │ %ROWTYPE 로우퍼센트타입 (0) | 2021.04.09 |
---|---|
[ ORACLE ] 반복문 3가지 │ LOOP │ WHILE LOOP │ FOR LOOP (0) | 2021.04.09 |
[ ORACLE ] DELETE │ VIEW (0) | 2021.04.08 |
[ ORACLE ] UPDATE : 테이블에서 기존 데이터를 변경 + 업데이트 실수를 백업테이블로 다시 수정하기 (0) | 2021.04.07 |
[ ORACLE ] DEFAULT 표현식 (0) | 2021.04.07 |