不明确的函数参数

Ambiguous function arguments

示例函数:

CREATE OR REPLACE FUNCTION update_a_table(id int, name text)
RETURNS void AS $$
BEGIN
    UPDATE a_table 
    SET name = name
    WHERE id = id;
END;
$$ LANGUAGE plpgsql;

导致此错误:

ERROR:  column reference "name" is ambiguous
LINE 2:   SET name = name
                     ^
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.

很明显,我可以通过更改参数名称来纠正这个问题。有没有其他解决方案?

通常,在编程中对两个不同的对象使用相同的名称是一种不好的做法。您不应该这样做,更改参数名称是最好的解决方案。然而,Postgres 敞开了大门(为了与旧版本的兼容性)。您可以设置 configuration parameter:

set plpgsql.variable_conflict to use_variable;

参数的可能值:error(默认值)、use_variableuse_column

也可以只为给定的函数设置参数:

CREATE OR REPLACE FUNCTION update_a_table(id int, name text)
RETURNS void AS $$
#variable_conflict use_variable
BEGIN
    UPDATE a_table 
    SET name = name
    WHERE id = id;
END;
$$ LANGUAGE plpgsql;

或者,您可以显式限定不明确的名称,这是比上述解决方案更好的解决方案。限定名称的形状为 <function_name>.<parameter_name>,例如 update_a_table.id.

CREATE OR REPLACE FUNCTION update_a_table(id int, name text)
RETURNS void AS $$
BEGIN
    UPDATE a_table 
    SET name = update_a_table.name
    WHERE a_table.id = update_a_table.id;
END;
$$ LANGUAGE plpgsql;

这个错误对于非常难以检测的错误来说更安全。 PLpgSQL 好作风需要

  1. 在任何嵌入的地方都使用限定名称 SQL - 要访问函数的参数,请使用模式 function_name.parameter_name

  2. 以前版本的 Postgres 没有这种检测,只有一种保护是使用带有特殊前缀的变量。通常使用'_'作为前缀。规则很简单——当你的函数包含嵌入式 SQL 时,所有变量和参数名称都应以“_”开头。这样可以更安全地防止名称冲突并增加可读性,因为您可以快速看到什么是变量以及什么是 SQL 标识符。

CREATE OR REPLACE FUNCTION update_a_table_1(int,text)
RETURNS void AS $$
BEGIN
    UPDATE a_table 
    SET name = 
    WHERE id =;
END;
$$ LANGUAGE plpgsql;

You can create a function w/o specifying argument(s) name, in your case you have 2 args so you just need to access them by providing its index (</code> and <code>) but IMO its not a good idea when you have many args to pass(for example a function with 10 or 10+ args it may confuse you)