WÄHLEN Sie oder FÜHREN Sie in eine PL/pgSQL-Funktion
Habe ich diese Funktion in meine Datenbank:
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;
Aber sobald ich versuche, es zu benutzen, es sagt ich PERFORM
wenn ich will, Sie zu verwerfen, die Ergebnisse! Das problem hier ist, dass ich nicht wollen! Ich möchte, dass Sie in der articulo
Zeile habe ich erklärt!
Ich bin mit dieser Aussage:
SELECT "insertarNuevoArticulo"('Acetaminofen', 'caro', '1' , '1', '8', '1', '10', '1', '150.7', '10');
Und der Fehler den ich bekomme, ist 42601 einen syntax-Fehler! Wie kann es sein, wenn ich mit der IDE zu erstellen? Irgendeine Idee zum problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In plpgsql-code
SELECT
ohne ein Ziel löst einen Fehler aus. Aber Sie haben natürlich nicht wollenSELECT INTO
Sie wollen einfach nur, um den status derFOUND
. Verwenden SieFÜHREN
für, die.Besser, aber, verwenden Sie
IF EXISTS ...
. Betrachten Sie dieses umschreiben der Funktion:Über
EXISTS
:Den anderen wichtigen Punkt:
GIBT
- Klausel derINSERT
- Anweisung anstelle von einer zusätzlichenSELECT
.Postgres 9.5+
In PostgreSQL 9.5 oder höher verwenden Sie lieber ein einem einfachen Beispiel: statt: (
INSERT ... ON CONFLICT DO NOTHING
).Sie hätte
UNIQUE
Einschränkungen auf"Articulo"("Nombre", "idTipo", "idFamilia")
und"ArticuloMarca"("idArticulo", "idMarca")
und dann:Dies ist schneller, einfacher und zuverlässiger. Die zusätzlichen loops Regel verbliebene race-conditions bei gleichzeitigem schreibt (beim hinzufügen der kaum Kosten). Ohne gleichzeitige schreibt, Sie vereinfachen können. Ausführliche Erklärung:
Beiseite: rechtliche, lower-case-IDS zu vermeiden alle hässlich Doppel-Zitat.
Diese Zeile sieht mir suspekt und ist es wahrscheinlich, was die Ursache Ihrer Trauer:
Sind Sie die Ausführung einer SELECT-in Ihrer Funktion, aber nicht etwas zu tun mit den Ergebnissen. Sie müssen zum ausführen einer SELECT INTO-wie Sie früher in Ihrer Funktion.