Firebird et des procédures stockées: si il existe d'autre alors
Je suis en train de créer une procédure stockée pour firebird 2.1 (c'est cette version qui est utilisée)
Mais je suis un peu bloqué, de sorte que toute aide est très appréciée.
La version finale devrait comparer les 4 valeurs contre la table, et de récupérer le primaryid si la valeur existe, ou la création de la nouvelle entrée dans la table, et le retour de la nouvelle primaryid.
Mais je suis coincé avec une seule valeur de recherche, et il n'est même pas à l'aide de la variable encore.
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 ; ^
- Je obtenir un Jeton "inconnu" pour la commande Else.
Mise à jour après les réponses:
Maintenant, je veux utiliser les 4 variables et retour le 4 résultats.
Je pense que j'ai besoin d'une boucle for de le faire, mais avec firebird, la fonction signifie quelque chose d'autre.
Donc, ce serait la chose à faire?
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 ; ^
Vous devez vous connecter pour publier un commentaire.
Comme Tico déjà répondu, vous devez utiliser
begin /end
pour regrouper plusieurs instructions dansthen /else
partie. L'erreur buter colonne PRIMARYID étant inconnu est parce que vous faites référence, sans avoir déclaré une variable locale pour elle. Essayez ceci::A
ou:value1
value1
avec une certaine valeur, vous devez utiliser une valeur constante à la place du nom de la variable y, c'est à direSELECT p.RESULT FROM TESTSP('foo') p
. Comme de bouclage, c'est un peu difficile à avec inpot venant de différents paramètres pour chaque étape afin de mieux vous dérouler la boucle - écrire le même jeu d'instruction pour chaque étape de la boucle, à l'aide de différents paramètres.Je pense que votre procédure stockée doit ressembler à ceci:
Si vous avez plusieurs instructions pour l'époque et/ou de la clause else, vous devez utiliser
BEGIN ... END
à bloc!