Skip to content

DBMS CONCURRENT EXEC

DBMS_CONCURRENT_EXEC Package#

The DBMS_CONCURRENT_EXEC package allows the concurrent execution of procedures. This is a system-defined package.

DBMS_CONCURRENT_EXEC Procedures and Functions#

The DBMS_CONCURRENT_EXEC package consists of the following procedures and functions.

Procedures/Functions Description
INITIALIZE Initializes the DBMS_CONCURRENT_EXEC package and specifies the number of procedures that can be executed concurrently.
REQUEST Requests the DBMS_CONCURRENT_EXEC package to run a procedure.
WAIT_ALL Waits for the execution of all procedures, that were requested by the DBMS_CONCURRENT_EXEC package, to finish.
WAIT_REQ Waits for the procedure corresponding to Request ID to finish.
GET_ERROR_COUNT Returns the number of errors that occurred on the requested procedure.
GET_ERROR Fetches the syntax, error code, and error message of the procedure corresponding to Request ID.
PRINT_ERROR Prints the syntax, error code, and error message of the procedure corresponding to Request ID.
GET_LAST_REQ_ID Returns the most recently executed Request ID that was successful.
GET_REQ_TEXT Returns the procedure syntax corresponding to Request ID.
FINALIZE Frees the memory that executed the DBMS_CONCURRENT_EXEC package, and initializes the package.

Properties related to the DBMS_CONCURRENT_EXEC package can be set in the altibase.properties file.

  • CONCURRENT_EXEC_DEGREE_MAX

  • CONCURRENT_EXEC_DEGREE_DEFAULT

  • CONCURRENT_EXEC_WAIT_INTERVAL

For more detailed information, please refer to the General Reference.

Restrictions#

The DBMS_CONCURRENT_EXEC package has the following restrictions.

  • Only procedures that do not return results can be executed; functions that do not return results cannot be executed.
  • Procedures with output parameters cannot be executed.
  • Procedures or functions cannot make recursive calls. If a recursive call is made, the RECURSIVE_CALL_IS_NOT_ALLOWED exception is raised.
  • Cannot be used in parallel queries.
  • Executed procedures cannot be printed to the screen with PRINT or PRINTLN. Logs are written in $ALTIBASE_HOME/trc/altibase_qp.log.

INITIALIZE#

INITIALIZE initializes the DBMS_CONCURRENT_EXEC package and sets the number of procedures allowed to be executed in parallel. On omission, the value set for the CONCURRENT_EXEC_DEGREE_DEFAULT property is applied.

The maximum number of procedures allowed to be executed in parallel cannot exceed the value set for the CONCURRENT_EXEC_DEGREE_MAX property. If a number of procedures corresponding to CONCURRENT_EXEC_DEGREE_MAX is being executed in another session, 0 is returned and the function does not execute.

Syntax#

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

Parameter#

Name In/Output Data Type Description
in_dgree IN INTEGER The number of procedures to be executed in parallel

Return Value#

If successful, the number of procedures (DEGREE) that were set is returned. If the server failed to allocate resources, 0 is returned.

Exception#

The following exception may occur when a procedure executed in the DBMS_CONCURRENT_EXEC package requests INTIALIZE.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

Initialize the DBMS_CONCURRENT_EXEC package and set the number of procedures to be executed in parallel to 4.

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

REQUEST#

REQUEST requests the DBMS_CONCURRENT_EXEC package to execute a procedure.

Syntax#

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

Parameter#

Name In/Output Data Type Description
text IN VARCHAR(8192) The procedure and procedure arguments

Return Value#

If successful, Request ID is returned. Request ID is managed in the DBMS_CONCURRENT_EXEC package.

If unsuccessful, -1 is returned. However, it is still possible to fetch Request ID, and errors can be checked with the GET_ERROR function.

Exception#

The following exception may occur when a procedure executed in the DBMS_CONCURRENT_EXEC package requests this function.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

Request procedures in the DBMS_CONCURRENT_EXEC package to be executed in parallel.

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#

WAIT_ALL waits until the execution of procedures to be executed in parallel are finished.

Syntax#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.WAIT_ALL(  );

Return Value#

If successful, 1 is returned. If unsuccessful, -1 is returned.

Exception#

The following exception can occur when requesting WAIT_ALL from a procedure executed by the DBMS_CONCURRENT_EXEC package.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

The following is an example of waiting for all the procedures requested by the DBMS_CONCURRENT_EXEC package to complete.

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#

This procedure waits until the operation of a specific procedure being processed in parallel to be completed in the DBMS_CONCURRENT_EXEC package.

Syntax#

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

Parameter#

Name In/Output Data Type Description
req_id IN INTEGER The Request ID corresponding to the procedure executed by packages.

Return Value#

1 is returned when successfully executed.

If a request ID does not exist, -1 is returned.

Exception#

If a procedure executed in the DBMS_CONCURRENT_EXEC package requests this function, the following exception can be occurred.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

This is an example of waiting until the procedure requested by 'REQ_ID1' to be completed in the DBMS_CONCURRENT_EXEC package.

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#

GET_ERROR_COUNT returns the number of errors that occurred during the execution of a requested procedure. To get an accurate count, call WAIT_ALL and then GET_ERROR_COUNT.

Syntax#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.GET_ERROR_COUNT( );

Return Value#

If successful, the number of errors is returned.

0 means that the execution of all requested procedures was successful.

Example#

The following exception may occur when a procedure executed in DBMS_CONCURRENT_EXEC package requests this functon.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

Get the number of errors that occurred during the execution of a procedure.

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#

GET_ERROR fetches the syntax, error code, and error message of the procedure corresponding to Request ID. To get accurate information, call WAIT_ALL, and then GET_ERROR.

Syntax#

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

Parameters#

Name In/Output Data Type Description
req_id IN INTEGER The Request ID corresponding to the procedure for which error information is to be fetched
text OUT VARCHAR(8192) The syntax of the procedure
err_code OUT INTEGER The error code
err_msg OUT VARCHAR(8192) The error message

Return Value#

If successful, Request ID is returned.

If neither Request ID exists nor an error occurred, -1 is returned.

Exception#

The following exception may occur when a procedure executed in DBMS_CONCURRENT_EXEC package requests this functon.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

Fetch the error that occurred during the execution of a procedure.

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);

PRINT_ERROR prints the syntax, error code, and error message of the procedure corresponding to Request ID.

Syntax#

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

Parameter#

Name In/Out Data Type Description
req_id IN INTEGER The Request ID corresponding to the procedure to be printed

Example#

The following exception may occur when a procedure executed in the DBMS_CONCURRENT_EXEC package requests this function.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

Print an error that occurred during the execution of a procedure.

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#

GET_LAST_REQ_ID returns the most recently executed Request ID that was successful.

Syntax#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.GET_LAST_REQ_ID( );

Return Value#

If successful, the most recently executed Request ID is returned.

Exception#

There is no exception.

Example#

The following is an example of obtaining the ID of the procedure operation last requested through the DBMS_CONCURRENT_EXEC package.

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#

GET_REQ_TEXT returns the syntax of the requested procedure.

Syntax#

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

Parameter#

Name In/Out Data Type Description
req_id IN INTEGER The Request ID corresponding to theprocedure for which syntax is to be returned

Return Value#

If successful, the syntax of the procedure is returned.

If the Request ID does not exist, NULL is returned.

Exception#

There is no exception.

Example#

The following is an example of obtaining the procedure operation syntax requested through the DBMS_CONCURRENT_EXEC package.

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#

FINALIZE initializes the DBMS_CONCURRENT_EXEC package and frees used resources.

Syntax#

INTERGER variable :=
  DBMS_CONCURRENT_EXEC.FINALIZE( );

Return Value#

If successful, 1 is returned.

Exception#

The following exception may occur when a procedure executed in the DBMS_CONCURRENT_EXEC package requests this function.

RECURSIVE_CALL_IS_NOT_ALLOWED

Example#

The following is an example of initializing the DBMS_CONCURRENT_EXEC package and returning the used system resources.

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