如何调用函数,PostgreSQL

问题描述 投票:33回答:6

我正在尝试使用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;

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

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

postgresql function-calls
6个回答
55
投票

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

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

12
投票

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

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

postgres团队的建议:

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


4
投票

如果你的函数不想返回任何东西,你应该将它声明为“return void”然后你可以像这样调用它来执行“perform functionName(parameter ...);”


1
投票

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

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

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

1
投票

我们可以通过两种方式调用pgadmin中为postgresql数据库编写的函数。

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

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')

-1
投票

你声明你的函数返回布尔值,但它永远不会返回任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.