代码之家  ›  专栏  ›  技术社区  ›  Erkan Haspulat

如何调用函数,PostgreSQL

  •  31
  • Erkan Haspulat  · 技术社区  · 16 年前

    我正在尝试使用PostgreSQL函数来保存一些数据。下面是创建脚本:

    -- 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" = $1;
    
    IF FOUND THEN
    UPDATE "USERS" 
        SET     "name" = $2,
        "lastName" = $3,
        "userName" = $4,
        "password" = $5,
        "eMail" = $6
    WHERE "userID" = $1;
    ELSE
        INSERT INTO "USERS"
        ("name", "lastName", "userName", "password", "eMail")
        VALUES
            ($2, $3, $4, $5, $6);
    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;
    

    PostResql文档指出,要调用不返回任何结果集的函数,只需写入其名称和属性即可。所以我试着这样调用函数:

    "saveUser"(3, 'asd','asd','asd','asd','asd');
    

    但我得到以下错误:

    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
    

    我还有其他返回结果集的函数。我用 SELECT * FROM "fnc"(...) 打电话给他们就行了。为什么我会得到这个错误?


    编辑: 我正在使用pgadmin III查询工具并尝试在那里执行SQL语句。

    5 回复  |  直到 9 年前
        1
  •  47
  •   Milen A. Radev    16 年前

    函数调用仍应是有效的SQL语句:

    SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
    
        2
  •  10
  •   Evandro Coan    9 年前

    对于PostgreSQL,您可以使用 PERFORM . perform仅在pl/pgsql过程语言中有效。

    DO $$ BEGIN
        PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
    END $$;
    

    Postgres团队的建议:

    提示:如果要放弃选择的结果,请改用“执行”。

        3
  •  4
  •   pengli    14 年前

    如果函数不希望返回任何内容,则应将其声明为“返回void”,然后可以这样调用它“perform functionname(parameter…);”

        4
  •  1
  •   G.Bouch    13 年前

    我在尝试测试一个非常相似的函数时遇到了同样的问题,该函数使用一个select语句来决定是否应该执行insert或update。此函数是T-SQL存储过程的重新写入。
    当我从查询窗口测试函数时,我得到错误“查询没有结果数据的目的地”。我最终发现,因为我在函数内部使用了一个select语句,所以在使用into语句将select的结果分配给局部变量之前,我无法从查询窗口测试函数。这解决了问题。

    如果将此线程中的原始函数更改为以下函数,则当从查询窗口调用时,它将工作。

    $BODY$
    DECLARE
       v_temp integer;
    BEGIN
    SELECT 1 INTO v_temp
    FROM "USERS"
    WHERE "userID" = $1;
    
        5
  •  -1
  •   chburd    16 年前

    您将函数声明为返回布尔值,但它从不返回任何内容。