簡體   English   中英

Oracle中的PL / SQL錯誤

[英]PL/SQL in Oracle Error

不知道我在做什么錯。 我試過搬東西,但沒有運氣。 繼續收到以下錯誤。 有人,請指教。

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:

錯誤在下一行,對於除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 )); 

編碼時需要了解一些基本知識。 "NULL"不能與任何東西進行比較。 我們需要使用IS NULL/IS NOT NULL來檢查NULL條件。 按照基本語法,代碼看起來還可以,但是需要確認列名稱,因為錯誤提示列標識符不匹配。也請避免在代碼中使用""RESERVED關鍵字。希望以下代碼段有幫助。

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;

該錯誤消息為您提供了一個行號,因此您知道哪個行會導致問題。 第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_NAMEsalary引用之前添加光標名稱: rpad( v_rec1.Employee_NAME,15 )

PL / SQL錯誤並不總是那么清楚:由於缺少逗號或方括號引起的語法錯誤可能具有行號和/或列號,與實際的錯別字相距甚遠。 但是它們不僅是隨機數,還包含了診斷我們的錯誤的有用線索。 擁有一個體面的程序編輯器會很有幫助,該編輯器在源代碼視圖中顯示行號和列號。


順便說一句,這永遠不會是真的: Employee_NAME = null NULL是特殊的,要測試它,您需要IS運算符: Employee_NAME is null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM