77

我正在尝试使用 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 语句。

4

6 回答 6

104

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

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
于 2009-12-23T15:21:35.553 回答
33

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

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

postgres 团队的建议:

提示:如果您想丢弃 SELECT 的结果,请改用 PERFORM。

于 2016-09-30T13:57:29.620 回答
7

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

于 2011-07-14T02:01:59.810 回答
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;

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

SELECT "helloworld"('myname');

SELECT public.helloworld('myname')
于 2019-04-07T06:19:33.220 回答
4

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

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

$BODY$
DECLARE
   v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = $1;
于 2012-09-05T14:58:54.183 回答
-3

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

于 2009-12-23T15:19:13.187 回答