ch17_dyquery 테이블의 첫 번째 컬럼에는 프로그램명, 두 번째 컬럼에는 동적 쿼리 본문이 들어갈 것이다. ch17_dynamic_test 프로시저를 수정해 ch17_dyquery 테이블에 쿼리 텍스트를 넣는 루틴을 추가해 보자.

    입력

        CREATE OR REPLACE PROCEDURE ch17_dynamic_test ( p_emp_id   NUMBER,
                                                        p_emp_name VARCHAR2,
                                                        p_job_id   VARCHAR2
                                                      )
        IS
          vs_query    VARCHAR2(1000);
          vn_cnt      NUMBER := 0;
          vs_empname  employees.emp_name%TYPE := '%' || p_emp_name || '%';
    
        BEGIN
          -- 동적 쿼리 생성
          vs_query :=             'SELECT COUNT(*) ' || CHR(13);
          vs_query := vs_query || '  FROM employees ' || CHR(13);
          vs_query := vs_query || ' WHERE 1=1 ' || CHR(13);
    
          -- 사번이 NULL이 아니면 조건 추가
            IF p_emp_id IS NOT NULL THEN
            vs_query := vs_query || ' AND employee_id = ' || p_emp_id || CHR(13);
          END IF;
    
          -- 사원명이 NULL이 아니면 조건 추가
            IF p_emp_name IS NOT NULL THEN
            vs_query := vs_query || ' AND emp_name like ' || '''' || vs_empname || '''' || CHR(13);
        END IF;
          -- JOB_ID가 NULL이 아니면 조건 추가
            IF p_job_id IS NOT NULL THEN
            vs_query := vs_query || ' AND job_id = ' || '''' || p_job_id || '''' || CHR(13);
            END IF;
          -- 동적 쿼리 실행, 건수는 vn_cnt 변수에 담는다
          EXECUTE IMMEDIATE vs_query INTO vn_cnt;
    
          DBMS_OUTPUT.PUT_LINE('결과건수 : ' || vn_cnt);
    
          -- 기존 데이터를 모두 삭제한다
          DELETE ch17_dyquery;
    
          -- 쿼리 구문을 ch17_dyquery에 넣는다.
          INSERT INTO ch17_dyquery (program_name, query_text)
          VALUES ( 'ch17_dynamic_test', vs_query);
    
          COMMIT;
        END;
    

    결과

        PROCEDURE CH17_DYNAMIC_TEST이(가) 컴파일되었습니다.
    

    프로시저를 실행해 보자.

    입력

        EXEC ch17_dynamic_test (NULL, 'Jon', 'SA_REP' );
    

    결과

        결과건수 : 1
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.