728x90
반응형
RETURN문 |
|
- 함수에서는 일정한 연산을 수행하고 결과 값을 반환하는 역할을 했지만, 프로시저에서는 RETURN문을 만나면 이후 로직을 수행하지 않고 프로시저를 빠져 나간다. --메소드에서는 RETURN값을 반환 후 메소드 종료 |
RETURN
CREATE OR REPLACE PROCEDURE MY_NEW_JOB_PROC ( P_JOB_ID IN JOBS.JOB_ID%TYPE, P_JOB_TITLE IN JOBS.JOB_TITLE%TYPE, P_MIN_SAL IN JOBS.MIN_SALARY%TYPE:=10, P_MAX_SAL IN JOBS.MAX_SALARY%TYPE:=100 ) --IN키워드가 있는 파라미터라 값 설정 가능. IS VN_CNT NUMBER :=0; BEGIN --BEGIN절 이내에는 DDL기술 불가하므로, 원시적 EXECUTE을 이용해 사용가능 IF P_MIN_SAL < 1000 THEN DBMS_OUTPUT.PUT_LINE('최소 급여값은 1000 이상이어야 한다.'); RETURN; --실행문 완전 종료 END IF; SELECT COUNT(*) --존재하는 행이 없어도 0을 반환함 INTO VN_CNT FROM JOBS WHERE JOB_ID = P_JOB_ID; IF VN_CNT > 0 THEN UPDATE JOBS SET JOB_TITLE = P_JOB_TITLE, MIN_SALARY = P_MIN_SAL, MAX_SALARY = P_MAX_SAL, UPDATE_DATE = SYSDATE WHERE JOB_ID = P_JOB_ID; DBMS_OUTPUT.PUT_LINE('데이터 갱신완료'); ELSE INSERT INTO JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY, CREATE_DATE, UPDATE_DATE) VALUES (P_JOB_ID, P_JOB_TITLE, P_MIN_SAL, P_MAX_SAL, SYSDATE, SYSDATE); DBMS_OUTPUT.PUT_LINE('데이터 추가완료'); END IF; COMMIT; END; /
EXEC MY_NEW_JOB_PROC ('SM_JOB1', 'SAMPLE JOB1', 999, 6000); --EXEC MY_NEW_JOB_PROC ('SM_JOB1', 'SAMPLE JOB1', 2000, 6000);
AA
CREATE OR REPLACE PROCEDURE DEPT_INSERT_PROC ( p_tnm VARCHAR2, --'DEPT01' p_dno DEPT.DEPTNO%TYPE, --'TEST' p_nm DEPT.DNAME%TYPE, --50 p_loc DEPT.LOC%TYPE )--'TEST' IS V_CNT NUMBER; V_SQL VARCHAR2(1000); BEGIN DBMS_OUTPUT.PUT_LINE('프로시저 시작'); V_SQL := 'SELECT COUNT(*) FROM ' || p_tnm ||' WHERE DEPTNO =:A'; -- SQL내 문자열 ' '빈 공간에 따라 오류가 발생할 수 있다. EXECUTE IMMEDIATE V_SQL INTO V_CNT USING p_dno; IF V_CNT <=0 THEN V_SQL := 'INSERT INTO '||p_tnm||' VALUES (:A, :A, :A)'; EXECUTE IMMEDIATE V_SQL USING p_dno, p_nm, p_loc; DBMS_OUTPUT.PUT_LINE('인서트 성공'); ELSE V_SQL := 'UPDATE '||p_tnm||' SET DNAME =:A, LOC =:A WHERE DEPTNO =:A'; EXECUTE IMMEDIATE V_SQL USING p_nm, p_loc, p_dno; DBMS_OUTPUT.PUT_LINE ('업데이트 성공'); END IF; COMMIT; DBMS_OUTPUT.PUT_LINE ('프로시저 종료'); END; /
DECLARE V_CNT NUMBER; V_SQL VARCHAR2(1000); BEGIN SELECT COUNT(*) INTO V_CNT FROM ALL_TABLES WHERE TABLE_NAME = 'DEPT01'; IF V_CNT <= 0 THEN V_SQL := 'CREATE TABLE DEPT01 AS SELECT * FROM DEPT'; EXECUTE IMMEDIATE V_SQL; DBMS_OUTPUT.PUT_LINE('테이블 생성 성공'); END IF; SELECT COUNT(*) INTO V_CNT FROM ALL_TABLES WHERE TABLE_NAME = 'DEPT01'; IF V_CNT > 0 THEN DEPT_INSERT_PROC('DEPT01',50,'TEST','TEST'); DBMS_OUTPUT.PUT_LINE('프로시저 호출 성공'); END IF; END; /
728x90
반응형
'[ORACLE]' 카테고리의 다른 글
[ORACLE] EXCETPTION (0) | 2024.01.29 |
---|---|
[ORACLE] PROCEDURE --테이블 백업용 프로시저 (0) | 2024.01.29 |
[ORACLE] PROCEDURE (0) | 2024.01.26 |
[ORACLE] OBJECT, TABLE (0) | 2024.01.26 |
[ORACLE] FUNCTION (0) | 2024.01.26 |