Comment appeler une fonction, PostgreSQL
j'essaie d'utiliser une fonction avec PostgreSQL pour enregistrer quelques données. Voici le script de création:
-- Function: "saveUser"(integer, character varying, character varying, character varying, character varying, character varying)
-- DROP FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION "saveUser"("pUserID" integer, "pName" character varying, "pLastName" character varying, "pUserName" character varying, "pPassword" character varying, "peMail" character varying)
RETURNS boolean AS
$BODY$
BEGIN
SELECT 1
FROM "USERS"
WHERE "userID" = ;
IF FOUND THEN
UPDATE "USERS"
SET "name" = ,
"lastName" = ,
"userName" = ,
"password" = ,
"eMail" =
WHERE "userID" = ;
ELSE
INSERT INTO "USERS"
("name", "lastName", "userName", "password", "eMail")
VALUES
(, , , , );
END IF;
END;$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) OWNER TO postgres;
la Documentation de PostreSQL indique que pour appeler une fonction qui ne renvoie aucun résultat, il suffit d'écrire seulement son nom et ses propriétés. Donc, j'essaie d'appeler la fonction comme ceci:
"saveUser"(3, 'asd','asd','asd','asd','asd');
Mais j'obtiens l'erreur ci-dessous:
ERROR: syntax error at or near ""saveUser""
LINE 1: "saveUser"(3, 'asd','asd','asd','asd','asd')
^
********** Error **********
ERROR: syntax error at or near ""saveUser""
SQL state: 42601
Character: 1
j'ai d'autres fonctions qui retournent un jeu de résultats. J'utilise SELECT * FROM "fnc"(...)
pour les appeler et il fonctionne. Pourquoi suis-je obtenez cette erreur?
EDIT: j'utilise l'outil de requête pgAdmin III et j'essaie d'exécuter les instructions SQL.
5 réponses
l'appel de fonction doit toujours être une déclaration SQL valide:
SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
pour Postgresql vous pouvez utiliser PERFORM. PERFORM n'est valide que dans la langue de procédure PL/PgSQL.
DO $$ BEGIN
PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;
la suggestion de l'équipe de postgres:
conseil: si vous voulez rejeter les résultats D'un SELECT, utilisez PERFORM à la place.
si votre fonction ne veut pas retourner quoi que ce soit, vous devez la déclarer à "retourner nul" et alors vous pouvez l'appeler comme ceci "effectuer le functionName(paramètre...);"
j'ai eu ce même problème en essayant de tester une fonction très similaire qui utilise une instruction SELECT pour décider si un INSERT ou une mise à jour doit être fait. Cette fonction était une réécriture d'une procédure T-SQL stockée.
Quand j'ai testé la fonction depuis la fenêtre de requête j'ai eu l'erreur "la requête n'a pas de destination pour les données de résultat". J'ai finalement compris que parce que j'ai utilisé une déclaration SELECT à l'intérieur de la fonction que je ne pouvais pas tester la fonction de la fenêtre de requête jusqu'à ce que je assigné les résultats de la variable SELECT à une variable locale en utilisant une instruction INTO. Le problème est résolu.
si la fonction originale dans ce thread était changée à la suivante, elle fonctionnerait quand elle est appelée depuis la fenêtre de requête,
$BODY$
DECLARE
v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = ;
vous déclarez votre fonction comme retour booléen, mais il ne renvoie jamais rien.