PDA

Visualizza la versione completa : [PL/SQL]Query come output di una funzione/procedura


antony85
03-03-2009, 19:52
Salve possibile che una funzione/procedura(passandogli dei parametri appropiati) possa dare come output un risultato composto da varie tuple e vari attributi?
Es. stupido(giusto x rendere l'idea):
dando in input il numero di una camera alberghiera,voglio sapere i nomi e cognomi delle persone che vi hanno soggiornato dentro.(so che si puo fare direttamente tramite una query ccn operatore join,ma giusto x rendere l'idea di cosa voglio avere come output)

123delphi321
03-03-2009, 20:48
si puo fare

antony85
03-03-2009, 21:39
posteresti qlk codice funzionante???in modo ke prendo spunto da esso..

123delphi321
04-03-2009, 07:51
io non conosco questo database PL, quindi suppongo che potrebbero esserci delle varianti.
io utilizzo interbase/firebird.


in sql puoi fare le query parametriche


select
clienti.id,
clienti.nome,
clienti.cognome
from clienti
where clienti.id=:IdCliente


e poi in un secondo momento (prima di eseguire la query) definisci il parametro IdCliente


oppure puoi creare una 'Stored Procedure', che e' una procedura memorizzata all'interno del tuo database a che in sintesi passi i parametri da te definiti e ti restituisce un dataresoult dopo una serie di operazioni....

in questo esempio passo come parametro in valore idanagrafica, e ottengo come dataresoult 1 solo record contenente due field che sono TOTALEIMPORTOA e TOTALEIMPORTOB.

chiaramente a secondo delle esigenze si puo ottenere un dataresoult di n record e n fields.



CREATE PROCEDURE TOTALI (
IDANAGRAFICA_IN INTEGER)
RETURNS (
TOTALEIMPORTOA NUMERIC(15,2),
TOTALEIMPORTOB NUMERIC(15,2))
AS
BEGIN
/* Procedure Text */
SELECT
SUM(movimenti.importoa),
SUM(movimenti.importob)
FROM movimenti
WHERE movimenti.idanagrafica=:idanagrafica_in
INTO
totaleimportoa,
totaleimportob;

IF (totaleimportob IS NULL) THEN totaleimportob=0;

SUSPEND;
END


ciao

JosaFat
04-03-2009, 08:42
No, in PL/SQL non si fa come in T/SQL, nel quale una stored procedure praticamente una query parametrica. Le procedure sono procedure. Volendo puoi ritornare come parametro di output il riferimento ad un cursore, ma tale dato lo puoi utilizzare all'interno di altro codice, non come data source come se fosse una tabella o una vista.

antony85
04-03-2009, 12:33
quindi plsql ha questa limitazione,posso utilizzare il puntatore del cursore ad un altra procedura,ma non visualizzare "cosa contiene il cursore" come output,giusto?

JosaFat
04-03-2009, 12:48
S, fondamentalmente, la procedura pu restituire un dato di un tipo complesso, utilizzabile tramite pl/sql o da un linguaggio che supporti tale tipo di dato. Ma non si tratta dell'output che avresti facendo una select.

Difatti, se esegui tale query da sqlplus:


select table_name, tablespace_name from user_tables;

avrai un output.

Mentre, se provi a trasformalo in un blocco PL/SQL, in questo modo:



begin
select table_name, tablespace_name from user_tables;
end;
/


e poi provi ad eseguirlo, sempre da sqplus, avrai un errore.

Fondamentalmente non la considero una limitazione, se una cosa una procedura non una vista.

Loading