Benutzer-Werkzeuge

Webseiten-Werkzeuge


edv:prg:esql_c:example:int_execsimplesql

execSimpleSQL()

Es ist in einigen Situationen sinnvoll SQL-Statement dynamisch als String zu bilden und gleich bei der DB auszuführen. Solange solche Aufrufe einzeln und nicht wiederholt abgesetzt werden, sind sie genauso effizient wie die mit Prepared Statemens.

Hier ist ein Beispiel einer Funktion, die als Eingabeparameter einen beliebigen SQL-String erwartet (vereinfachte Variante):

#define RC_DB_OK		0
#define TMP_STRING_LAENGE	8192
 
/*
 * Diese Funktion führt einfache SQLs aus.
 *
 * Eingabeparameter:
 * sql          - SQL-String, der ausgeführt werden soll;
 * text         - Text (z.B. updated / deleted / inserted) für Massenoperationen;
 * funktionname - "__func__"-Makro der aufrufenden Funktion (für den Trace)
 *
 * Ausgabeparameter:
 * rows - Falls NULL, wird ignoriert, sonst wird dort bei Erfolg die Zahl durch SQL betroffener Sätze zurück gegeben
 */
int execSimpleSQL (const char * sql, const int * rows, const char * text, const char * funktionname) // Führt einfache SQLs aus.
{
	int rc_SQL = RC_DB_OK;
	int countRows = 0;
 
	EXEC SQL BEGIN DECLARE SECTION;
	char tmpStrSQL [TMP_STRING_LAENGE + 1]; // Host-Variable (im Sinne ESQL/C)
	EXEC SQL END DECLARE SECTION;
 
	countRows = 0;
	memset(tmpStrSQL, '\0', sizeof(tmpStrSQL));
 
	strcpy(tmpStrSQL, sql); // Den SQL-String in die Host-Variable übernehmen.
 
	// Hier wir die SQL-Anweisung ausgeführt:
	EXEC SQL EXECUTE IMMEDIATE :tmpStrSQL;
	if (rc_SQL = sqlca.sqlcode) rcSQL_ErrorInfo(tmpStrSQL, "fehlgeschlagen", rc_SQL, funktionname); // Fehlermeldung
	else
	{
		countRows = sqlca.sqlerrd[2]; // Anzahl betroffener Sätze übernehmen
 
		if (text) printf("%d rows %s.", countRows, text); // Falls "text" nicht NULL, Text ausgeben.
 
		if (rows) *rows = countRows; // Falls "rows" nicht NULL, Anzahl betroffener Sätze zurück geben.
	} // if
 
	return rc_SQL;
} // execSimpleSQL()

Die Funktion rcSQL_ErrorInfo() gibt die Fehlermeldungen aus (vereinfachte Variante):

/*
 * Diese Funktion kann nach jeder DB-Operation aufgerufen werden,
 * falls der SQL-Code nicht RC_DB_OK ist.
 *
 * Eingabeparameter:
 * bezug        - SQL-String, der den Fehler verursacht hat;
 * fehler       - Fehlerinformation, z.B. das Wort "fehlgeschlagen"
 * rc_SQL       - Fehler-Code der SQL-Operation
 * funktionname - s.o.
 */
void rcSQL_ErrorInfo (const char * bezug, const char * fehler, int rc_SQL, const char * funktionname)
{
	printf("'%s' %s", bezug, fehler);
	printf("sqlca.sqlcode = %d (in %s)", rc_SQL, funktionname);
} // rcSQL_ErrorInfo()

Stand: 26.11.2009
: Jürgen Kreick

EOF

edv/prg/esql_c/example/int_execsimplesql.txt · Zuletzt geändert: 2020/01/11 01:23 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki