-
PL/SQL 기본 문법프로그래밍/DBMS 2021. 8. 24.반응형
시작하기에 앞서 VScode에서 DBMS를 출력하기 위해서
SET SERVEROUTPUT ON
를 ON 시켜 준다.
DECLARE vname VARCHAR2(30); vpay NUMBER; BEGIN SELECT name, sal+bonus INTO vname, vpay FROM emp WHERE empNo = '1001'; DBMS_OUTPUT.PUT_LINE(vname||':'||vpay); END; /
DECLARE = 함수 선언하겠다.
- vname, vpay (형식 뒤에 세미콜론; 붙여야함)
BEGIN = 구문을 실행 하겠다.
- emp 테이블에서 어떤걸 가져올지 정하고 INTO를 사용해서 아까 선언했던 변수에 넣어준다. (순서 주의)
- DBMS_OUTPUT = 출력하겠다 (변수에 값이 들어갔으니까 변수 이름만 넣어주면 출력이 된다.)
END = 구문의 끝을 알린다
반드시 / 슬러시도 넣어줘야한다.
/ 슬러시가 있어야만 전체 구문의 끝을 알린다.
%TYPE
테이블의 컬럼을 참조
-- %TYPE : 테이블의 컬럼을 참조하는 변수 선언 DECLARE vname emp.name%TYPE; vpay NUMBER; BEGIN SELECT name, sal+bonus INTO vname, vpay FROM emp WHERE empNo = '1001'; DBMS_OUTPUT.PUT_LINE(vname || ' : ' || vpay); END; /
위 코드랑 기능은 동일하다.
그러나 DECLARE 변수 선언 부분에서 vname의 형식을 줄때 %TYPE을 사용 했는데
이건 emp의 name의 타입을 가져오겠다 라는 뜻 이다.
어차피 name의 값을 vname 함수에 담아야 하니까 둘의 형태는 똑같아야 한다.
그러니까 emp.name%TYPE를 사용해서 emp테이블의 name의 형식을 가져오겠다 라고 선언 하는 것이다.
%ROWTYPE
= 테이블의 행을 참조하는 레코드 선언
쉽게 말하면 테이블의 행의 속성들을 다 가져온다는 뜻
%TYPE은 변수 이름을 지정해줬다면 %ROWTYPE은 테이블 이름을 지정 해주면 된다.
DECLARE vrec emp%ROWTYPE; BEGIN -- SELECT * INTO vrec FROM emp WHERE empNo = '1001'; SELECT name, dept, sal INTO vrec.name, vrec.dept, vrec.sal FROM emp WHERE empNo = '1001'; DBMS_OUTPUT.PUT_LINE(vrec.name || ' : ' || vrec.dept || ' : ' || vrec.sal); END; /
레코드 유형 선언
DECLARE TYPE MYREC IS RECORD -- 레코드 유형 선언 ( name VARCHAR2(30), pay emp.sal%TYPE ); asd MYREC; -- 레코드 변수 선언 BEGIN SELECT name, sal INTO asd.name, asd.pay FROM emp WHERE empNo = '1001'; DBMS_OUTPUT.PUT_LINE(asd.name || ' : ' || asd.pay); END; /
PL/SQL의 IF
DECLARE a NUMBER := 10; BEGIN IF MOD(a,6) = 0 THEN DBMS_OUTPUT.PUT_LINE(a || '는 2또는 3의 배수'); ELSIF MOD(a,3) = 0 THEN DBMS_OUTPUT.PUT_LINE(a || '는 3의 배수'); ELSIF MOD(a,2) = 0 THEN DBMS_OUTPUT.PUT_LINE(a || '는 2의 배수'); ELSE DBMS_OUTPUT.PUT_LINE(a || '는 2또는 3의 배수가 아님'); END IF; END; /
변수 선언할때 보통 =을 안쓰고 := 를 쓰니까 주의하자.
MOD는 나머지 구하는 함수이다.
- a와6을 나누었을때 나머지가 0이면 a는 2또는 3의 배수이다 를 출력해라 라는 뜻이다.
ELSE IF 작성할때도 여기선 특이하게 ELSIF 이다 주의 !
DECLARE vname VARCHAR2(30); vpay NUMBER; vtax NUMBER; BEGIN SELECT name, sal + bonus INTO vname, vpay FROM emp WHERE empNo = '1001'; IF vpay >= 3000000 THEN vtax := ROUND(vpay * 0.03); ELSIF vpay >= 2000000 THEN vtax := ROUND(vpay * 0.02); ELSE vtax := 0; END IF; DBMS_OUTPUT.PUT_LINE(vname || '=>' || vpay || '=>' || vtax); END; /
emp 테이블에서 name, sal+bonus, tax를 출력 할건데 tax는 계산 해야한다.
처음 디클레어에서 사용할 변수를 선언하고
비긴 에서 실행할 코드 입력(emp 테이블에서 값 가져와서 아까 선언한 변수에 대입)
그리고 IF문 이용해서 tax를 구한다.
마지막으로 출력.
IF문 말고 기존에 사용하던 CASE문으로도 조건문이 가능하다.
DECLARE vname VARCHAR2(30); vpay NUMBER; vtax NUMBER; BEGIN SELECT name, sal + bonus INTO vname, vpay FROM emp WHERE empNo = '1001'; CASE WHEN vpay >= 3000000 THEN vtax := ROUND(vpay * 0.03); WHEN vpay >= 2000000 THEN vtax := ROUND(vpay * 0.02); ELSE vtax := 0; END CASE; DBMS_OUTPUT.PUT_LINE(vname || '=>' || vpay || '=>' || vtax); END; /
LOOP 루프
DECLARE n NUMBER := 0; s NUMBER := 0; BEGIN LOOP n := n+1; s := s+n; EXIT WHEN n = 100; END LOOP; DBMS_OUTPUT.PUT_LINE('결과 = ' || s); END; /
2또는 3의 배수를 제외하고 출력하기
DECLARE n NUMBER := 0; BEGIN WHILE n < 100 LOOP n := n + 1; CONTINUE WHEN MOD(n, 2) = 0 OR MOD(n,3) = 0; DBMS_OUTPUT.PUT(n || ' '); -- 출력하고 라인 넘기지 않음 END LOOP; DBMS_OUTPUT.NEW_LINE(); -- 라인 넘김 END; /
WHILE LOOP
DECLARE n NUMBER := 0; s NUMBER := 0; BEGIN WHILE n < 100 LOOP n := n + 1; s := s + n; END LOOP; DBMS_OUTPUT.PUT_LINE('결과 : ' || s); END; /
FOR LOOP
DECLARE s NUMBER := 0; BEGIN -- FOR 반복을 나타내는 변수는 자동 선언된다. 즉, 변수를 선언하지 않는다. FOR n IN 1..100 LOOP s := s + n; END LOOP; DBMS_OUTPUT.PUT_LINE('결과 : ' || s); END; /
마찬가지로 1~100까지의 합을 구하는 코드다.
SQL Cursor FOR LOOP
DECLARE BEGIN FOR asd IN (SELECT name, sal FROM emp) LOOP DBMS_OUTPUT.PUT_LINE(asd.name || '=>' || asd. sal); END LOOP; END; /
이렇게하면 emp 테이블을 전체 출력을 할 수 있다.
쿼리를 실행해서 각 행을 LOOP로 처리함.
반응형'프로그래밍 > DBMS' 카테고리의 다른 글
자바 오라클 DB(디비) 연동하기 /Maven Project (0) 2021.08.25 오라클 계정 삭제 및 재추가 (0) 2021.08.25 오라클 12c과 11g의 구동 방식 차이 (페이징) (0) 2021.08.22 트랜잭션 Trasaction (0) 2021.08.19 고급 쿼리 / 정규식 (0) 2021.08.18