콘텐츠로 이동

DBMS CONCURRENT EXEC

DBMS_CONCURRENT_EXEC 패키지#

DBMS_CONCURRENT_EXEC 패키지는 프로시저를 동시에 실행할 수 있는 기능을 제공한다. 이 기능은 시스템 정의 저장 패키지 형태로 제공된다.

DBMS_CONCURRENT_EXEC의 프로시저와 함수#

DBMS_CONCURRENT_EXEC 패키지를 구성하는 프로시저와 함수는 아래의 표에 목록화되어 있다.

프로시저/함수 설명
INITIALIZE DBMS_CONCURRENT_EXEC 패키지를 초기화하고, 프로시저를 동시에 실행할 수 있는 개수를 설정한다.
REQUEST DBMS_CONCURRENT_EXEC 패키지에서 프로시저의 실행을 요청한다.
WAIT_ALL DBMS_CONCURRENT_EXEC 패키지에서 요청한 모든 프로시저가 완료하기를 기다린다.
WAIT_REQ 요청된 Request ID에 해당하는 프로시저 동작이 완료하기를 기다린다.
GET_ERROR_COUNT 요청한 프로시저 동작 중 발생한 오류 개수를 반환한다.
GET_ERROR Request ID에 해당하는 프로시저 실행 구문, 오류 코드, 오류 메시지를 가져온다.
PRINT_ERROR Request ID에 해당하는 프로시저 실행 구문, 오류 코드, 오류 메시지를 출력한다.
GET_LAST_REQ_ID 마지막으로 패키지에서 수행이 성공한 Request ID를 반환한다.
GET_REQ_TEXT Request ID에 해당하는 프로시저 실행 구문을 반환한다.
FINALIZE DBMS_CONCURRENT_EXEC 패키지를 실행한 메모리를 시스템에 반납하고, 패키지는 초기화한다.

관련 프로퍼티#

DBMS_CONCURRENT_EXEC 관련 프로퍼티를 altibase.properties에 설정할 수 있다.

  • CONCURRENT_EXEC_DEGREE_MAX

  • CONCURRENT_EXEC_DEGREE_DEFAULT

  • CONCURRENT_EXEC_WAIT_INTERVAL

더 자세한 정보는 General Reference를 참고한다.

제약 사항#

DBMS_CONCURRENT_EXEC 패키지를 사용할 때 제약사항은 다음과 같다.

  • 결과를 반환하지 않는 프로시저만 실행할 수 있으나, 결과를 반환하는 함수는 실행할 수 없다.

  • 파라미터의 입출력 형태가 OUT 속성인 프로시저는 실행할 수 없다.

  • 패키지의 프로시저나 함수를 재귀적으로 호출할 수 없다. 재귀적인 호출을 할 경우 RECURSIVE_CALL_IS_NOT_ALLOWED 예외가 발생한다.

  • 병렬 질의(Parallel Query)에서는 사용할 수 없다.

  • DBMS_CONCURRENT_EXEC 패키지에서 실행하는 프로시저는 PRINT, PRINTLN을 이용하여 화면에 출력할 수 없다. 출력할 내용은 $ALTIBASE_HOME/trc/altibase_qp.log에 저장한다.

INITIALIZE#

DBMS_CONCURRENT_EXEC 패키지를 초기화하고, 병렬로 처리할 수 있는 프로시저의 개수를 설정한다. 병렬 처리될 프로시저의 개수를 지정하지 않으면, CONCURRENT_EXEC_DEGREE_DEFAULT 프로퍼티에 설정된 값이 적용된다. 병렬로 처리될 수 있는 프로시저의 최대 개수는 CONCURRENT_EXEC_DEGREE_MAX 프로퍼티에서 설정한 값을 초과할 수 없다. 하지만 다른 세션에서 CONCURRENT_EXEC_DEGREE_MAX 프로퍼티의 설정 개수만큼 이미 사용하고 있다면, 0을 반환하고 동작하지 않는다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.INITIALIZE (in_degree INTEGER DEFAULT NULL );

파라미터#

이름 입출력 데이터 타입 설명
in_dgree IN INTEGER 병렬로 처리할 프로시저의 개수

결과값#

성공적으로 수행할 경우 설정한 프로시저의 개수(DEGREE)를 반환한다. 그러나 서버에서 프로시저를 처리할 자원을 할당받지 못한 경우, 0을 반환한다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 INITIALIZE를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

DBMS_CONCURRENT_EXEC 패키지를 초기화하면서, 병렬로 처리할 프로시저의 개수를 4개로 지정한다.

VARIABLE OUT_DEGREE INTEGER;
EXEC :OUT_DEGREE := DBMS_CONCURRENT_EXEC.INITIALIZE(4);

REQUEST#

DBMS_CONCURRENT_EXEC 패키지에 프로시저 실행을 요청한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.REQUEST(text VARCHAR(8192) );

파라미터#

이름 입출력 데이터 타입 설명
text IN VARCHAR(8192) 실행할 프로시저를 인자와 함께 입력한다.

결과값#

요청에 성공하면 즉시 Request ID를 반환한다. Request ID는 DBMS_CONCURRENT_EXEC 패키지에서 관리한다.

요청에 실패하면 -1을 반환한다. 그러나 프로시저의 실행에 실패하여도, Request ID를 가져올 수 있으며, 프로시저가 실행될 때 발생한 오류는 GET_ERROR 함수를 사용하여 확인할 수 있다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 이 함수를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

DBMS_CONCURRENT_EXEC 패키지에서 프로시저들을 병렬로 실행되도록 요청한다.

VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');

WAIT_ALL#

DBMS_CONCURRENT_EXEC 패키지를 이용하여 병렬로 수행을 요청한 프로시저의 동작이 모두 완료될 때까지 대기한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.WAIT_ALL(  );

결과값#

성공적으로 수행할 경우 1을 반환한다. 실패한 경우 -1을 반환한다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행하는 프로시저에서 WAIT_ALL을 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

아래는 DBMS_CONCURRENT_EXEC 패키지에서 요청한 프로시저들이 모두 완료될 때까지 기다리는 예제이다.

VARIABLE RC INTEGER;
VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');
EXEC :RC := DBMS_CONCURRENT_EXEC.WAIT_ALL( );

WAIT_REQ#

DBMS_CONCURRENT_EXEC 패키지에서 병렬로 처리중인 특정 프로시저의 동작이 완료될 때까지 대기한다.

구문#

INTERGER variable :=  
  DBMS_CONCURRENT_EXEC.WAIT_REQ( req_id INTEGER);

파라미터#

이름 입출력 데이터 타입 설명
req_id IN INTEGER 패키지로 실행되는 프로시저의 ID

결과값#

성공적으로 수행한 경우 1을 반환한다.

해당 Request ID가 존재하지 않으면 -1을 반환한다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 이 함수를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

DBMS_CONCURRENT_EXEC 패키지에서 'REQ_ID1'으로 요청한 프로시저가 동작이 완료될 때까지 기다리는 예제이다.

VARIABLE RC INTEGER;
VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');
EXEC :RC := DBMS_CONCURRENT_EXEC.WAIT_REQ(:REQ_ID1);

GET_ERROR_COUNT#

DBMS_CONCURRENT_EXEC 패키지에서 요청한 프로시저가 동작할 때 발생하는 오류의 개수를 반환한다. 오류가 발생하는 개수를 정확하게 알기 위해서 우선 WAIT_ALL 함수를 호출한 다음에 GET_ERROR_COUNT 함수를 호출한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.GET_ERROR_COUNT( );

결과값#

성공적으로 수행한 경우 오류 개수를 반환한다.

0을 반환하면 요청한 프로시저 동작을 모두 성공한 것이다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 이 함수를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

아래는 DBMS_CONCURRENT_EXEC 패키지에서 요청한 프로시저가 동작 중에 발생한 오류의 개수를 구하는 예제이다.

VARIABLE ERR_COUNT INTEGER;
VARIABLE RC INTEGER;
VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');
EXEC :RC := DBMS_CONCURRENT_EXEC.WAIT_ALL( );
EXEC :ERR_COUNT := DBMS_CONCURRENT_EXEC.GET_ERROR_COUNT( );

GET_ERROR#

DBMS_CONCURRENT_EXEC 패키지에서 요청한 ID에 해당하는 프로시저에 대하여 실행 구문, 오류 코드, 오류 메세지를 가져온다. 오류 정보를 정확하게 알기 위해서 우선 WAIT_ALL 함수를 호출한 다음에 GET_ERROR 함수를 호출한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.GET_ERROR(
     req_id IN INTEGER,
     text OUT VARCHAR(8192),
     err_code OUT INTEGER,
     err_msg OUT VARCHAR(8192));

파라미터#

이름 입출력 데이터 타입 설명
req_id IN INTEGER 오류 정보를 가져올 프로시저의 ID
text OUT VARCHAR(8192) 프로시저의 실행 구문
err_code OUT INTEGER 오류 코드
err_msg OUT VARCHAR(8192) 오류 메세지

결과값#

성공적으로 수행한 경우 Request ID를 반환한다. 해당 Request ID가 존재하지 않거나, 오류가 발생하지 않은 경우에는 -1을 반환한다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 이 함수를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

다음은 DBMS_CONCURRENT_EXEC 패키지에서 요청한 프로시저가 동작 중에 발생한 오류를 가져오는 예제이다.

VARIABLE RC INTEGER;
VARIABLE TEXT VARCHAR(8192);
VARIABLE ERR_CODE INTEGER;
VARIABLE ERR_MSG VARCHAR(8192);
VARIABLE REQ_ID INTEGER;
EXEC :REQ_ID := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :RC := DBMS_CONCURRENT_EXEC.WAIT_REQ(:REQ_ID);
EXEC :REQ_ID := DBMS_CONCURRENT_EXEC.GET_ERROR( :REQ_ID, :TEXT, :ERR_CODE, :ERR_MSG);

DBMS_CONCURRENT_EXEC 패키지에서 요청한 ID에 해당하는 프로시저 실행 구문, 오류 코드, 오류 메시지를 출력한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.PRINT_ERROR(req_id IN INTEGER);

파라미터#

이름 입출력 데이터 타입 설명
req_id IN INTEGER 출력을 요청할 ID

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 이 함수를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

다음은 DBMS_CONCURRENT_EXEC 패키지를 통해서 요청한 프로시저 동작으로 발생한 오류를 출력하는 예제이다.

VARIABLE RC INTEGER;
VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');
EXEC :RC := DBMS_CONCURRENT_EXEC.WAIT_ALL();
EXEC DBMS_CONCURRENT_EXEC.PRINT_ERROR(:REQ_ID1);
EXEC DBMS_CONCURRENT_EXEC.PRINT_ERROR(:REQ_ID2)
EXEC DBMS_CONCURRENT_EXEC.PRINT_ERROR(:REQ_ID3);
EXEC DBMS_CONCURRENT_EXEC.PRINT_ERROR(:REQ_ID4);

GET_LAST_REQ_ID#

DBMS_CONCURRENT_EXEC 패키지에서 수행을 성공한 마지막 Request_ID를 반환한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.GET_LAST_REQ_ID( );

결과값#

성공적으로 수행한 경우 마지막 Request ID를 반환한다.

예외#

이 함수는 예외를 발생하지 않는다.

예제#

다음은 DBMS_CONCURRENT_EXEC 패키지를 통해서 마지막으로 요청한 프로시저 동작의 ID를 얻는 예제이다.

VARIABLE LAST_REQ_ID INTEGER;
VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');
EXEC :LAST_REQ_ID := DBMS_CONCURRENT_EXEC.GET_LAST_REQ_ID( );

GET_REQ_TEXT#

DBMS_CONCURRENT_EXEC 패키지에서 요청한 프로시저의 실행 구문을 반환한다.

구문#

VARCHAR(8192) variable :=
  DBMS_CONCURRENT_EXEC.GET_REQ_TEXT(req_id IN INTEGER);

파라미터#

이름 입출력 데이터 타입 설명
req_id IN INTEGER 반환을 요청하는 프로시저의 ID

결과값#

성공적으로 수행한 경우 프로시저 실행 구문을 반환한다. Request ID가 존재하지 않는 경우에는 NULL을 반환한다.

예외#

이 함수는 예외를 발생하지 않는다.

예제#

다음은 DBMS_CONCURRENT_EXEC 패키지를 통해서 요청한 프로시저 동작 구문을 얻는 예제이다.

VARIABLE REQ_ID1 INTEGER;
VARIABLE REQ_ID2 INTEGER;
VARIABLE REQ_ID3 INTEGER;
VARIABLE REQ_ID4 INTEGER;
EXEC :REQ_ID1 := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :REQ_ID2 := DBMS_CONCURRENT_EXEC.REQUEST('PROC2(1, 1, 3)');
EXEC :REQ_ID3 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''ABC'', 3, 3)');
EXEC :REQ_ID4 := DBMS_CONCURRENT_EXEC.REQUEST('PROC3(''DEF'', 3, 3)');
EXEC PRINTLN(DBMS_CONCURRENT_EXEC.GET_REQ_TEXT(:REQ_ID1));
EXEC PRINTLN(DBMS_CONCURRENT_EXEC.GET_REQ_TEXT(:REQ_ID2));
EXEC PRINTLN(DBMS_CONCURRENT_EXEC.GET_REQ_TEXT(:REQ_ID3));
EXEC PRINTLN(DBMS_CONCURRENT_EXEC.GET_REQ_TEXT(:REQ_ID4));

FINALIZE#

세션에서 실행되는 DBMS_CONCURRENT_EXEC 패키지를 초기화하고, 사용된 자원들을 시스템에 반납한다.

구문#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.FINALIZE( );

결과값#

성공적으로 수행한 경우 1을 반환한다.

예외#

DBMS_CONCURRENT_EXEC 패키지에서 실행되는 프로시저가 이 함수를 호출하는 경우 다음의 예외가 발생할 수 있다.

RECURSIVE_CALL_IS_NOT_ALLOWED

예제#

다음은 DBMS_CONCURRENT_EXEC 패키지를 초기화하고, 사용한 시스템 자원을 반납하는 예제이다.

VARIABLE RC INTEGER;
VARIABLE REQ_ID INTEGER;
EXEC :REQ_ID := DBMS_CONCURRENT_EXEC.REQUEST('PROC1');
EXEC :RC := DBMS_CONCURRENT_EXEC.FINALIZE( );