Как вызвать функцию PostgreSQL - PullRequest
33 голосов
/ 23 декабря 2009

Я пытаюсь использовать функцию с 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 Query и пытаюсь выполнить там заявления SQL.

Ответы [ 6 ]

53 голосов
/ 23 декабря 2009

Вызов функции все еще должен быть допустимым оператором SQL:

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
10 голосов
/ 30 сентября 2016

Для Postgresql вы можете использовать PERFORM . PERFORM действителен только на языке процедур PL / PgSQL.

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

Предложение от команды postgres:

СОВЕТ: Если вы хотите отменить результаты SELECT, используйте вместо этого PERFORM.

4 голосов
/ 14 июля 2011

если ваша функция не хочет возвращать что-либо, вы должны объявить ее как "return void", а затем вы можете вызвать это как "execute functionName (параметр ...);"

1 голос
/ 07 апреля 2019

У нас может быть два способа вызова функций, написанных на 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')
1 голос
/ 05 сентября 2012

У меня была такая же проблема при попытке протестировать очень похожую функцию, которая использует инструкцию SELECT, чтобы решить, нужно ли делать INSERT или UPDATE. Эта функция была переписана хранимой процедурой T-SQL.
Когда я проверил функцию из окна запроса, я получил ошибку «у запроса нет места назначения для данных результата». В конце концов я понял, что, поскольку я использовал оператор SELECT внутри функции, я не мог проверить функцию из окна запроса, пока я не назначил результаты SELECT локальной переменной, используя оператор INTO. Это решило проблему.

Если исходная функция в этом потоке была изменена на следующую, она будет работать при вызове из окна запроса,

$BODY$
DECLARE
   v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = $1;
0 голосов
/ 23 декабря 2009

вы объявляете вашу функцию возвращающей логическое значение, но она никогда ничего не возвращает.

...