B.2 Column Name Precedence
If a SQL statement references a name that belongs to both a column and either a local variable or formal parameter, then the column name takes precedence.
Caution:
When a variable or parameter name is interpreted as a column name, data can be deleted, changed, or inserted unintentionally.
In Example B-2, the name last_name belongs to both a local variable and a column (names are not case-sensitive). Therefore, in the WHERE clause, both references to last_name resolve to the column, and all rows are deleted.
               
Example B-3 solves the problem in Example B-2 by giving the variable a different name.
Example B-4 solves the problem in Example B-2 by labeling the block and qualifying the variable name with the block name.
In Example B-5, the function dept_name has a formal parameter and a local variable whose names are those of columns of the table DEPARTMENTS. The parameter and variable name are qualified with the function name to distinguish them from the column names.
               
Example B-2 Variable Name Interpreted as Column Name Causes Unintended Result
DROP TABLE employees2; CREATE TABLE employees2 AS SELECT LAST_NAME FROM employees; DECLARE last_name VARCHAR2(10) := 'King'; BEGIN DELETE FROM employees2 WHERE LAST_NAME = last_name; DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows.'); END; /
Result:
Deleted 107 rows.
Example B-3 Fixing Example B-2 with Different Variable Name
DECLARE
  v_last_name  VARCHAR2(10) := 'King';
BEGIN
  DELETE FROM employees2 WHERE LAST_NAME = v_last_name;
  DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows.');
END;
/
 Result:
Deleted 2 rows.
Example B-4 Fixing Example B-2 with Block Label
<<main>> DECLARE last_name VARCHAR2(10) := 'King'; BEGIN DELETE FROM employees2 WHERE last_name = main.last_name; DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows.'); END; /
Result:
Deleted 2 rows.
Example B-5 Subprogram Name for Name Resolution
DECLARE FUNCTION dept_name (department_id IN NUMBER) RETURN departments.department_name%TYPE IS department_name departments.department_name%TYPE; BEGIN SELECT department_name INTO dept_name.department_name -- ^column ^local variable FROM departments WHERE department_id = dept_name.department_id; -- ^column ^formal parameter RETURN department_name; END dept_name; BEGIN FOR item IN ( SELECT department_id FROM departments ORDER BY department_name) LOOP DBMS_OUTPUT.PUT_LINE ('Department: ' || dept_name(item.department_id)); END LOOP; END; /
Result:
Department: Accounting Department: Administration Department: Benefits Department: Construction Department: Contracting Department: Control And Credit Department: Corporate Tax Department: Executive Department: Finance Department: Government Sales Department: Human Resources Department: IT Department: IT Helpdesk Department: IT Support Department: Manufacturing Department: Marketing Department: NOC Department: Operations Department: Payroll Department: Public Relations Department: Purchasing Department: Recruiting Department: Retail Sales Department: Sales Department: Shareholder Services Department: Shipping Department: Treasury