The EXECUTE statement executes a prepared SQL statement.
This statement can only be embedded in an application program, SQL function, SQL procedure, or trigger. It is an executable statement that cannot be dynamically prepared. It must not be specified in Java™.
If a global variable
is referenced in a statement, the privileges held by the authorization
ID of the statement must include at least one of the following:

The authorization rules are those defined for the SQL statement specified by EXECUTE. For example, see the description of INSERT for the authorization rules that apply when an INSERT statement is executed using EXECUTE.
The authorization ID of the statement is the run-time authorization ID unless DYNUSRPRF(*OWNER) was specified on the CRTSQLxxx command when the program was created. For more information, see Authorization IDs and authorization names.
>>-EXECUTE--statement-name--------------------------------------> >--+-----------------------------------+----------------------->< | .-,--------. | | V | | +-USING----variable-+---------------+ +-SQL-descriptors-------------------+ '-USING DESCRIPTOR--descriptor-name-' SQL-descriptors |--+------------------------------------------------------------+--> | .-SQL-. .-LOCAL--. | '-INTO--+-----+--DESCRIPTOR--+--------+--SQL-descriptor-name-' '-GLOBAL-' >--+-----------------------------------------------------------------+--| | (1) | | .-SQL-----. .-LOCAL--. | '-USING--+---------+--DESCRIPTOR--+--------+--SQL-descriptor-name-' '-GLOBAL-'
A global variable may only be used if the
current connection is a local connection (not a DRDA® connection).
See GET DESCRIPTOR for an explanation of the information
that is placed in the SQL descriptor.
See SET DESCRIPTOR for an explanation of the information
in the SQL descriptor.
Before the EXECUTE statement is processed, the user must set the following fields in the SQLDA. (The rules for REXX are different. For more information, see the Embedded SQL Programming topic collection.)
The SQLDA must have enough storage to contain all SQLVAR occurrences. If LOBs or distinct types are present in the results, there must be additional SQLVAR entries for each parameter. For more information about the SQLDA, which includes a description of the SQLVAR and an explanation on how to determine the number of SQLVAR occurrences, see Determining how many SQLVAR occurrences are needed.
SQLD must be set to a value greater than or equal to zero and less than or equal to SQLN. It must be the same as the number of parameter markers in the prepared statement. The nth variable described by the SQLDA corresponds to the nth parameter marker in the prepared statement.
Note that RPG/400® does not provide the function for setting pointers. Because the SQLDA uses pointers to locate the appropriate variables, you have to set these pointers outside your RPG/400 application.
Parameter marker replacement: Before the prepared statement is executed, each parameter marker in the statement is effectively replaced by its corresponding variable. The replacement of a parameter marker is an assignment operation in which the source is the value of the variable, and the target is a variable within the database manager. For a typed parameter marker, the attributes of the target variable are those specified by the CAST specification. For an untyped parameter marker, the attributes of the target variable are determined according to the context of the parameter marker. For the rules that affect parameter markers, see Table 1.
Let V denote a variable that corresponds to parameter marker P. The value of V is assigned to the target variable for P using storage assignment rules as described in Assignments and comparisons. Thus:
However, unlike the storage assignment rules:
When the prepared statement is executed, the value used in place of P is the value of the target variable for P. For example, if V is CHAR(6) and the target is CHAR(8), the value used in place of P is the value of V padded with two blanks.
This example of portions of a COBOL program shows how an INSERT statement with parameter markers is prepared and executed.
EXEC SQL BEGIN DECLARE SECTION END-EXEC. 77 EMP PIC X(6). 77 PRJ PIC X(6). 77 ACT PIC S9(4) COMP-4. 77 TIM PIC S9(3)V9(2). 01 HOLDER. 49 HOLDER-LENGTH PIC S9(4) COMP-4. 49 HOLDER-VALUE PIC X(80). EXEC SQL END DECLARE SECTION END-EXEC. . . . MOVE 70 TO HOLDER-LENGTH. MOVE "INSERT INTO EMPPROJACT (EMPNO, PROJNO, ACTNO, EMPTIME) - "VALUES (?, ?, ?, ?)" TO HOLDER-VALUE. EXEC SQL PREPARE MYINSERT FROM :HOLDER END-EXEC. IF SQLCODE = 0 PERFORM DO-INSERT THRU END-DO-INSERT ELSE PERFORM ERROR-CONDITION. DO-INSERT. MOVE "000010" TO EMP. MOVE "AD3100" TO PRJ. MOVE 160 TO ACT. MOVE .50 TO TIM. EXEC SQL EXECUTE MYINSERT USING :EMP, :PRJ, :ACT, :TIM END-EXEC. END-DO-INSERT. . . .