/*********************************************************************************************** * Az alabbi kod egy egyszeru KR-C kod, amely feltételezi, hogy az ablinux ORACLE szerveren * letezik eg "buci" nevu "Kis-buci" jelszoval azonositott felhasznalo, akinek az adatbazisa- * ban van egy "dolgozok" nevu relacios tabla, amelyet a * * Create Table dolgozok(nev Varchar2(30), beoszt Varchar2(30)); * * DDL utasitassal hozott letre. Feltetelezzuk, hogy a tablat lekerdezve a kovetkezot latjuk: * *=============================================================== *| NEV | beoszt | *--------------------------------------------------------------- *| Olvasztar Pongrac | Vas- es elmunkas | *=============================================================== * * A program elokeszitese es inditasa a kovetkezo parancsokkal tortenik: * * buci@ablinux:~> proc PARSE=NONE INCLUDE=/usr/include INCLUDE=/usr/include/linux cursor.pc * buci@ablinux:~> cc -I$ORACLE_HOME/precomp/public -L$ORACLE_HOME/lib/ -lclntsh -o cursor cursor.c * buci@ablinux:~> ./cursor **********************************************************************************************/ #include #include main(argc, argv) int argc; char *argv[]; { EXEC SQL BEGIN DECLARE SECTION; char *uid = "buci/Kis-buci"; char *nev = "Kis-Buci Balamber"; char *beoszt = "Kohomernok"; long summa = 0; struct { char ename[30]; char beoszt[30]; } emp; EXEC SQL END DECLARE SECTION; /* Ha az SQL utasitas vegrehajtasakor a szerver hibat eszlel a program hibaagra megy */ EXEC SQL WHENEVER SQLERROR goto hiba; /* Adatbazis connect */ EXEC SQL CONNECT :uid; /* Kurzor deklaracio */ EXEC SQL DECLARE c CURSOR FOR SELECT nev, beoszt FROM dolgozok ORDER BY nev; /* A kurzor megnyitasa */ EXEC SQL OPEN c; /* A C kodban a kurzor attributumok nem erhetok el. A kurzor attributumok elerese az alabbi modon tortenik. A "DO break" azt jelenti, hogy a While ciklus (lasd alabb) alljon le, amikor a NOTFOUND kurzor attributum (c%NOTFOUND) igazza valik. */ EXEC SQL WHENEVER NOT FOUND DO break; /* Ujra rendelkezunk SQLERROR elofordulasrol. Erre azert van szukseg, mert a beagyazott SQL hibat ad ha a kiolvasott sor valamelyik oszlopa NULL erteku. A NULL ertekek kezelesehez erdemes megnezni az on-line dokumentacioban a PROC konyvben az un. indikator valtozokat is. A "DO continue" arrol rendelkezik, hogy a ciklus porogjon tovabb; */ EXEC SQL WHENEVER SQLERROR DO continue; while (1) { EXEC SQL FETCH c INTO :emp; /* NULL oszlop hibat okoz, ezek nem irodnak ki -> continue */ (void)printf("nev:%s beoszt:%s\n", emp.ename, emp.beoszt); } /* A ciklus lefutasa utan az alabbi utasitas szukseges, azert hogy a preprocesszor ne generaljon egy "break" utasitast ezen a helyen. Mostantól, ha SQLERROR keletkezik, akkor a program fusson hibaagra. */ EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL WHENEVER SQLERROR GOTO hiba; /* Lezarjuk a kurzort */ EXEC SQL CLOSE c; /* Insertalunk a tablaba. Az alabbi Insert utasitasban a ":nev" es a ":beoszt" nem place holderek, hanem a host nyelv valtozói (C-valtozók, char* pointerek). Igy jelöljuk a preprocesszornak, hogy a szimbólum a beagyazó nyelvben deklaralt valtozó. Az Insert utasitast koveto COMMIT szukseges, hogy a beszúrt sor megmaradjon */ EXEC SQL INSERT INTO dolgozok(nev, beoszt) VALUES(:nev, :beoszt); EXEC SQL COMMIT; /* e nelkul nem commit-al */ /* Újra kiolvassuk a tablat */ EXEC SQL OPEN c; EXEC SQL WHENEVER NOT FOUND DO BREAK; EXEC SQL WHENEVER SQLERROR DO continue; while (1) { EXEC SQL FETCH c INTO :emp; /* NULL comm oszlop hibat okoz, ezek nem irodnak ki -> continue */ (void)printf("nev:%s beoszt:%s\n", emp.ename, emp.beoszt); } EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL WHENEVER SQLERROR GOTO hiba; EXEC SQL CLOSE c; /* Megnezzuk, hogy hany sorunk van. A "summa" egy C-ben deklaralt host valtozo. */ EXEC SQL SELECT COUNT(*) INTO :summa FROM dolgozok; (void)printf("summa=%ld\n", summa); /* Torlunk a tablabol */ EXEC SQL DELETE FROM dolgozok WHERE nev LIKE '%Buci%'; /* ujra beszurunk, majd ujra megnezzuk, hogy hany sorunk van. */ EXEC SQL INSERT INTO dolgozok(nev, beoszt) VALUES(:nev, :beoszt); EXEC SQL COMMIT; /* e nelkul nem commit-al */ EXEC SQL SELECT COUNT(*) INTO :summa FROM dolgozok; (void)printf("summa=%ld\n", summa); return 0; hiba: (void)printf("%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc); return 1; }