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.

30
demandé sur Erkan Haspulat 2009-12-23 18:09:08

5 réponses

l'appel de fonction doit toujours être une déclaration SQL valide:

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
42
répondu Milen A. Radev 2009-12-23 15:21:35

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.

8
répondu itsnikolay 2016-11-28 14:35:11

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...);"

4
répondu pengli 2011-07-14 02:01:59

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" = ;
1
répondu G.Bouch 2012-09-05 14:58:54

vous déclarez votre fonction comme retour booléen, mais il ne renvoie jamais rien.

0
répondu chburd 2009-12-23 15:19:13