2017-08-08 113 views
0

不知道我在做什么错误。我尝试了移动的东西,但没有运气。继续收到以下错误。有人,请指教。Oracle中的PL/SQL错误

Declare 

Begin 
FOR v_rec IN (
select max(TotalEmployee) as TotalEmployee1 , Week_Day 
    from (select count(*) as TotalEmployee, TO_CHAR(hire_date, 'Day') as Week_Day 
      from Employee 
      group by TO_CHAR(hire_date, 'Day') 
    Order by TotalEmployee desc) Table1 
    group by Week_Day 
        )LOOP 
    dbms_output.put_line('*********************************************************************************************************************************************************************************************************');  
    dbms_output.put_line(v_rec.Week_Day || (v_rec.TotalEmployee1)||' employee'); 
    dbms_output.put_line(rpad('Hire_Date', 15) || rpad('Name', 15) || rpad('JOB TITLE', 45) || rpad('SALARY', 20) || rpad('# of EMP',15) || rpad('DEPARTMENT NAME',20) ||rpad('MANAGER NAME',15) || rpad('MANAGER SALARY',15));        
    FOR v_rec1 IN (select HIRE_DATE , EMPLOYEE_NAME as Name , JOB_TITLE , 
       Case when SALARY = null then '-------' 
        ELSE to_char(SALARY, '$9,999.99') 
       END as "SALARY" , 
       Case when DEPARTMENT_NAME = null then '-------' 
        ELSE DEPARTMENT_NAME 
       END as DEPARTMENT_NAME, 
       Case when Employee_NAME = null then '-------' 
          ELSE Employee_NAME 
         END as MANAGERNAME, 
       Case when SALARY = null then '-------' 
          ELSE to_char(SALARY, '$9,999.99') 
         END as MANAGERSALARY 
       from Employee, department 
      where TO_CHAR(hire_date, 'Day') in (v_rec.Week_Day) and employee.DEPARTMENT_ID = department.DEPARTMENT_ID ) LOOP 

      dbms_output.put_line(rpad(v_rec1.HIRE_DATE, 15) || rpad(v_rec1.Name, 15) || rpad(v_rec1.JOB_TITLE, 45) || rpad(v_rec1.SALARY, 20) || rpad('# of EMP',15) || rpad(v_rec1.DEPARTMENT_NAME,20) ||rpad(Employee_NAME,15) || rpad(SALARY,15));        

    END LOOP; 
END LOOP; 
END; 

不断收到以下错误。有人请指教。

错误报告 -

ORA-06550: line 29, column 204: 
PLS-00201: identifier 'EMPLOYEE_NAME' must be declared 
ORA-06550: line 29, column 5: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+0

什么是你的这个非常明确的错误消息,解释'标识“EMPLOYEE_NAME”必须declared'? –

+0

确认表中的列名并使用IS null而不是= null,因为null不能与任何值进行比较。 – Shahzaib

回答

0

有你需要同时编码到understamd一些基本的东西。 "NULL"不能比较任何事情。我们需要使用IS NULL/IS NOT NULL来检查NULL条件。该代码似乎确定按基本语法,但需要确认的列名错误表明没有在列不匹配identifier.Also避免使用""RESERVED关键字在code.Hope下面摘录帮助。

DECLARE 
BEGIN 
    FOR v_rec IN 
    (SELECT MAX(TotalEmployee) AS TotalEmployee1 , 
    Week_Day 
    FROM 
    (SELECT COUNT(*)   AS TotalEmployee, 
     TO_CHAR(hire_date, 'Day') AS Week_Day 
    FROM Employee 
    GROUP BY TO_CHAR(hire_date, 'Day') 
    ORDER BY TotalEmployee DESC 
    ) Table1 
    GROUP BY Week_Day 
) 
    LOOP 
    dbms_output.put_line('*********************************************************************************************************************************************************************************************************'); 
    dbms_output.put_line(v_rec.Week_Day || (v_rec.TotalEmployee1)||' employee'); 
    dbms_output.put_line(rpad('Hire_Date', 15) || rpad('Name', 15) || rpad('JOB TITLE', 45) || rpad('SALARY', 20) || rpad('# of EMP',15) || rpad('DEPARTMENT NAME',20) ||rpad('MANAGER NAME',15) || rpad('MANAGER SALARY',15)); 
    FOR v_rec1 IN 
    (SELECT HIRE_DATE , 
     EMPLOYEE_NAME AS EMP_NAME , 
     JOB_TITLE , 
     CASE 
     WHEN SALARY IS NULL 
     THEN '-------' 
     ELSE TO_CHAR(SALARY, '$9,999.99') 
     END AS "SALARY" , 
     CASE 
     WHEN DEPARTMENT_NAME IS NULL 
     THEN '-------' 
     ELSE DEPARTMENT_NAME 
     END AS DEPARTMENT_NAME, 
     CASE 
     WHEN Employee_NAME IS NULL 
     THEN '-------' 
     ELSE Employee_NAME 
     END AS MANAGERNAME, 
     CASE 
     WHEN SALARY IS NULL 
     THEN '-------' 
     ELSE TO_CHAR(SALARY, '$9,999.99') 
     END AS MANAGERSALARY 
    FROM Employee, 
     department 
    WHERE TO_CHAR(hire_date, 'Day') IN (v_rec.Week_Day) 
    AND employee.DEPARTMENT_ID  = department.DEPARTMENT_ID 
    ) 
    LOOP 
     dbms_output.put_line(rpad(v_rec1.HIRE_DATE, 15) || rpad(v_rec1.EMP_NAME, 15) || rpad(v_rec1.JOB_TITLE, 45) || rpad(v_rec1.SALARY, 20) || rpad('# of EMP',15) || rpad(v_rec1.DEPARTMENT_NAME,20) ||rpad(Employee_NAME,15) || rpad(SALARY,15)); 
    END LOOP; 
    END LOOP; 
END; 
1

错误在下面的行中,除了employee_name和salary之外的所有内容,您都正确指定了v_rec1。对于这两个你不这样做,假设你没有在其他地方声明这些变量,那么这会给你指定的错误。

dbms_output.put_line(rpad(v_rec1.HIRE_DATE, 15) || rpad(v_rec1.Name, 15) || rpad(v_rec1.JOB_TITLE, 45) || rpad(v_rec1.SALARY, 20) || rpad('# of EMP',15) || rpad(v_rec1.DEPARTMENT_NAME,20) ||rpad(Employee_NAME,15) || rpad(SALARY,15)); 
0

错误信息给你一个行号,这样你就知道哪一行引起该问题。第29行是长DBMS_OUTPUT调用,从dbms_output.put_line(rpad(v_rec1.HIRE_DATE, 15)开始。

错误消息也给你一个数列。列等同于字符(从所有东西都是固定大小的字体开始)。列204点这个元素:

rpad(Employee_NAME,15) 
    ^
     204 

编译器的工作原理由左到右,所以你知道它很乐意这么做,是这段代码的左边的一切。代码的比较显示“好”标识符全部以光标名称作为前缀,例如, rpad(v_rec1.HIRE_DATE, 15)。 PL/SQL需要在正确的名称空间中标识所有引用(默认为DECLARE部分)。因此,解决办法是预先设置Employee_NAME - 和salary - 用光标名称引用:rpad(v_rec1.Employee_NAME,15)

PL/SQL的错误并不总是这样明确:由缺少逗号或括号可以有线条和/或与实际错字很长的路要走列数语法错误。但它们不只是随机数字,它们包含诊断我们错误的有用线索。它有助于获得一个体面的程序编辑器,它在源代码视图中显示行号和列号。


顺便说一句,这永远不会是真的:Employee_NAME = null。 NULL是特殊的,为了测试它,你需要IS运算符:Employee_NAME is null