たとえば、名前がテーブルの列とルーチンのパラメーターの両方を参照している場合が挙げられます。 そのようなコードは解決ロジックが直感的ではないため、実行するとエラーが発生したり、予期しない結果になったりする可能性があります。 通常、内側のブロックで定義された名前 (ローカル変数) は外側のブロックで定義された名前 (グローバル変数) よりも優先されます。
例 (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;