Ответ 1
Вызов функции по-прежнему должен быть действительным оператором SQL:
SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
Я пытаюсь использовать функцию PostgreSQL для сохранения некоторых данных. Вот создание script:
-- 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 Documentation заявляет, что для вызова функции, которая не возвращает какой-либо набор результатов, достаточно написать только его имя и свойства. Поэтому я пытаюсь вызвать функцию следующим образом:
"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"(...)
для вызова, и он работает. Почему я получаю эту ошибку?
EDIT: Я использую инструмент pgAdmin III Query и пытаюсь выполнить там SQL-запросы.
Вызов функции по-прежнему должен быть действительным оператором SQL:
SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
Для Postgresql вы можете использовать PERFORM. PERFORM действует только на языке процедур PL/PgSQL.
DO $$ BEGIN
PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;
Предложение от команды postgres:
СОВЕТ. Если вы хотите отменить результаты SELECT, вместо этого используйте PERFORM.
если ваша функция не хочет возвращать что-либо, вы должны объявить ее "return void", а затем вы можете вызвать ее так: "выполнить функциюName (параметр...);"
У меня была эта же проблема при попытке протестировать очень похожую функцию, которая использует инструкцию SELECT, чтобы решить, нужно ли делать INSERT или UPDATE. Эта функция была перезаписанием хранимой процедуры T-SQL.
Когда я проверил функцию из окна запроса, я получил ошибку "запрос не имеет назначения для данных результата". Я, наконец, понял, что, поскольку я использовал инструкцию SELECT внутри функции, которую я не мог проверить функцию из окна запроса, пока я не присвоил результаты SELECT локальной переменной с использованием инструкции INTO. Это устранило проблему.
Если исходная функция в этом потоке была изменена на следующую, она будет работать при вызове из окна запроса,
$BODY$
DECLARE
v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = $1;
вы объявляете свою функцию как возвращающую логическое значение, но она никогда ничего не возвращает.