8.2 Embedded SQL
Embedded SQL
EXEC SQL INSERT INTO artikel VALUES (:anr, :bez);
EXEC SQL BEGIN DECLARE SECTION;
NUMBER anr;
VARCHAR2 bez;
int zaehler;
EXEC SQL END DECLARE SECTION;
Embedded SQL Fehlerbehandlung:
Embedded SQL Forts. Fehlerbehandlung:
EXEC SQL WHENEVER SQLERROR GOTO label;
EXEC SQL WHENEVER SQLERROR GOTO fehler;
...
fehler: printf( "\nFehler! %70s\n" ,sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
Embedded SQL Anmelden bei der Datenbank:
oder
EXEC SQL CONNECT benutzer/passwort;
Embedded SQL Abmelden bei der Datenbank:
Embedded SQL
Arbeiten in C mit SQL-Anfrageergebnissen:
Bei genau einem Ergebnistupel: mit INTO arbeiten
Beispiel:
VARCHAR bez;
...
EXEC SQL SELECT artname INTO :bez FROM artikel
WHERE artnr = 15;
if(sqlca.sqlcode == 0) {
bez.arr[bez.len]='\0';
printf( "Bezeichnung zu Artnr. 15 ist %s\n",bez.arr);
}
..}
Embedded SQL
Arbeiten in C mit SQL-Anfrageergebnissen:
Embedded SQL Nullwerte:
short v1_ind, v2_ind;
...
EXEC SQL FETCH c1 INTO :liefname, :artikelnr,
:preis INDICATOR :v1_ind;
...
EXEC SQL FETCH c2 INTO :artikelnr, :bez :v2_ind;
Embedded SQL
#include<stdio.h>
#include<string.h>
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR userid[9];
VARCHAR passwd[9];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
int main(void)
{
char user[9];
char passwort[9];
printf(" Ihr Login-Name?" );
scanf(" %s" ,user);
printf( "\nIhr Passwort?" );
scanf( "%s" ,passwort);
EXEC SQL WHENEVER SQLERROR GOTO fehler;
EXEC SQL WHENEVER NOT FOUND GOTO ende;
strcpy( (char *) userid.arr, user);
userid.len = strlen( (char *) userid.arr);
strcpy( (char *) passwd.arr, passwort);
passwd.len = strlen( (char *) passwd.arr);
EXEC SQL CONNECT :userid IDENTIFIED BY :passwd;
printf( "Alle Milch-Artikel: \n" );
printf( "ab jetzt in der Tabelle 'milchprod'\n");
EXEC SQL DECLARE artikel TABLE
(artnr number(4),
artname VARCHAR2(40)
);
EXEC SQL DECLARE milchprod TABLE (
nr number(4),
bez varchar2(40)
);
EXEC SQL EXECUTE
DECLARE
CURSOR c IS SELECT * FROM artikel WHERE artname LIKE '%milch%';
BEGIN
FOR rec IN c LOOP
INSERT INTO milchprod
VALUES (rec.artnr,rec.artname);
END LOOP;
END;
END-EXEC;
ende: EXEC SQL COMMIT RELEASE;
return 0;
fehler: printf( "\nFehler! %70s\n" ,sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
Embedded SQL, PL/SQL Rekursion:
#include<stdio.h>
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR userid[9];
VARCHAR passwd[9];
VARCHAR ch[40];
VARCHAR un[40];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE c CURSOR FOR
SELECT chef, angname INTO ch, un
FROM sn_ang_chef
START WITH chef='Bond'
CONNECT BY PRIOR angname=chef;
EXEC SQL INCLUDE SQLCA;
int main(void)
{...
printf( "Alle Untergebenen: \n");
EXEC SQL OPEN c;
if(sqlca.sqlcode == 0) {
printf( "Vorgesetzter: \t\t Untergebener:\n");
while(1){
EXEC SQL FETCH c INTO :ch, :un;
ch.arr[ch.len]='\0';
un.arr[un.len]='\0';
printf( "%s\t\t %s\n",ch.arr,un.arr);
}
}
...
}
Embedded SQL
EXEC SQL DECLARE s1 STATEMENT;
EXEC SQL PREPARE s1 FROM 'select * from liefert;'
EXEC SQL EXECUTE s1 [USING :var1,...];
Embedded SQL Beispiel1 (dynamisch)
#include<stdio.h>
#include<string.h>
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR userid[9];
VARCHAR passwd[9];
VARCHAR bez[40];
int nummer;
char string1[256];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE s1 STATEMENT;
EXEC SQL DECLARE c CURSOR FOR
SELECT artnr, artname FROM artikel
WHERE artname like '%milch%';
EXEC SQL DECLARE c1 CURSOR FOR s1;
EXEC SQL INCLUDE SQLCA;
int main(void)
{
char user[9];
char passwort[9];
char u_bez[50];
printf( "Ihr Login-Name? ");
scanf( "%s" ,user);
printf( "\nIhr Passwort?" );
scanf("%s" ,passwort);
EXEC SQL WHENEVER SQLERROR GOTO fehler;
strcpy( (char *) userid.arr, user);
userid.len = strlen( (char *) userid.arr);
strcpy( (char *) passwd.arr, passwort);
passwd.len = strlen( (char *) passwd.arr);
EXEC SQL CONNECT :userid IDENTIFIED BY :passwd;
printf( "Welche Artikel (Wort in Art.bezeichnung) interessieren Sie? ");
scanf( "%s ",u_bez);
strcat(string1, "select artnr, artname from artikel where artname like '%");
strcat(string1,u_bez);
strcat(string1,"%'" );
printf( "\n\nIhre Anfrage lautet:\n %s\n" ,string1);
EXEC SQL PREPARE s1 FROM :string1;
printf("\n\nAlle %s-Artikel: \n" ,u_bez);
EXEC SQL EXECUTE s1;
EXEC SQL OPEN c1;
EXEC SQL WHENEVER NOT FOUND GOTO next;
if(sqlca.sqlcode == 0) {
printf( "Artikelnr:\t\tArtikelname\n" );
while(1){
EXEC SQL FETCH c1 INTO :nummer, :bez;
bez.arr[bez.len]='\0';
printf(" %-10d\t\t %s\n" ,nummer,bez.arr);
}
}
next: EXEC SQL CLOSE c1;
printf( "\n\n" );
EXEC SQL WHENEVER NOT FOUND GOTO ende;
printf( "Alle Milch-Artikel: \n" );
EXEC SQL OPEN c;
if(sqlca.sqlcode == 0) {
printf( "Artikelnr:\t\tArtikelname\n" );
while(1){
EXEC SQL FETCH c INTO :nummer, :bez;
bez.arr[bez.len]='\0';
printf( "%-10d\t\t %s\n" ,nummer,bez.arr);
}
}
EXEC SQL CLOSE c;
ende: EXEC SQL COMMIT RELEASE;
return 0;
fehler: printf( "\nFehler! %70s\n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
Embedded SQL Beispiel2 (dynamisch)
#include<stdio.h>
#include<string.h>
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR userid[9];
VARCHAR passwd[9];
VARCHAR bez[40];
int nummer;
char string1[256];
int u_bez;
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE s1 STATEMENT;
EXEC SQL DECLARE c1 CURSOR FOR s1;
EXEC SQL INCLUDE SQLCA;
int main(void)
{
char user[9];
char passwort[9];
.........
printf( "Welcher Artikel (Artikelnr) interessiert Sie? " );
scanf( "%d ",&u_bez);
EXEC SQL PREPARE s1 FROM 'select artnr, artname from artikel where artnr = :u_bez';
printf( "\n\nArtikel: \n" );
EXEC SQL EXECUTE s1 USING :u_bez;
EXEC SQL OPEN c1;
EXEC SQL WHENEVER NOT FOUND GOTO ende;
if(sqlca.sqlcode == 0) {
printf( "Artikelnr:\t\tArtikelname\n");
while(1){
EXEC SQL FETCH c1 INTO :nummer, :bez;
bez.arr[bez.len]='\0';
printf( "%-10d\t\t %s\n" ,nummer,bez.arr);
}
}
EXEC SQL CLOSE c1;
printf( "\n\n" );
ende: EXEC SQL COMMIT RELEASE;
return 0;
fehler: printf( "\nFehler! %70s\n" ,sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}