报告 SQL 代码中不明确的引用。

例如,当名称同时引用表列和例程参数时。 由于违反直观的解析逻辑,此类代码的执行可能会导致错误或意外结果。 通常,范围更局部的名称具有更高的优先级。

示例(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;