Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere ODBC-API

 

Gespeicherte Prozeduren aufrufen

In diesem Abschnitt wird beschrieben, wie gespeicherte Prozeduren aufgerufen und die Ergebnisse in einer ODBC-Anwendung bearbeitet werden.

Eine vollständige Beschreibung von gespeicherten Prozeduren und Triggern finden Sie unter Prozeduren, Trigger und Batches verwenden.

Prozeduren und Ergebnismengen

Es gibt zwei Arten von Prozeduren: Prozeduren, die Ergebnismengen zurückgeben und solche, die keine zurückgeben. Mit SQLNumResultCols können Sie den Unterschied feststellen: die Anzahl der Ergebnisspalten ist 0 (Null), falls die Prozedur keine Ergebnismenge zurückgibt. Wenn eine Ergebnismenge zurückgegeben wird, können Sie die Werte, wie bei jedem anderen Cursor, mit SQLFetch oder SQLExtendedFetch abrufen.

Parameter müssen an Prozeduren mit Parametermarkierungen (Fragezeichen) übergeben werden. Verwenden Sie SQLBindParameter, um jeder Parametermarkierung einen Speicherbereich zuzuweisen: INPUT, OUTPUT oder INOUT.

Um mehrfache Ergebnismengen verarbeiten zu können, muss ODBC den aktuell ausgeführten Cursor beschreiben, und nicht die von der Prozedur definierte Ergebnismenge. Deshalb bezeichnet ODBC die Spaltennamen nicht immer so, wie sie in der RESULT-Klausel der gespeicherten Prozedur definiert sind. Um dieses Problem zu vermeiden, können Sie im Ergebnismengencursor Ihrer Prozedur einen Spaltenalias verwenden.

Beispiel

Mit diesem Beispiel wird eine Prozedur erstellt und aufgerufen, die keine Ergebnismenge zurückgibt. Die Prozedur übernimmt einen INOUT-Parameter und erhöht seinen Wert. Im Beispiel hat die Variable num_col den Wert 0 (Null), da die Prozedur keine Ergebnismenge zurückgibt. Auf eine Fehlerüberprüfung wurde verzichtet, um das Beispiel leichter lesbar zu halten.

HDBC dbc;
HSTMT stmt;
long I;
SWORD num_col;

/* Create a procedure */
SQLAllocStmt( dbc, &stmt );
SQLExecDirect( stmt,
      "CREATE PROCEDURE Increment( INOUT a INT )" \
      " BEGIN" \
         " SET a = a + 1" \
      " END", SQL_NTS ); 

/* Call the procedure to increment 'I' */
I = 1;
SQLBindParameter( stmt, 1, SQL_C_LONG, SQL_INTEGER, 0,
            0, &I, NULL );
SQLExecDirect( stmt, "CALL Increment( ? )",
            SQL_NTS );
SQLNumResultCols( stmt, &num_col );
do_something( I );
Beispiel

Mit dem folgenden Beispiel wird eine Prozedur aufgerufen, die eine Ergebnismenge zurückgibt. Im Beispiel hat die Variable num_col den Wert 2, denn die Prozedur gibt eine Ergebnismenge mit zwei Spalten zurück. Auf eine Fehlerüberprüfung wurde auch hier verzichtet, um das Beispiel leichter lesbar zu halten.

HDBC dbc;
HSTMT stmt;
SWORD num_col;
RETCODE retcode;
char ID[ 10 ];
char Surname[ 20 ]; 

/* Create the procedure */
SQLExecDirect( stmt,
      "CREATE PROCEDURE employees()" \
      " RESULT( ID CHAR(10), Surname CHAR(20))"\
      " BEGIN" \
      " SELECT EmployeeID, Surname FROM Employees" \
      " END", SQL_NTS );

/* Call the procedure - print the results */
SQLExecDirect( stmt, "CALL employees()", SQL_NTS );
SQLNumResultCols( stmt, &num_col );
SQLBindCol( stmt, 1, SQL_C_CHAR, &ID,
            sizeof(ID), NULL );
SQLBindCol( stmt, 2, SQL_C_CHAR, &Surname,
            sizeof(Surname), NULL );

for( ;; ) {
   retcode = SQLFetch( stmt );
   if( retcode == SQL_NO_DATA_FOUND ) {
      retcode = SQLMoreResults( stmt );
   if( retcode == SQL_NO_DATA_FOUND ) break;
}  else {
      do_something( ID, Surname );
   }
}