如何调用函数,PostgreSQL

Erk*_*lat 43 postgresql function-calls

我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)

PostreSQL文档声明要调用不返回任何结果集的函数,只写入其名称和属性就足够了.所以我尝试这样调用函数:

"saveUser"(3, 'asd','asd','asd','asd','asd');
Run Code Online (Sandbox Code Playgroud)

但我得到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我有其他函数返回结果集.我SELECT * FROM "fnc"(...)用来打电话给他们,但是有效.为什么我收到此错误?


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

Mil*_*dev 65

函数调用仍然应该是一个有效的SQL语句:

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
Run Code Online (Sandbox Code Playgroud)

  • 使用这个,我得到了错误;“错误:查询没有结果数据的目的地”。我想知道这个错误是否与我想要返回布尔值有关? (2认同)
  • Erkan:尝试结合两个答案?即您的调用是错误的,并且您没有为预期返回bool的函数返回任何内容.此外,为什么你一直有引用的混合大小写标识符? (2认同)
  • 您看到的新错误消息(“错误:查询没有结果数据的目标”)指的是函数中的错误 - PL/pgSQL 中的“SELECT”SQL 语句应始终为“SELECT INTO”。如果您不需要结果,请使用“PERFORM”(http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATMENTS-SQL-NORESULT)。 (2认同)

its*_*lay 19

对于Postgresql,您可以使用PERFORM.PERFORM仅在PL/PgSQL过程语言中有效.

DO $$ BEGIN
    PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;
Run Code Online (Sandbox Code Playgroud)

postgres团队的建议:

提示:如果要放弃SELECT的结果,请改用PERFORM.


Kru*_*tik 7

我们可以有两种方式调用 pgadmin 中为 postgre sql 数据库编写的函数。

假设我们定义了如下函数:

CREATE OR REPLACE FUNCTION helloWorld(name text) RETURNS void AS $helloWorld$
DECLARE
BEGIN
    RAISE LOG 'Hello, %', name;
END;
$helloWorld$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我们可以通过以下方式之一调用函数 helloworld:

SELECT "helloworld"('myname');

SELECT public.helloworld('myname')
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您的函数不想返回任何内容,则应将其声明为“ return void”,然后可以像这样“执行functionName(parameter ...);”来调用它。