【问题标题】:How can i execute a function where columns and function inputs have the same name?如何执行列和函数输入具有相同名称的函数?
【发布时间】:2021-04-26 01:45:25
【问题描述】:

我正在尝试创建两个函数,一个用于插入,另一个用于从该表中删除行:

CREATE TABLE person
firstName |lastName |age
Lebron    |James    |35
Steph     |Curry    |33
Kevin     |Durant   |31
Nikola    |Jokic    |26

我被要求使用 3 个参数作为函数 ,firstName , lastName,age 的输入来创建这 2 个函数。

就插入而言,我创建函数没有问题:

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';

我收到了这条消息: 错误:列引用“firstName”不明确

我知道这个问题是因为函数的参数和列的名称相同。有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

  • 你为什么不重命名你的函数参数呢?这是推荐的方法

标签: postgresql insert plpgsql


【解决方案1】:

您的感觉是正确的,这应该会导致最新版本的 PostgreSQL 出现错误。

如果您无法重命名参数(这将是最简单的解决方案),请使用函数名称限定 VALUES 子句中的参数名称:

VALUES (insert_function.firstname, ...)

对于DELETE 中的WHERE 条件,用表名限定表列:

WHERE person.firstname = insert_function.firstname

【讨论】:

  • 我知道最简单的方法就是重命名参数,但我被要求以这种方式执行函数。
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多