#ifdef __GNUC__ #include #include #include #include #endif #include #define LEN 21 typedef char asciiz[LEN]; /* Nastaveni typove ekvivalence mezi Oracle a C */ EXEC SQL TYPE asciiz IS CHARZ(LEN) REFERENCE; /* Lze provadet i SELECT * INTO, z toho duvodu definujeme strukturu pro cely radek */ struct str_radek { int a; asciiz b; float c; }; /* Pro spravne fungovani FETCH/SELECT INTO potrebujeme i indicator */ struct str_radek_ind { short a_ind; short b_ind; short c_ind; }; void sql_error(char *msg); void get_login(char *buf, int len); int main() { struct str_radek radek; struct str_radek_ind radek_ind; char dbLogin[128]; /* Read login and password from stdin and prepare login string for Oracle */ get_login(dbLogin, 128); /* Pri vyskytu chyby zavolej funkci sql_error */ EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--"); EXEC SQL CONNECT :dbLogin; printf("Connected to ORACLE\n"); EXEC SQL INSERT INTO TEST VALUES (3,'test',2.5); EXEC SQL INSERT INTO TEST VALUES (4,'test',2.5); EXEC SQL DECLARE kursor1 CURSOR FOR SELECT a,b,c FROM test; EXEC SQL OPEN kursor1; printf("A B C\n"); printf("----------- ----------------- ----------\n"); /* Pri nenalezeni dalsiho zaznamu, proved prikaz 'break'. Tj. pro ukonceni nekonecneho for cyklu, viz nize. */ EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH kursor1 INTO :radek:radek_ind; printf("%011i %s %f\n", radek.a, ((radek_ind.b_ind == -1) ? "NULL " : radek.b), radek.c); } EXEC SQL CLOSE kursor1; EXEC SQL COMMIT; return 0; } void sql_error(char *msg) { char err_msg[512]; unsigned buf_len, msg_len; /* Pri vyskytu chyby pokracuj, tj. ignoruj chybu */ EXEC SQL WHENEVER SQLERROR CONTINUE; printf("\n%s\n", msg); buf_len = sizeof (err_msg); sqlglm(err_msg, &buf_len, &msg_len); /* Zjisti retezec chyby */ printf("%.*s\n", msg_len, err_msg); /* Proved rollback jako zotaveni z chyby a ukonci program */ EXEC SQL ROLLBACK RELEASE; exit(1); } void get_login(char *buf, int len) { char *dbname = "@db10"; char *pwd; char c; int l = 0; /* Length of the user's input */ /* Decrease buffer length (reserve room for slash in login string and db name) */ len -= 1 + strlen(dbname); printf("Login to %s:", dbname); while ((c = getchar()) != 10 && l < len) buf[l++] = c; buf[l++] = '/'; /* Add slash */ buf[l] = '\0'; pwd = getpass("Password:"); strncat(buf, pwd, len - l); free(pwd); strcat(buf, dbname); /* Add db name */ }