如何调用函数PostgreSQL

如何调用函数PostgreSQL,postgresql,function-call,Postgresql,Function Call,我正在尝试使用PostgreSQL函数来保存一些数据。以下是创建脚本: -- Function: "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) -- DROP FUNCTION "saveUser"(integer, character varying, character

我正在尝试使用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文档指出,要调用不返回任何resultset的函数,只写其名称和属性就足够了。所以我尝试这样调用函数:

"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语句。

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

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

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

如果您的函数不想返回任何内容,您应该将其声明为“return void”,然后您可以这样调用它“perform functionName(parameter…)”

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

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

$BODY$
DECLARE
   v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = $1;

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

DO $$ BEGIN
    PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;
博士后团队的建议是:

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


对于PostgreSQL数据库,我们可以使用两种方法调用用pgadmin编写的函数

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

CREATE OR REPLACE FUNCTION helloWorld(name text) RETURNS void AS $helloWorld$
DECLARE
BEGIN
    RAISE LOG 'Hello, %', name;
END;
$helloWorld$ LANGUAGE plpgsql;
我们可以通过以下方式之一调用函数helloworld:

SELECT "helloworld"('myname');

SELECT public.helloworld('myname')

我在函数定义的底部插入了一行“RETURN 1=1”,只是为了测试这一点,没有效果。是的,但报告的问题不是由这一点引起的。应该是一个注释(不是回答问题),使用它,我得到了错误;“错误:查询没有结果数据的目标”。我想知道这个错误是否与我想返回布尔值有关?我用另一个返回void的函数尝试了这个方法,它可以工作,但是如果我想返回布尔值呢?Erkan:尝试了将这两个答案结合起来?也就是说,您的调用是错误的,并且您没有为预期返回bool的函数返回任何内容。此外,为什么要一直引用大小写混合标识符?@Alex:我声明函数返回布尔值,并插入了“return 1=1;”在函数的底部,然后使用“选择”saveUser(..),但它不起作用。我还尝试返回void,删除'return 1=1',并使用上面相同的SELECT语句,但也不起作用。您看到的新错误消息(“error:query没有结果数据的目标”)指的是函数中的错误-PL/pgSQL中的“SELECT”SQL语句应该始终是“SELECT INTO”。如果您不需要结果,请使用“PERFORM”(),我想在dobegin中使用SELECT而不是PERFOM。如果我使用SELECT,我将面临一个错误,即[42601]错误:查询没有结果数据的目标。我不知道为什么,也不想在某个变量中使用,因为我使用的是pgtap函数SELECT has_table('unit_test_output');它应该填充控制台上的输出