Newsgroup: it.comp.software.database
Titolo: ORACLE: query SQL dinamice in procedure

Mi trovo a dover scrivere in ambiente Oracle 7.3.3 una procedura all'interno
della quale devo eseguire delle query la cui struttura dipende dai
parametri.
In poche parole devo poter comporre una query SQL in via programmatica (con
IF e uso di variabili) ed eseguirla.
Devo poter usare cursori su tale query.
Purtroppo non posso stravolgere il database, cioč non posso creare viste e
tabelle, in quanto il numero di utenti che possono effettuare
contemporaneamente tale operazione lo rende improponibile.
Grazie
                Enrico Pessana

 Devo poter usare cursori su tale query.
... ed il problema quale e'? Che non sai da che parte iniziare o cosa?
Davide

 ha scritto nel messaggio
news:93n4uk$ar8o4$6...@ID-18487.news.dfncis.de...

il problema è che so scrivere query a struttura fissa, con variabili
all'interno delle condizioni, ma non con nomi della tabella e dei campi
variabili, ma solo costanti.
Immagino sia una cavolata, tipo comporre una stringa contenente SQL e poi
eseguirla come faccio da tempo in Access, ma non so la sintassi o il metodo
da utilizzare.
Grazie
                    Enrico

 ha scritto nel
messaggio news:93n5ev$acogf$1...@ID-25551.news.dfncis.de...

Come sempre mi spiego malissimo, il succo è poter fare una fetch di una
query contenuta in una stringa o comunque di una query scritta runtime e non
nella sezione declare come per i cursori espliciti.
Grazie
        Enrico

 Come sempre mi spiego malissimo, il succo poter fare una fetch di una
Sinceramente non ci ho mai provato, quello che mi viene in mente
e' la creazione 'al volo' di una View e poi fare una bella select *
dalla view. Ovviamente se non e' possibile 'comporre' la query
direttamente.
Davide

 wrote:
si usa il package dbms_sql ; ecco un piccolo esempio:
PROCEDURE eseguiDeleteStmt
(
deleteStmt VARCHAR2
) IS
num_cur number;
num_riga number;
BEGIN
    num_cur := dbms_sql.open_cursor;
    dbms_sql.parse (num_cur, deleteStmt, dbms_sql.v7);
    num_riga := dbms_sql.execute (num_cur);
    dbms_sql.close_cursor (num_cur);
EXCEPTION
   when others then
      null;
END;

--
Greetings, Alessandro
http://www.b3soft.com
Pesaro, Italy
Sent via Deja.com
http://www.deja.com/


Grazie per la dritta del package, per altre persone eventualmente
interessate, posto un esempio in cui viene effettuata una fetch.
In questo caso, puramente di test, so già il numero e tipo di dati e li
inserisco in una tabella di verifica.
Ovviamente in un caso reale i dati verrebbero elaborati e non brutalmente
inseriti.
Procedure EseguiSQL
(
codiceSQL varchar2
)
is
num_cur number;
num_riga number;
num_err number;
num_ini number;
l_data date;
begin
delete from provaproc;
num_cur:=dbms_sql.open_cursor;
dbms_sql.parse(num_cur,codiceSQL,dbms_sql.native);
dbms_sql.define_column(num_cur,1,num_ini);
dbms_sql.define_column(num_cur,2,l_data);
num_riga:=dbms_sql.execute(num_cur);
while dbms_sql.fetch_rows(num_cur)>0 loop
     dbms_sql.column_value(num_cur,1,num_ini);
     dbms_sql.column_value(num_cur,2,l_data);
     insert into provaproc values(num_ini,l_data);
end loop;
dbms_sql.close_cursor(num_cur);
exception
    when others then
         insert into provaproc values(num_riga,'ERRORE');
end;
Ciao
                Enrico

 ha scritto nel
messaggio news:941kt7$bp7so$1...@ID-25551.news.dfncis.de...

OOPS, refuso, ovviamente la gestione degli errori ne genera uno 8^) , visto
che il secondo campo è di tipo data.
Ciao
                Enrico