Newsgroup: it.comp.software.database
Titolo: [URGENTE] Bisogno disperato di aiuto con OCI/Oracle

Ma sono scemo io, oppure la programmazione con le OCI e' qualcosa di
barbaramente atroce?
Se qualcuno puo' aiutarmi, lo prego di farlo, sto impazzendo per fare
delle semplici INSERT/SELECT SQL su una tabella!!!!
Il manuale ha 1260 pagine, ma e' chiaro come un testo esoterico scritto
in sanscrito e cifrato (o per lo meno cosi' mi sembra il venerdi' di
una settimana passata a sbatterci la testa contro!). Altro (tutorial,
guide un po' piu' umane) in rete non ho ancora trovato.
Qualcuno mi aiuti!
GePs

> Torakiki

 E come di grazia? Che problemi hai?
Ciao.
Sto cercando di scrivere un programma C che usi le librerie OCI per
fare delle semplici insert/select di righe all'interno di una tabella:
la mia intenzione era partire da qui per poi avventurarmi in qualcosa
di piu' complicato.
Sto cercando di scrivere del codice prendendo spunto dagli esempi
disponibili sul sito di Oracle (cdemo81.c su tutti), che riesco a
compilare e che funzionano benissimo. Nel mio programma sto cercando di
capire la sequenza di passi necessaria per arrivare al mio semplice
scopo:
1) inizializzare l'ambiente: nel mio programma utilizzo OCIEvcreate()
(nell'esempio sono usate altre due funzioni, ma ho letto che sono
deprecated) e di seguito utilizzo la variabile di tipo OCIEnv per
allocare gli handle per il server, per la gestione degli errori e per
il context, anche se non ho ben chiaro se tutto cio' sia necessario, e
a cosa serve esattamente ogni handle; Tutte le funzioni in questa fase
restituiscono 0, quindi non dovrei aver fatto errori...
2) Ho provato ad utilizzare OCILogon() e OCILogon2() per inizializzare
la sessione, ma senza successo, quindi ho usato OCIAttrSet() su un
handle di tipo OCISession e poi OCISessionBegin(): facendo cosi' ho
ancora tutti i codici di errore a 0, e quindi vado avanti, ma vorrei
capire perche' le prime due funzioni non funzionano;
3) provo ad eseguire la query: OCIStmtPrepare(), OCIBindByName() e
OCIStmtExecute(). Su queste funzioni ho i dubbi maggiori: innanzitutto
non ho capito esattamente quali parametri passare a OCIBindByName: dal
quinto parametro formale in poi e' nebbia. Poi ho -1 come codice di
uscita dalla execute (per una insert su una semplice tabella di due
campi, di cui uno e' un varchar2 primari key), e non ho capito perche'.
4) come fare a leggere i risultati di una select? Non ho ancora capito
come usare OCIStmtFetch()... ho inteso che bisogna allocare un buffer
da qualche parte, ma come? e dove?
Se vuoi ti mando il codice, o lo allego sul prossimo messaggio. In ogni
caso grazie per l'interessamento e scusa(te) la lunghezza.

 Io le uso senza problemi con il Pro-C/C.
Ciao! Il linguaggio host e' il C. Ho spiegato meglio i miei dubbi nella
risposta all'altro messaggio...
Grazie.

 caso grazie per l'interessamento e scusa(te) la lunghezza.
Stamattina ho risolto un po' di dubbi su OCIBindByName() e sono
riuscito a fare una insert :)
Adesso mi concentro sulla select e vi faro' sapere.
Rimangono i dubbi su OCILogon() e OCILogon2()....

> Torakiki

 Ma come mai non "passi" per il Pro-C?
è un po' complicato da spiegare, ma in questa fase non credo di poter
passare al Pro C. In ogni caso grazie per la dritta, cerchero' anche
qualcosa in rete per vedere se il Pro C puo' fare al caso mio; comunque
mi saresti molto d'aiuto se mi illustrassi qui in breve che vantaggi ne
avrei. Considera che mi interessano molto le prestazioni, e se si
tratta di usare un altro layer di astrazione non se se si puo' fare...

 è un po' complicato da spiegare, [...]
gironzolando un po' credo che potrebbe fare al caso mio. Ho provato a
compilare un esempio che ho trovato sui manuali ufficiali di Oracle con
il comando "proc sample.pc", ma ottengo questi errori:
tanti di questi
Error at line 34, column 11 in file /usr/include/stdio.h
# include <stddef.h>
..........1
che ho eliminato inserendo la directoty /src/include/linux nel file
$ORACLE_HOME/precomp/admin/pcscfg.cfg, ma tanti di questi che non
riesco a capire:
Syntax error at line 72, column 26, file /usr/include/gconv.h:
Error at line 72, column 26 in file /usr/include/gconv.h
                            unsigned char **, size_t *, int, int);
.........................1
PCC-S-02201, Encountered the symbol "size_t" when expecting one of the
following
:
   ... auto, char, const, double, enum, float, int, long,
   ulong_varchar, OCIBFileLocator OCIBlobLocator,
   OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
   OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
   short, signed, sql_context, sql_cursor, static, struct,
   union, unsigned, utext, uvarchar, varchar, void, volatile,
   a typedef name, exec oracle, exec oracle begin, exec,
   exec sql, exec sql begin, exec sql type, exec sql var,
The symbol "enum," was substituted for "size_t" to continue.
Che vuol dire?
Sto cercando dei tutorial, ma non tanto per la programmazione, che mi
sembra semplice, quanto per la parte di gestione dei sorgenti,
compilazione e linkaggio del codice oggetto. Se puoi aiutarmi magari
faccio prima...
grazie!

> Torakiki 

 [cut]
Ok, adesso mi studio bene tutte le stranezze... L'unica cosa e' che non
riesco a compilare gli esempi, ma magari domani andra' meglio...
ciao!

 [cut]
Ciao!
ho iniziato a leggere la guida, e ad un certo punto mi dice di
compilare cosi':
make -f 
proc.mk
 sample1
solo che non riesco a trovare il makefile! Dice che e' nella directory
demo, ma non ho nessuna directory demo per il precompilatore nella mia
installazione!!!
Sto cercando in rete e sul sito di Oracle, ma non trovo nessun demo per
il Pro*C!!!
Come devo fare a far girare i programmi???

> Torakiki

 EXE=$1.exe build
Il fatto e' che nella mia installazione di Oracle 10g R2 non ho la dir
$ORACLE_HOME/precomp/demo!
sotto precomp/ ho 
env_precomp.mk
 e 
ins_precomp.mk
. Provero' a compilare
con uno di quelli, ma mi sembra di andare a caso, visto che la
documentazione (e anche tu) mi dice di fare altro...

> Torakiki

 Il proc come eseguibile lanciato senza parametri, funziona si?
Si', funziona. Ora comunque sono riuscito a trovare degli esempi e un
makefile molto semplici, insomma, quello che mi serve per testare
l'ambiente e poi iniziare a programmare. Solo che per la
precompilazione ho gli stessi problemi di ieri, errori molto strani
sulle librerie di sistema, molti di questo tipo:
------------------------------------------
Error at line 0, column 0 in file test1.pc
PCC-F-02102, Fatal error while doing C preprocessing
Error at line 34, column 11 in file /usr/include/stdio.h
    34  # include <stddef.h>
    34  ..........1
    34  PCC-S-02015, unable to open include file
------------------------------------------
e molti di quest'altro tipo:
------------------------------------------
Error at line 72, column 26 in file /usr/include/gconv.h
    72                              unsigned char **, size_t *, int,
int);
    72  .........................1
    72  PCC-S-02201, Encountered the symbol "size_t" when expecting one
of the
        following:
           ... auto, char, const, double, enum, float, int, long,
           ulong_varchar, OCIBFileLocator OCIBlobLocator,
           OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
           OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
           short, signed, sql_context, sql_cursor, static, struct,
           union, unsigned, utext, uvarchar, varchar, void, volatile,
           a typedef name, exec oracle, exec oracle begin, exec,
           exec sql, exec sql begin, exec sql type, exec sql var,
        The symbol "enum," was substituted for "size_t" to continue.
------------------------------------------
il primo tipo di errore sembra non verificarsi se in
$ORACLE_HOME/precomp/admin/pcscfg.cfg inserisco il path
/usr/include/linux, ma il secondo rimane: non lo capisco e mi sembra
molto strano...
Ti ringrazio per la pazienza.

> Torakiki

Torakiki ha scritto:

Quale file vuoi?

> Torakiki


Eccolo, e' abbastanza piccolo. Pero' lo compilo su linux. Fedora Core
4, per l'esattezza.
Comunque forse ho capito dov'e' il problema: probabilmente devo editare
(meglio e totalemnte) a mano il file pcscfg.cfg: mi sono accorto solo
ora che punta a directory quasi completamente sballate... ne sai
qualcosa?
/*
Name:  test1.pc
Desc:  Test Program for Oracle ProC.
       Demonstrate single-row query.
Make:  make -f 
proc.mk
 all TARGET=test1
*/
#include <stdio.h>
#include <string.h>
exec sql include sqlca.h;
int main()
{
  exec sql begin declare section;
  int   count;
  char  uid[100];
  exec sql end declare section;
  exec sql whenever sqlerror goto sqlerror;
  exec sql whenever not found goto sqlerror;
  /* strcpy(uid,"scott/tiger"); */
  printf("Enter oracle id and password as id/pwd: ");
  gets(uid);
  exec sql connect :uid;
  exec sql select count(*) into :count from tab;
  printf("There are %d tables defined for this user.\n", count);
  return 0;
sqlerror:
  printf("\nSQL ERROR:\n%.70s (%d)\n",
    sqlca.sqlerrm.sqlerrmc, -sqlca.sqlcode);
  exec sql rollback work release;
  return 1;
}

 succesivi dipendono proprio dal mancato include.
Ok, ho risolto. Ho trovato questo messaggio su uno dei forum di Oracle
http://forums.oracle.com/forums/message.jspa?messageID=809494
Ho modificato pcscfg.cfg come dicono: sembra sia necessario includere
gli header di sistema e quelli del compilatore. Il file originale aveva
dei percorsi generici per le distribuzioni certificate oracle (suse,
red hat...), ma dato che Fedora non lo e' me lo sono dovuto modificare
io.
Includendo gli header del compilatore non serve nemmeno aggiungere la
direttiva parse=none al makefile.
Ora posso inizare a lavorare con Pro*C.
Grazie mille, mi hai indirizzato verso una buona strada :)

> Torakiki