Following is a sample program demonstrating the use of an input SQLDA structure. The client application invokes a stored procedure that creates a table named Presidents and loads the table with data.
This program creates a table called Presidents in the SAMPLE database. It then inserts the values Washington, Jefferson, and Lincoln into the table.
Without using stored procedures, the sample program would have been designed to transmit data across the network in four separate requests in order to process each SQL statement, as shown in Figure 11.
Figure 11. Input-SQLDA Sample Without a Stored Procedure
![]() |
Instead, the sample program makes use of the stored procedures technique to transmit all of the data across the network in one request, allowing the server procedure to execute the SQL statements as a group. This technique is shown in Figure 12.
Figure 12. Input-SQLDA Sample With a Stored Procedure
![]() |
A sample input-SQLDA client application and sample input-SQLDA stored procedure is shown on "How the Example Input-SQLDA Client Application Works".
The CHECKERR macro/function is an error checking utility which is external to the program. The location of this error checking utility depends upon the programming language used:
See Using GET ERROR MESSAGE in Example Programs for the source code for this error checking utility.
program inpcli implicit none * Copy Files for Constants and Structures include 'sql.f' include 'sqlenv.f' include 'sqlutil.f' include 'sqldact.f' * Declare an SQLCA EXEC SQL INCLUDE SQLCA * Declare host variables. EXEC SQL BEGIN DECLARE SECTION character*8 dbname character*8 userid character*18 passwd character*11 procname /'inpsrv'/ character*10 table_name /'PRESIDENTS'/ character*20 data_item0 /'Washington'/ character*20 data_item1 /'Jefferson'/ character*20 data_item2 /'Lincoln'/ integer*2 tableind /0/ integer*2 dataind0 /0/ integer*2 dataind1 /0/ integer*2 dataind2 /0/ EXEC SQL END DECLARE SECTION * Declare Variables Used to Create an SQLDA integer*2 sqlvar1 parameter ( sqlvar1 = sqlda_header_sz + 0*sqlvar_struct_sz ) integer*2 sqlvar2 parameter ( sqlvar2 = sqlda_header_sz + 1*sqlvar_struct_sz ) integer*2 sqlvar3 parameter ( sqlvar3 = sqlda_header_sz + 2*sqlvar_struct_sz ) integer*2 sqlvar4 parameter ( sqlvar4 = sqlda_header_sz + 3*sqlvar_struct_sz ) * Declare an Input SQLDA Structure -- 4 Variables character io_sqlda(sqlda_header_sz + 4*sqlvar_struct_sz) character*8 io_sqldaid ! Header integer*4 io_sqldabc integer*2 io_sqln integer*2 io_sqld integer*2 io_sqltype1 ! First Variable integer*2 io_sqllen1 integer*4 io_sqldata1 integer*4 io_sqlind1 integer*2 io_sqlnamel1 character*30 io_sqlnamec1 integer*2 io_sqltype2 ! Second Variable integer*2 io_sqllen2 integer*4 io_sqldata2 integer*4 io_sqlind2 integer*2 io_sqlnamel2 character*30 io_sqlnamec2 integer*2 io_sqltype3 ! Third Variable integer*2 io_sqllen3 integer*4 io_sqldata3 integer*4 io_sqlind3 integer*2 io_sqlnamel3 character*30 io_sqlnamec3 integer*2 io_sqltype4 ! Fourth Variable integer*2 io_sqllen4 integer*4 io_sqldata4 integer*4 io_sqlind4 integer*2 io_sqlnamel4 character*30 io_sqlnamec4 equivalence( io_sqlda(sqlda_sqldaid_ofs), io_sqldaid ) equivalence( io_sqlda(sqlda_sqldabc_ofs), io_sqldabc ) equivalence( io_sqlda(sqlda_sqln_ofs), io_sqln ) equivalence( io_sqlda(sqlda_sqld_ofs), io_sqld ) equivalence( io_sqlda(sqlvar1+sqlvar_type_ofs), io_sqltype1 ) equivalence( io_sqlda(sqlvar1+sqlvar_len_ofs), io_sqllen1 ) equivalence( io_sqlda(sqlvar1+sqlvar_data_ofs), io_sqldata1 ) equivalence( io_sqlda(sqlvar1+sqlvar_ind_ofs), io_sqlind1 ) equivalence( io_sqlda(sqlvar1+sqlvar_name_length_ofs), + io_sqlnamel1 ) equivalence( io_sqlda(sqlvar1+sqlvar_name_data_ofs), + io_sqlnamec1 ) equivalence( io_sqlda(sqlvar2+sqlvar_type_ofs), io_sqltype2 ) equivalence( io_sqlda(sqlvar2+sqlvar_len_ofs), io_sqllen2 ) equivalence( io_sqlda(sqlvar2+sqlvar_data_ofs), io_sqldata2 ) equivalence( io_sqlda(sqlvar2+sqlvar_ind_ofs), io_sqlind2 ) equivalence( io_sqlda(sqlvar2+sqlvar_name_length_ofs), + io_sqlnamel2 ) equivalence( io_sqlda(sqlvar2+sqlvar_name_data_ofs), + io_sqlnamec2 ) equivalence( io_sqlda(sqlvar3+sqlvar_type_ofs), io_sqltype3 ) equivalence( io_sqlda(sqlvar3+sqlvar_len_ofs), io_sqllen3 ) equivalence( io_sqlda(sqlvar3+sqlvar_data_ofs), io_sqldata3 ) equivalence( io_sqlda(sqlvar3+sqlvar_ind_ofs), io_sqlind3 ) equivalence( io_sqlda(sqlvar3+sqlvar_name_length_ofs), + io_sqlnamel3 ) equivalence( io_sqlda(sqlvar3+sqlvar_name_data_ofs), + io_sqlnamec3 ) equivalence( io_sqlda(sqlvar4+sqlvar_type_ofs), io_sqltype4 ) equivalence( io_sqlda(sqlvar4+sqlvar_len_ofs), io_sqllen4 ) equivalence( io_sqlda(sqlvar4+sqlvar_data_ofs), io_sqldata4 ) equivalence( io_sqlda(sqlvar4+sqlvar_ind_ofs), io_sqlind4 ) equivalence( io_sqlda(sqlvar4+sqlvar_name_length_ofs), + io_sqlnamel4 ) equivalence( io_sqlda(sqlvar4+sqlvar_name_data_ofs), + io_sqlnamec4 ) character*80 errloc integer*4 rc * Program Logic print *, 'Enter in the database name :' read 100, dbname 100 format (a8) print *, 'Enter your user id (default none):' read 100, userid if( userid(1:1) .eq. ' ' ) then EXEC SQL CONNECT TO :dbname else print *, 'Enter your password :' read 100, passwd print *,'CONNECT to Remote Database.' EXEC SQL CONNECT TO :dbname USER :userid USING :passwd end if * Connect to Remote Database errloc = 'CONNECT' call checkerr (sqlca, errloc, *999) * Call the Remote Procedure via CALL with Host Variables * (2a) print *,'Use CALL with Host Variable ' print *,'to invoke the Server Procedure named inpsrv.' EXEC SQL CALL :procname (:table_name:tableind, + :data_item0:dataind0, + :data_item1:dataind1, + :data_item2:dataind2) errloc = 'CALL with HOST VARIABLES' call checkerr (sqlca, errloc, *999) print *,'Server Procedure Complete.' * Initialize the Input SQLDA Structure * (1) io_sqldaid = 'IN_SQLDA' io_sqldabc = sqlda_header_sz + 4*sqlvar_struct_sz io_sqln = 4 io_sqld = 4 io_sqltype1 = SQL_TYP_NCHAR io_sqllen1 = 10 io_sqlind1 = 0 rc = sqlgaddr(%ref(table_name), %ref(io_sqldata1)) rc = sqlgaddr(%ref(tableind), %ref(io_sqlind1)) io_sqltype2 = SQL_TYP_NCHAR io_sqllen2 = 20 io_sqlind2 = 0 rc = sqlgaddr(%ref(data_item0), %ref(io_sqldata2)) rc = sqlgaddr(%ref(dataind0), %ref(io_sqlind2)) io_sqltype3 = SQL_TYP_NCHAR io_sqllen3 = 20 io_sqlind3 = 0 rc = sqlgaddr(%ref(data_item1), %ref(io_sqldata3)) rc = sqlgaddr(%ref(dataind1), %ref(io_sqlind3)) io_sqltype4 = SQL_TYP_NCHAR io_sqllen4 = 20 io_sqlind4 = 0 rc = sqlgaddr(%ref(data_item2), %ref(io_sqldata4)) rc = sqlgaddr(%ref(dataind2), %ref(io_sqlind4)) * Call the Remote Procedure via CALL with SQLDA * (2b) print *,'Use CALL with SQLDA to invoke the Server Procedure named cinpsrv.' EXEC SQL CALL :procname USING DESCRIPTOR :io_sqlda errloc = 'CALL with SQLDA' call checkerr (sqlca, errloc, *999) print *,'Server Procedure Complete.' * Disconnect from Remote Database. EXEC SQL CONNECT RESET errloc = 'CONNECT RESET' call checkerr (sqlca, errloc, *999) 999 stop end
Note: | Server procedures cannot be written in REXX on AIX systems. |
/* REXX INPut SeRVer */ /* this variable (SYSTEM) must be user defined */ SYSTEM = NT if SYSTEM = NT then do if rxfuncquery('SQLDBS') <> 0 then rcy = rxfuncadd( 'SQLDBS', 'DB2AR', 'SQLDBS' ) if rxfuncquery('SQLEXEC') <> 0 then rcy = rxfuncadd( 'SQLEXEC', 'DB2AR', 'SQLEXEC' ) end if SYSTEM = AIX then rcy = SysAddFuncPkg("/usr/lpp/db2_05_00/lib/db2rexx") table_stmt = 'CREATE TABLE ' || sqlrida.1.sqldata || ' (name CHAR(20))' (2) call SQLEXEC 'EXECUTE IMMEDIATE :table_stmt' if sqlca.sqlcode = -601 then sqlca.sqlcode = 0 call CHECKERR 'EXECUTE IMMEDIATE CREATE TABLE' insert_stmt = 'INSERT INTO ' || sqlrida.1.sqldata || ' VALUES (?)' call SQLEXEC 'PREPARE s1 FROM :insert_stmt' (3) call CHECKERR 'PREPARE INSERT STATEMENT' cntr = 1 do while ( cntr < SQLRIDA.sqld & sqlca.sqlcode = 0 ) cntr = cntr + 1 insert_data = SQLRIDA.cntr.sqldata call SQLEXEC 'EXECUTE s1 USING :insert_data' (4) end call CHECKERR 'EXECUTION OF INSERT STATEMENT' call SQLEXEC 'COMMIT' call CHECKERR 'COMMIT' exit 0 (5) CHECKERR: arg errloc if ( SQLCA.SQLCODE = 0 ) then return 0 else say '--- error report ---' say 'ERROR occured :' errloc say 'SQLCODE :' SQLCA.SQLCODE /******************************\ * GET ERROR MESSAGE API called * \******************************/ call SQLDBS 'GET MESSAGE INTO :errmsg LINEWIDTH 80' say errmsg say '--- end error report ---' if (SQLCA.SQLCODE < 0 ) then exit else say 'WARNING - CONTINUING PROGRAM WITH ERRORS' return 0 end end return 0