#postgresql #insert #plpgsql
Вопрос:
я пытаюсь создать две функции, одна из которых вставляет, а другая удаляет строки из этой таблицы:
CREATE TABLE person
firstName |lastName |age
Lebron |James |35
Steph |Curry |33
Kevin |Durant |31
Nikola |Jokic |26
Меня попросили создать эти 2 функции ,используя 3 параметра в качестве входных данных для функций: Имя , фамилия,возраст.
Что касается вставки, то у меня не было проблем с созданием моей функции:
CREATE OR REPLACE FUNCTION insert_function(firstName character varying(45)
,lastName character varying(45) ,age character varying(45))
-
RETURNS void AS
$
BEGIN
INSERT INTO person (firstName , lastName , age)
VALUES (firstName , lastName , age);
END;
$
LANGUAGE 'plpgsql';
Хотя названия столбцов в моей таблице и параметры функции совпадают, у меня не возникло никаких проблем . Если что-то выглядит не так, пожалуйста, не стесняйтесь упоминать об этом.
С другой стороны, когда я попытался создать свою функцию удаления, все пошло не так хорошо:
CREATE OR REPLACE FUNCTION insert_function(firstName character varying(45)
,lastName character varying(45) ,age character varying(45))
-
RETURNS void AS
$
BEGIN
DELETE FROM person
WHERE firstName = NEW.firstName AND lastName=NEW.lastName AND age=NEW.age;
END;
$
LANGUAGE 'plpgsql';
и я получил это сообщение:
ОШИБКА: ссылка на столбец «Имя» неоднозначна
Я знаю, что эта проблема вызвана тем, что параметры функции и столбцы имеют одно и то же имя . Кто-нибудь может мне в этом помочь?
Спасибо.
Комментарии:
1. Почему бы вам просто не переименовать параметры своей функции? Это рекомендуемый подход
Ответ №1:
Ваше ощущение правильное, и это должно привести к ошибке в последних версиях PostgreSQL.
Если вы не можете переименовать параметры, что было бы самым простым решением, укажите имена параметров в VALUES
предложении с именем функции:
VALUES (insert_function.firstname, ...)
В случае WHERE
условия в DELETE
, укажите в столбцах таблицы имя таблицы:
WHERE person.firstname = insert_function.firstname
Комментарии:
1. Я знал, что самый простой способ-просто переименовать параметры, но меня попросили выполнить функцию таким образом .
2. Большое вам спасибо!