Search code examples
oracle-databaseidentifier

ORA-00972 Identifier too long - Declare statement


I'm getting the Oracle error ORA-00972 Identifier too long. This is likely due to this line

WHERE EMPLOYEE_ID = &e;

But I just cannot figure it out.

To test this, I removed all the CASE statements and serverout statements, but i still get the error after entering the employee ID at run time.

An image is attached of the error at runtime. Error

  set echo on
  spool c:\cs422a\wa4spool.txt
  SET SERVEROUT ON

DECLARE Emp_rec HR.EMPLOYEES%ROWTYPE;

BEGIN
    SELECT *
    INTO Emp_rec
    FROM HR.EMPLOYEES
    WHERE EMPLOYEE_ID = &e;

    DBMS_OUTPUT.PUT_LINE("---------------------------------------');
    CASE Emp_rec.Department_ID
         WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('Department:   Administration');
         WHEN 20 THEN DBMS_OUTPUT.PUT_LINE('Department:   Marketing');
         WHEN 30 THEN DBMS_OUTPUT.PUT_LINE('Department:   Purchasing');
         WHEN 40 THEN DBMS_OUTPUT.PUT_LINE('Department:   Human Resources'); 
         WHEN 50 THEN DBMS_OUTPUT.PUT_LINE('Department:   Shipping');
         WHEN 60 THEN DBMS_OUTPUT.PUT_LINE('Department:   IT');
         WHEN 70 THEN DBMS_OUTPUT.PUT_LINE('Department:   Public Relations');
         WHEN 80 THEN DBMS_OUTPUT.PUT_LINE('Department:   Sales'); 
         WHEN 90 THEN DBMS_OUTPUT.PUT_LINE('Department:   Executive');
         WHEN 100 THEN DBMS_OUTPUT.PUT_LINE('Department:  Finance');
         WHEN 110 THEN DBMS_OUTPUT.PUT_LINE('Department:  Accounting');
         WHEN 120 THEN DBMS_OUTPUT.PUT_LINE('Department:  Treasury'); 
         WHEN 130 THEN DBMS_OUTPUT.PUT_LINE('Department:  Corporate Tax');
         WHEN 140 THEN DBMS_OUTPUT.PUT_LINE('Department:  Control and Credit');
         WHEN 150 THEN DBMS_OUTPUT.PUT_LINE('Department:  Shareholder Services');
         WHEN 160 THEN DBMS_OUTPUT.PUT_LINE('Department:  Benefits'); 
         WHEN 170 THEN DBMS_OUTPUT.PUT_LINE('Department:  Manufacturing');
         WHEN 180 THEN DBMS_OUTPUT.PUT_LINE('Department:  Construction');
         WHEN 190 THEN DBMS_OUTPUT.PUT_LINE('Department:  Contracting');
         WHEN 200 THEN DBMS_OUTPUT.PUT_LINE('Department:  Operations'); 
         WHEN 210 THEN DBMS_OUTPUT.PUT_LINE('Department:  IT Support');
         WHEN 220 THEN DBMS_OUTPUT.PUT_LINE('Department:  NOC');
         WHEN 230 THEN DBMS_OUTPUT.PUT_LINE('Department:  IT Helpdesk');
         WHEN 240 THEN DBMS_OUTPUT.PUT_LINE('Department:  Government Sales');
         WHEN 250 THEN DBMS_OUTPUT.PUT_LINE('Department:  Retail Sales');
         WHEN 260 THEN DBMS_OUTPUT.PUT_LINE('Department:  Recruiting');
         WHEN 270 THEN DBMS_OUTPUT.PUT_LINE('Department:  Payroll');  
    END CASE;
    DBMS_OUTPUT.PUT_LINE('Department:        '     || Emp_rec.DEPARTMENT_ID);
    DBMS_OUTPUT.PUT_LINE('Employee ID:          '  || Emp_rec.EMPLOYEE_ID);
    DBMS_OUTPUT.PUT_LINE('Employee First Name:  '  || Emp_rec.FIRST_NAME);
    DBMS_OUTPUT.PUT_LINE('Employee Last Name:   '  || Emp_rec.LAST_NAME);
    DBMS_OUTPUT.PUT_LINE('Salary:               '  || Emp_rec.SALARY);
    DBMS_OUTPUT.PUT_LINE('---------------------------------------');
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('No data found.');

END;
/

Solution

  • You have a typo in line 9:

    DBMS_OUTPUT.PUT_LINE("---------------------------------------');
    

    There is a double quotes, when it should be a single quote.

    Double quotes are used in identifiers to force case sentivity (see this question for details).

    In your example, the PL/SQL parser thinks you are trying to use a variable named ---------------------------------------(...) and this causes the ORA-00972.