不明确的函数参数
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_variable
或 use_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 好作风需要
在任何嵌入的地方都使用限定名称 SQL - 要访问函数的参数,请使用模式 function_name.parameter_name
以前版本的 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)
示例函数:
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_variable
或 use_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 好作风需要
在任何嵌入的地方都使用限定名称 SQL - 要访问函数的参数,请使用模式
function_name.parameter_name
以前版本的 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)