Как вызвать функцию, PostgreSQL
Я пытаюсь использовать функцию с 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" = ;
IF FOUND THEN
UPDATE "USERS"
SET "name" = ,
"lastName" = ,
"userName" = ,
"password" = ,
"eMail" =
WHERE "userID" = ;
ELSE
INSERT INTO "USERS"
("name", "lastName", "userName", "password", "eMail")
VALUES
(, , , , );
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
у меня есть другие функции, которые возвращают resultset. Я использую SELECT * FROM "fnc"(...)
позвонить им, и это работает. Зачем быть Я получаю эту ошибку?
EDIT: я использую pgAdmin III Query tool и пытаюсь выполнить инструкции SQL там.
5 ответов
вызов функции по-прежнему должен быть правильный SQL запрос:
SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
для Postgresql вы можете использовать выполнить. PERFORM действителен только на языке процедур PL/PgSQL.
DO $$ BEGIN
PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;
предложение от команды postgres:
подсказка: если вы хотите отменить результаты выбора, используйте вместо этого PERFORM.
Если ваша функция не хочет ничего возвращать, вы должны объявить ее "return void", а затем вы можете назвать ее так: "perform functionName(parameter...);"
У меня была та же проблема при попытке проверить очень похожую функцию, которая использует инструкцию SELECT, чтобы решить, должна ли быть сделана вставка или обновление. Эта функция была перезаписью хранимой процедуры T-SQL.
Когда я тестировал функцию из окна запроса, я получил ошибку "запрос не имеет назначения для данных результата". Я, наконец, понял, что, поскольку я использовал оператор SELECT внутри функции, я не мог проверить функцию из окна запроса, пока я не назначил результаты выбора локальной переменной с помощью оператора INTO. Это исправило проблему.
если исходная функция в этом потоке была изменена на следующую, она будет работать при вызове из окна запроса,
$BODY$
DECLARE
v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = ;