SÉLECTIONNEZ ou d'EFFECTUER, dans un fonctions PL/pgSQL
J'ai cette fonction dans ma base de données:
CREATE OR REPLACE FUNCTION "insertarNuevoArticulo"(nombrearticulo character varying, descripcion text, idtipo integer, idfamilia bigint, artstock integer, minstock integer, maxstock integer, idmarca bigint, precio real, marcastock integer)
RETURNS boolean AS
$BODY$
DECLARE
articulo "Articulo"%ROWTYPE;
BEGIN
SELECT * INTO articulo FROM "Articulo" WHERE "Nombre" = $1 AND "idTipo"=$3 AND "idFamilia"=$4;
IF NOT FOUND THEN
INSERT INTO "Articulo" ("Nombre", "Descripcion", "idTipo", "idFamilia", "Stock", "MinStock", "MaxStock") Values ($1, $2, $3, $4, $5, $6, $7);
SELECT last_value
INTO articulo."idArticulo"
FROM "public"."Articulo_idArticulo_seq";
END IF;
SELECT * FROM "ArticuloMarca" AS am WHERE am."idArticulo" = articulo."idArticulo" and am."idMarca" = $8;
IF NOT FOUND THEN
Insert into "ArticuloMarca"("idArticulo", "idMarca", "PrecioReferencial", "Stock") Values (articulo."idArticulo", $8, $9, $10);
RETURN TRUE;
END IF;
RETURN FALSE;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "insertarNuevoArticulo"(character varying, text, integer, bigint, integer, integer, integer, bigint, real, integer)
OWNER TO postgres;
Mais dès que j'essaie de l'utiliser, il dit que j'ai besoin d'utiliser PERFORM
si je veux ignorer les résultats! Le problème ici est que je ne veux pas! Je les veux dans le articulo
ligne, j'ai déclaré!
Je suis l'aide de cette instruction:
SELECT "insertarNuevoArticulo"('Acetaminofen', 'caro', '1' , '1', '8', '1', '10', '1', '150.7', '10');
Et l'erreur que j'obtiens est 42601, une erreur de syntaxe! Comment pourrait-il en être si je suis à l'aide de l'IDE pour le créer? Une idée sur le problème?
OriginalL'auteur dbncourt | 2012-04-12
Vous devez vous connecter pour publier un commentaire.
En plpgsql code,
SELECT
sans cible déclenche une erreur. Mais de toute évidence vous ne pas voulezSELECT INTO
, vous voulez juste de définir le statut deFOUND
. Vous utilisezEXÉCUTER
.Mieux, mais, utilisez
IF EXISTS ...
. Considérer cette réécriture de votre fonction:Sur
EXISTS
:La autre point essentiel:
RETOUR
l'article de laINSERT
instruction au lieu d'un autreSELECT
.Postgres 9.5+
Dans Postgres 9.5 ou plus tard plutôt l'utilisation d'un UPSERT: (
INSERT ... ON CONFLICT DO NOTHING
).Vous auriez
UNIQUE
contraintes sur"Articulo"("Nombre", "idTipo", "idFamilia")
et"ArticuloMarca"("idArticulo", "idMarca")
et puis:C'est plus rapide, plus simple et plus fiable. L'ajout de boucles règle les conditions de course avec des écritures simultanées (tout en ajoutant de la peine à tout prix). Sans écritures simultanées, vous pouvez simplifier. Explication détaillée:
De côté: recours à la justice, bas-de-casse identifiants pour éviter tout moche double-échappement.
OriginalL'auteur Erwin Brandstetter
Cette ligne semble suspect à moi et c'est probablement ce qui est la cause de votre chagrin:
L'exécution d'une sélection au sein de votre fonction, mais ne pas faire n'importe quoi avec les résultats. Vous avez besoin de SÉLECTIONNER un DANS comme vous l'avez fait plus tôt dans votre fonction.
OriginalL'auteur Glenn