Processes dynamic SQL statements.
Syntax:
>>--EXEC SQL---PREPARE---stmt_name---.-------------.----->
+-INTO :sqlda-+
>---FROM---:hvar---END-EXEC-----><
Parameters:
stmt_name
|
The prepared statement name. This can be used by a subsequent EXECUTE or OPEN statement, and/or a previous DECLARE CURSOR statement.
|
:sqlda
|
The output SQL descriptor area (SQLDA) data structure to be populated. The colon is optional to provide compatibility with other embedded SQL implementations.
|
:hvar
|
The host variable that contains the SQL statement.
|
Example:
PROGRAM-ID. progname.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC
EXEC SQL BEGIN DECLARE SECTION END-EXEC
01 prep PIC X(80).
01 nme PIC X(20).
01 car PIC X(20).
01 n60 PIC x(5).
EXEC SQL END DECLARE SECTION END-EXEC.
PROCEDURE DIVISION.
EXEC SQL CONNECT TO 'srv1' USER 'sa' END-EXEC
IF SQLCODE NOT = ZERO
DISPLAY 'Error: Could not connect to database.'
DISPLAY SQLERRMC
DISPLAY SQLERRMC
STOP RUN
END-IF
* Ensure attempt is not made to recreate an existing table...
EXEC SQL DROP TABLE mf_table END-EXEC
* Create a table...
EXEC SQL CREATE TABLE mf_table
(owner char(20)
,car_col char(20)
,nought_to_60 char(5))
END-EXEC
IF SQLCODE NOT = ZERO
DISPLAY 'Error: Could not create table'
DISPLAY SQLERRMC
DISPLAY SQLERRML
EXEC SQL DISCONNECT CURRENT END-EXEC
STOP RUN
END-IF
* Insert an SQL statement into host variable prep...
MOVE "insert into mf_table values(?,?,?)" TO prep
* Prepare the statement...
EXEC SQL
PREPARE prep_stat FROM :prep
END-EXEC
IF SQLCODE NOT = ZERO
DISPLAY 'Error: Could not prepare statement'
DISPLAY SQLERRMC
DISPLAY SQLERRML
EXEC SQL DISCONNECT CURRENT END-EXEC
STOP RUN
END-IF
MOVE "Owner" TO nme
MOVE "Lamborghini" TO car
MOVE "4.9" TO n60
* Execute the prepared statement using the above host variables...
EXEC SQL
EXECUTE prep_stat USING :nme, :car, :n60
END-EXEC
IF SQLCODE NOT = ZERO
DISPLAY 'Error: Could not execute prepared statement.'
DISPLAY SQLERRMC
DISPLAY SQLERRML
EXEC SQL DISCONNECT CURRENT END-EXEC
STOP RUN
END-IF
* Finally, drop the now unwanted table...
EXEC SQL
DROP TABLE mf_table
END-EXEC
IF SQLCODE NOT = ZERO
DISPLAY 'Error: Could not drop table.'
DISPLAY SQLERRMC
DISPLAY SQLERRML
EXEC SQL DISCONNECT CURRENT END-EXEC
STOP RUN
END-IF
DISPLAY 'All statements executed.'
EXEC SQL DISCONNECT CURRENT END-EXEC
STOP RUN.
Comments:
You can use a prepared statement in one of two ways:
If the prepared statement is used by an EXECUTE statement, :hvar cannot contain a SQL statement that returns results.
Because singleton SELECT statements (SELECT INTO) are not allowed in dynamic SQL statements, they cannot be prepared.
When using PREPARE, the SQL statement in :hvar cannot contain host variables or comments, but it can contain parameter markers. Also, the SQL statement cannot contain SQL keywords that pertain exclusively to Embedded SQL.
The INTO :sqlda option merges the functionality of DESCRIBE and PREPARE so that this example code:
is identical to:
For more details about using the PREPARE statement, see your Database Access Guide.