例如,当名称同时引用表列和例程参数时。 由于违反直观的解析逻辑,此类代码的执行可能会导致错误或意外结果。 通常,范围更局部的名称具有更高的优先级。
示例(PostgreSQL):
CREATE TABLE foo
(
id INT,
name VARCHAR(5)
);
CREATE FUNCTION func(name VARCHAR(5)) RETURNS INT AS
$$
DECLARE
b INT;
BEGIN
-- `name` 不明确,因为它被用作列名和参数
SELECT COUNT(*) INTO b FROM foo t WHERE t.name = name;
RETURN b;
END;
$$ LANGUAGE plpgsql;
在 PostgreSQL 中,您可以使用 #variable_conflict
指令来明确指定正确的引用。 例如,使用 #variable_conflict use_column
引用列名,或使用 #variable_conflict use_variable
引用参数。
CREATE TABLE foo
(
id INT,
name VARCHAR(5)
);
CREATE FUNCTION func(name VARCHAR(5)) RETURNS INT AS
$$
#variable_conflict use_column
DECLARE
b INT;
BEGIN
SELECT COUNT(*) INTO b FROM foo t WHERE t.name = name;
RETURN b;
END;
$$ LANGUAGE plpgsql;