Firebird e stored procedure: se esiste altro

Sto cercando di creare una stored procedure per firebird 2.1 (questa è la versione che è quello di essere utilizzato)
Ma sono sempre un po ‘ bloccato, quindi ogni aiuto è apprezzato.
La versione definitiva dovrebbe confrontare 4 valori contro il tavolo, e recuperare il primaryid se il valore esiste, o creare la nuova voce nella tabella, e restituisce il nuovo primaryid.

Ma mi si blocca con un solo valore di ricerca, e non è nemmeno utilizzando la variabile di sicurezza.

SET TERM ^ ;

CREATE PROCEDURE TESTSP 
 ( A Varchar(64) ) 
RETURNS 
 ( RESULT Integer )
AS 

BEGIN
IF (EXISTS (SELECT PRIMARYID FROM TABLENAME WHERE FIELD = 'Some string')) then
    SELECT PRIMARYID FROM TABLENAME WHERE FIELD = 'Some string' into :primaryid;
    result = PRIMARYID;
ELSE 
    INSERT INTO TABLENAME (FIELD) VALUES ('Some string');
    result = gen_id(GEN_TABLEID, 0);
END^

SET TERM ; ^

Ho un Token “sconosciuto” per il comando Else.

Aggiornamento dopo le risposte:
Ora voglio usare le 4 variabili e ritorno il 4 risultati.
Penso che ho bisogno di un ciclo for per farlo, ma con l’uccello di fuoco, per una funzione di qualcos’altro.
Quindi, quale sarebbe la strada da percorrere?

SET TERM ^ ;

CREATE PROCEDURE TESTSP 
 ( value1 Varchar(64) ) 
RETURNS 
 ( RESULT1 Integer )
AS 

BEGIN
    IF (EXISTS (SELECT PRIMARYID FROM TABLENAME WHERE FIELD = :value1)) then
        SELECT PRIMARYID FROM TABLENAME WHERE FIELD = value1 into :result1;
    ELSE BEGIN
        result1 = gen_id(GEN_TABLEID, 1);
        INSERT INTO TABLENAME (PRIMARYID, FIELD) VALUES (:result1, :value1);
    END
    suspend;
END^

SET TERM ; ^
InformationsquelleAutor Giancarlo | 2013-12-30

 

3 Replies
  1. 1

    Come Tico già risposto devi usare begin /end al gruppo più istruzioni in then /else parte. L’errore si attestano colonna PRIMARYID essere sconosciuto perchè si fa riferimento ad esso senza aver dichiarato una variabile locale per esso. Prova questo:

    CREATE PROCEDURE TESTSP ( A Varchar(64) ) 
    RETURNS ( RESULT Integer )
    AS 
    BEGIN
      -- initialize the result
      Result = NULL;
      -- check is the string already in table
      SELECT PRIMARYID FROM TABLENAME WHERE FIELD = 'Some string' into :Result;
      IF (Result is NULL) then
        INSERT INTO TABLENAME(PRIMARYID, FIELD) VALUES(gen_id(GEN_TABLEID, 1), 'Some string') RETURNING PRIMARYID INTO :Result;
    END^
    • Ciao ain, questo funziona, ma quando cerco di utilizzare la variabile (o valore1) (valore1 Varchar(64)) in “where Campo = valore1 in :Risultato;” ho la colonna sconosciuta di nuovo. Se faccio doppio citare il “valore1” avrebbe significato letterale. Così come potrei essere in grado di utilizzare la variabile?
    • Prefisso con il colon, che è come separare i parametri/variabili da colonne in istruzioni SQL in PSQL, cioè :A o :value1
    • Ciao ain, che opera per la creazione di SP. Ma quando eseguire flamerobin come: SCEGLIERE pag.Il RISULTATO TESTSP(VALORE1) p dà una colonna sconosciuto “VALORE1”. E vorrei loop anche se questa funzione 4 volte per 4 valori e ottenere 4 risultati. Avete consigli su come gestire questo? Ho aggiornato il mio post con tutte le risposte, per compilare un esempio completo per altri con la stessa domanda.
    • Flamerobin non sa come sostituire il value1 con un po ‘ di valore, è necessario utilizzare un valore costante invece del nome della variabile ci, vale a dire SELECT p.RESULT FROM TESTSP('foo') p . Come di looping, thats difficile con inpot provenienti da diversi parametri per ogni passaggio, quindi meglio svolgendo il ciclo – scrivere lo stesso set di istruzione per ogni fase del ciclo, utilizzando diversi parametri.
  2. 1

    Penso che la stored procedure dovrebbe assomigliare a questo:

    SET TERM ^ ; 
    CREATE PROCEDURE TESTSP 
      ( A Varchar(64) ) 
      RETURNS ( result Integer ) 
    AS 
    BEGIN 
      IF (EXISTS (SELECT PRIMARYID 
                  FROM TABLENAME 
                  WHERE FIELD = 'Some string')) then 
         SELECT PRIMARYID 
           FROM TABLENAME 
           WHERE FIELD = 'Some string' 
           into :result;
      ELSE BEGIN
         result = gen_id(GEN_TABLEID, 1); 
         INSERT INTO TABLENAME 
           (PRIMARYID, FIELD) 
           VALUES (:result,  'Some string'); 
      END
    END^ 
    SET TERM ; ^
  3. 1

    Se si dispone di più istruzioni per allora, e/o la clausola else è necessario utilizzare BEGIN ... END-block!

    SET TERM ^ ;
    
    CREATE PROCEDURE TESTSP 
     ( A Varchar(64) ) 
    RETURNS 
     ( RESULT Integer )
    AS 
    
    BEGIN
    IF (EXISTS (SELECT PRIMARYID FROM TABLENAME WHERE FIELD = 'Some string')) then
      BEGIN
        SELECT PRIMARYID FROM TABLENAME WHERE FIELD = 'Some string' into :primaryid;
        result = PRIMARYID;
      END
    ELSE 
      BEGIN
        INSERT INTO TABLENAME (FIELD) VALUES ('Some string');
        result = gen_id(GEN_TABLEID, 0);
      END
    END^
    
    SET TERM ; ^
    • Ciao Tico, ti Ringrazio per la risposta, ho provato che prima, ma non ha funzionato neanche. Che mi esce l’errore che la colonna PRIMARYID è sconosciuto

Lascia un commento