[英]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_NAME
和salary
引用之前添加光標名稱: 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.