Erstellen einer gespeicherten Prozedur mit der Beispielanwendung

Dieses Beispiel verwendet eine gespeicherte Prozedur mit dem Namen MYPROC(). Diese Prozedur verarbeitet fünf Parameter: Kontoname (szName), Option (nCmd), Übertragungssumme (nAmount), Kontostand Sparkonto (nSaving) und Kontostand Girokonto (nChecking). In der folgenden Liste ist der Zweck der Parameter angegeben:

           Kontoname: Eingabeparameter zur Angabe des Kontos
              Option: Eingabeparameter zur Bestimmung der Aktion. Es gibt drei Optionen:
        		                 1: Kontostand überprüfen 
           		                 2: Übertragung vom Sparkonto auf das Girokonto
                                         3: Übertragung vom Girokonto auf das Sparkonto
   Übertragungssumme: Eingabeparameter für die Summe, die zwischen dem Girokonto
		      und dem Sparkonto übertragen werden soll.
Kontostand Sparkonto: Ausgabeparameter, der den Kontostand des Sparkontos zurückgibt
Kontostand Girokonto: Ausgabeparameter, der den Kontostand des Girokontos zurückgibt

Der folgende Code erstellt die gespeicherte Prozedur:

SQL_API_RC SQL_API_FN 
myProc(char * szName, int * nCmd, int * nAmount, int * nSaving, int * nChecking)
{
	SQLHENV		henv;
	SQLHDBC		hdbc;
	SQLHSTMT	hstmt;
	SQLRETURN	rc;
	int			nRetSize;
 
	SQLCHAR  str1[]="select saving, checking from db2e.myaccount where name = ?";
	SQLCHAR  str2[]="update db2e.myaccount set saving=saving - ?, checking=checking + ? where name=?";
	SQLCHAR  str3[]="update db2e.myaccount set saving=saving + ?, checking=checking - ? where name=?";
 
	//****************************************************************
	//* Prepare connection and statement
	//****************************************************************
	rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
	//checkerror
	rc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc);
	//checkerror
	rc = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, SQL_NTS);
	//checkerror
   	 rc = SQLConnect(hdbc, NULL, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
	//checkerror
	rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt);
	//checkerror
    
	//****************************************************************
	//* Update account
	//****************************************************************
	if ( *nCmd == 2 || *nCmd == 3 ){
		if ( *nCmd == 2 ){ //Transfer from saving to checking
			rc = SQLPrepare(hstmt, str2, SQL_NTS); //checkerror
		}
		if ( *nCmd == 3 ){ //Transfer from checking to saving
			rc = SQLPrepare(hstmt, str3, SQL_NTS); //checkerror
		}
		rc = SQLBindParameter(hstmt,
				1,
				SQL_PARAM_INPUT,
				SQL_C_LONG,
				SQL_INTEGER,
				0,
				0,
				(SQLPOINTER)nAmount,
				0,
				NULL ); //checkerror
		rc = SQLBindParameter(hstmt,
				2,
				SQL_PARAM_INPUT,
				SQL_C_LONG,
				SQL_INTEGER,
				0,
				0,
				(SQLPOINTER)nAmount,
				0,
				NULL ); //checkerror
 
		rc = SQLBindParameter(hstmt,
				3,
				SQL_PARAM_INPUT,
				SQL_C_CHAR,
				SQL_CHAR,
				0,
				0,
				(SQLPOINTER)szName,
				0,
				NULL ); //checkerror
		rc = SQLExecute(hstmt); //checkerror
	}
 
	//****************************************************************
	//* Retrieve account balance
	//****************************************************************
	rc = SQLPrepare(hstmt, str1, SQL_NTS); //checkerror
	rc = SQLBindParameter(hstmt,
			1,
			SQL_PARAM_INPUT,
			SQL_C_CHAR,
			SQL_CHAR,
			0,
			0,
			(SQLPOINTER)szName,
			0,
			NULL );//checkerror
	rc = SQLExecute(hstmt);//checkerror
	if ( rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO )
	{
		while ( (rc = SQLFetch(hstmt) ) == SQL_SUCCESS ){
			rc = SQLGetData( hstmt,
				(SQLSMALLINT)1,
				SQL_C_LONG,
				nSaving,
				sizeof(int) ,
				&nRetSize )	; //checkerror
			rc = SQLGetData( hstmt,
				(SQLSMALLINT)2,
				SQL_C_LONG,
				nChecking,
				sizeof(int) ,
				&nRetSize )	; //checkerror
		}
	}
	//****************************************************************
	//* Clean up
	//****************************************************************
   	 rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT );     
	SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
	SQLDisconnect(hdbc);
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	SQLFreeHandle(SQL_HANDLE_ENV, henv);
	return (0);
}
 

Kopieren Sie auf einer Win32-Plattform die gespeicherte Prozedur nach dem Erstellen in einer Dynamic Link Library (mydll.dll) in das Verzeichnis \SQLLIB\function. Registrieren Sie danach die gespeicherte Prozedur.

  1. Öffnen Sie ein DB2-Befehlsfenster.
  2. Stellen Sie mit dem folgenden Befehl eine Verbindung zu der Datenbank MYSAMPLE her:
    DB2 CONNECT TO MYSAMPLE
    
  3. Registrieren Sie die gespeicherte Prozedur mit dem Script regscript.scr, um Optionen zu konfigurieren. Für das Script wird der folgende Code verwendet:
    CREATE PROCEDURE db2e.MYPROC (IN szName CHAR(16), 
                                  IN nCmd INTEGER, 
                                  IN nAmount INTEGER, 
                                  OUT nSaving INTEGER, 
                                  OUT nChecking INTEGER )
    DYNAMIC RESULT SETS 1
    LANGUAGE C 
    PARAMETER STYLE GENERAL 
    NO DBINFO
    FENCED
    MODIFIES SQL DATA
    PROGRAM TYPE SUB
    EXTERNAL NAME 'mydll!myProc'@
    

    Geben Sie den folgenden Befehl ein, um das Script auszuführen:

    db2 -td@ -vf regscript.scr
    

Die gespeicherte Prozedur db2e.MYPROC ist jetzt konfiguriert. Erstellen Sie nun eine Subskription mit Mobile Devices Administration Center.

Zugehörige Konzepte

Zugehörige Tasks

Zugehörige Referenzen