Как я могу выполнить функцию, в которой столбцы и входные данные функции имеют одно и то же имя?

#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. Большое вам спасибо!