/******************************************************************************* ** ** Source File Name = embedded.c 1.4 ** ** Licensed Materials - Property of IBM ** ** (C) COPYRIGHT International Business Machines Corp. 1995, 1999 ** All Rights Reserved. ** ** US Government Users Restricted Rights - Use, duplication or ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp. ** ** ** PURPOSE : ** Example of executing an SQL statement using CLI. ** The equivalent embedded SQL statements are shown in comments. ** ** For more information about these samples see the README file. ** ** For more information on programming in CLI see the: ** - "Building CLI Applications" section of the Application Building Guide, and the ** - CLI Guide and Reference. ** ** For more information on the SQL language see the SQL Reference. ** *********************************************************************************/ /*--> SQLL1X02.SCRIPT */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlcli1.h> #include "samputil.h" /* Header file for CLI sample code */ /* For the Macintosh environment when generating 68K applications */ #ifdef DB268K /* Need to include ASLM for 68K applications */ #include <LibraryManager.h> #endif /* Global Variables for user id and password. To keep samples simple, not a recommended practice. */ extern SQLCHAR server[SQL_MAX_DSN_LENGTH + 1] ; extern SQLCHAR uid[MAX_UID_LENGTH + 1] ; extern SQLCHAR pwd[MAX_PWD_LENGTH + 1] ; int main( int argc, char * argv[] ) { SQLHANDLE henv, hdbc, hstmt ; SQLRETURN rc ; SQLINTEGER id ; SQLCHAR name[51] ; SQLCHAR * create = ( SQLCHAR * ) "CREATE TABLE NAMEID (ID integer, NAME varchar(50))" ; SQLCHAR * insert = ( SQLCHAR * ) "INSERT INTO NAMEID VALUES (?, ?)" ; SQLCHAR * select = ( SQLCHAR * ) "select ID, NAME from NAMEID" ; SQLCHAR * drop = ( SQLCHAR * ) "DROP TABLE NAMEID" ; /* For the Macintosh environment when generating 68K applications */ #ifdef DB268K /* Before making any API calls for 68K environment, need to initialize the Library Manager */ InitLibraryManager(0,kCurrentZone,kNormalMemory); atexit(CleanupLibraryManager); #endif /* EXEC SQL CONNECT TO :server USER :uid USING :authentication_string; */ /* macro to initalize server, uid and pwd */ INIT_UID_PWD ; /* allocate an environment handle */ rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ; if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ; /* allocate a connect handle, and connect */ rc = DBconnect( henv, &hdbc ) ; if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ; /* allocate a statement handle */ rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* EXEC SQL CREATE TABLE NAMEID (ID integer, NAME varchar(50)); */ /* execute the sql statement */ rc = SQLExecDirect( hstmt, create, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* EXEC SQL COMMIT WORK; */ /* commit create table */ rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* EXEC SQL INSERT INTO NAMEID VALUES ( :id, :name ); */ /* show the use of SQLPrepare/SQLExecute method */ /* prepare the insert */ rc = SQLPrepare( hstmt, insert, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Set up the first input parameter "id" */ rc = SQLBindParameter( hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER) & id, 0, NULL ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Set up the second input parameter "name" */ rc = SQLBindParameter( hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 51, 0, name, 51, NULL ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* now assign parameter values and execute the insert */ id = 500 ; strcpy( ( char * ) name, "Babbage" ) ; rc = SQLExecute( hstmt ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* EXEC SQL COMMIT WORK; */ /* commit inserts */ rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* Reset input parameter. */ rc = SQLFreeStmt( hstmt, SQL_RESET_PARAMS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* EXEC SQL DECLARE c1 CURSOR FOR SELECT ID, NAME FROM NAMEID; */ /* EXEC SQL OPEN c1; */ /* The application doesn't specify "declare c1 cursor for" */ rc = SQLExecDirect( hstmt, select, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* EXEC SQL FETCH c1 INTO :id, :name; */ /* Binding first column to output variable "id" */ SQLBindCol( hstmt, 1, SQL_C_LONG, ( SQLPOINTER ) & id, 0, NULL ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Binding second column to output variable "name" */ SQLBindCol( hstmt, 2, SQL_C_CHAR, name, 51, NULL ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* now execute the fetch */ while ( ( rc = SQLFetch( hstmt ) ) == SQL_SUCCESS ) printf( "Result of Select: id = %ld name = %s\n", id, name ) ; if (rc != SQL_NO_DATA_FOUND) CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* finally, we should commit, discard hstmt, disconnect */ /* EXEC SQL COMMIT WORK; */ /* Close cursor and free bound columns. */ /* Free statement resources */ rc = SQLFreeStmt( hstmt, SQL_UNBIND ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; rc = SQLFreeStmt( hstmt, SQL_CLOSE ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Drop table. */ rc = SQLExecDirect( hstmt, drop, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* commit the transaction */ rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* EXEC SQL CLOSE c1; */ /* free the statement handle */ rc = SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* EXEC SQL DISCONNECT; */ /* disconnect from the database */ printf( "\n>Disconnecting .....\n" ) ; rc = SQLDisconnect( hdbc ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* free the connection handle */ rc = SQLFreeHandle( SQL_HANDLE_DBC, hdbc ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* free the environment handle */ rc = SQLFreeHandle( SQL_HANDLE_ENV, henv ) ; if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ; return( SQL_SUCCESS ) ; } /*<-- */