#title PL/SQL 예제들 [[TableOfContents]] ==== 커서, For루프를 사용한 간단한 검색 ==== {{{#!geshi plsql /* OPEN, FETCH, CLOSE, %FOUND등의 부분이 전혀 필요가 없다. RPAD()는 2번째 매개변수에 명시한 숫자만큼 3번째 매개변수 글자를 채워준다. */ DECLARE CURSOR cur_emp IS SELECT empno, ename, deptno FROM emp; BEGIN DECLARE row_count PLS_INTEGER; BEGIN DBMS_OUTPUT.PUT_LINE(RPAD('empno', 5, ' ') || ' ' || RPAD('ename', 10, ' ') || ' ' || RPAD('deptno', 6, ' ')); DBMS_OUTPUT.PUT_LINE('-----' || ' ' || '----------' || ' ' || '------'); <> FOR cur IN cur_emp LOOP --empno : 4, ename : 10, deptno : 2 DBMS_OUTPUT.PUT_LINE(RPAD(cur.empno, 4, ' ') || ' ' || RPAD(cur.ename, 10, ' ') || ' ' || RPAD(cur.deptno, 2, ' ')); row_count := cur_emp%ROWCOUNT; --For 루프에서는 묵시적으로 커서를 닫고 여는 작업을 --반복하기 때문에 이와같이 사용해야 한다. END LOOP cursor_loop; DBMS_OUTPUT.PUT_LINE(''); DBMS_OUTPUT.PUT_LINE('ROW COUNT : ' || row_count); END; END; / ==== 결과 ==== empno ename deptno ----- ---------- ------ 7369 SMITH 20 7499 ALLEN 30 7521 WARD 30 7566 JONES 20 7654 MARTIN 30 7698 BLAKE 30 7782 CLARK 10 7788 SCOTT 20 7839 KING 10 7844 TURNER 30 7876 ADAMS 20 7900 JAMES 30 7902 FORD 20 7934 MILLER 10 ROW COUNT : 14 PL/SQL 처리가 정상적으로 완료되었습니다. }}} ==== 세상에서 제일 간단한 커서 ==== {{{#!geshi plsql BEGIN FOR cur_count IN (SELECT ename FROM emp) LOOP dbms_output.put_line(cur_count.ename); END LOOP; END; }}} ==== 함수의 내포 ==== {{{#!geshi plsql DECLARE fn_result NUMBER; --함수를 정의 한다. --스크립트이므로 사용할 함수를 미리 정의해야 한다. FUNCTION iifn(boolean_expression IN BOOLEAN, true_number IN NUMBER, false_number IN NUMBER) RETURN NUMBER IS BEGIN IF boolean_expression THEN RETURN true_number; ELSIF NOT boolean_expression THEN RETURN false_number; ELSE RETURN NULL; END IF; END; BEGIN fn_result := iifn(2 > 1, 1, 0); dbms_output.put_line(fn_result); END; }}} ==== 프로시저 내포 ==== {{{#!geshi plsql DECLARE f_num NUMBER; s_num NUMBER; --입력된 숫자를 뒤바꾸는 프로시저 PROCEDURE swapn(num_one IN OUT NUMBER, num_two IN OUT NUMBER) IS temp_num NUMBER; BEGIN temp_num := num_one; num_one := num_two; num_two := temp_num; END; BEGIN f_num := 10; s_num := 20; swapn(f_num, s_num); dbms_output.put_line('First Number = ' || to_char(f_num)); dbms_output.put_line('Second Number = ' || to_char(s_num)); END; }}} ==== LIKE 연산자의 사용 ==== {{{#!geshi plsql --날짜중에 월만 가져오게 하는 함수 --예외처리는 공부목적으로 해 놓았다. CREATE OR REPLACE FUNCTION fn_return_month(hiredate IN DATE) RETURN VARCHAR2 AS BEGIN DECLARE h_date VARCHAR2(10); plsql_err EXCEPTION; BEGIN h_date := to_char(trunc(hiredate), 'yyyy-mm-dd'); IF h_date LIKE '____-__-__' THEN RETURN substr(h_date, 6, 2); ELSE RAISE plsql_err; END IF; EXCEPTION WHEN plsql_err THEN dbms_output.put_line('날짜 형식이 일치하지 않습니다. yyyy-mm-dd 형식으로 맞춰주십시오'); END; END; --SELECT fn_return_month(SYSDATE) FROM dual; }}} ==== %TYPE의 사용 ==== {{{#!geshi plsql --사장은 사업이 잘되어 전 사원에게 월급의 30%를 성과금으로 주기로 했다. --emp.sal 컬럼이 언제 변할지 모르므로 %type형으로 선언하였다. CREATE OR REPLACE FUNCTION ufn_stock_option(sal emp.sal%TYPE, sal_percent IN NUMBER ) RETURN emp.sal%TYPE AS BEGIN RETURN sal * sal_percent*0.01; END; --SELECT empno, ename, ufn_stock_option(sal, 30) "stock option" FROM emp; }}}