2015-10-14 19 views
6

Ho una tabella t con una colonna i di tipo int, con poche righe. Voglio passarci sopra. Naturalmente, posso scrivere una query di selezione per questo. Ma sto imparando le procedure e ha scritto una procedura,Come sospende il lavoro in firebird?

set term ^; 
create procedure qt returns(a int) as 
begin 
    for select i from t into :a do 
     suspend; 
end^ 
set term ;^ 

Ma quando io chiamo questa procedura, ho solo ottenere una fila indietro,

execute procedure qt; 

vedo,

  A 
============ 
      1 

penso Non capisco suspend.

risposta

8

Le stored procedure con un SUSPEND in esse sono le cosiddette procedure selezionabili. Si esegue utilizzando SELECT:

SELECT * FROM qt 

o

SELECT * FROM qt() 

La dichiarazione EXECUTE PROCEDURE è solo per le procedure che producono un unico risultato di fila. Se lo si utilizza per una stored procedure selezionabile, produrrà una sola riga (e uscirà quando raggiunge SUSPEND).

In risposta alla tua richiesta di informazioni su ciò che è documentato su questo:

  • L'Interbase 6.0 Guida di riferimento a pagina 177 dice:

    SOSPENDERE non deve essere utilizzato in una procedura eseguibile.

  • Nella pagina 178 mostra una tabella del comportamento di SUSPEND, EXIT e END nelle procedure selezionabili ed eseguibili (leggermente modificati per adattarsi):
Procedure type SUSPEND    EXIT    END 
Selectable  • Suspends execution Jumps to final END • Returns control 
       of procedure until       to application 
       next FETCH is issued      • Sets SQLCODE to 100 
       • Returns output        (end of record stream) 
       values 

Executable  • Jumps to final END Jumps to final END • Returns values 
       • Not recommended       • Returns control 
                  to application 
  • Per una stored (mostrato a pagina 178) che può produrre più righe, pagina 179 descrive le differenze di comportamento quando viene eseguito con SELECT ed eseguito con EXECUTE PROCEDURE.
+0

Grazie mille. È scritto da qualche parte nella documentazione di Firebird? Perché non ho mai letto questo. – ericj

+0

@ericj Avrei bisogno di dare un'occhiata; Non ho tempo per farlo adesso. –

+1

@ericj Ho aggiornato la mia risposta con le informazioni del riferimento al linguaggio Interbase 6. –