Oracle:第 28 行错误:PLS-00103:遇到符号“文件结束”

Oracle : Error at line 28: PLS-00103: Encountered the symbol “end-of-file”

我有一个问题,我想不通。它显示....

Error at line 28: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

begin end function pragma procedure

  1. CREATE OR REPLACE PACKAGE BODY check_emp_pkg
  2. IS
  3. PROCEDURE chk_hiredate
  4. (p_date IN employees.hire_date%TYPE)

下面是我的代码:

CREATE OR REPLACE PACKAGE BODY check_emp_pkg 
IS 
  PROCEDURE chk_hiredate 
    (p_date IN employees.hire_date%TYPE) 
    IS BEGIN 
      IF MONTHS_BETWEEN(SYSDATE, p_date) > g_max_length_of_service * 12 THEN 
        RAISE_APPLICATION_ERROR(-20200, 'Invalid Hiredate'); 
      END IF; 
  END chk_hiredate; 
  PROCEDURE chk_dept_mgr 
    (p_empid IN employees.employee_id%TYPE, 
    p_mgr IN employees.manager_id%TYPE) 
    IS BEGIN
      DECLARE
        v_mgr_id departments.manager_id%TYPE;
      BEGIN
       SELECT manager_id INTO v_mgr_id
       FROM departments;
       IF p_mgr = v_mgr_id THEN
         DBMS_OUTPUT.PUT_LINE('Success');
       ELSE
         RAISE_APPLICATION_ERROR(-20200, 'Manager ID is not a match');
       END IF;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('Manager does not exist');
  END chk_dept_mgr;
END check_emp_pkg;

我不知道为什么会收到错误消息!

你在第二个过程中多了一个begindeclare。这部分:

  PROCEDURE chk_dept_mgr 
    (p_empid IN employees.employee_id%TYPE, 
    p_mgr IN employees.manager_id%TYPE) 
    IS BEGIN
      DECLARE
        v_mgr_id departments.manager_id%TYPE;
      BEGIN
       SELECT manager_id INTO v_mgr_id
       ...

应该是:

  PROCEDURE chk_dept_mgr 
    (p_empid IN employees.employee_id%TYPE, 
    p_mgr IN employees.manager_id%TYPE) 
    IS
      v_mgr_id departments.manager_id%TYPE;
    BEGIN
     SELECT manager_id INTO v_mgr_id
     ...

你可以从缩进中看出你的块没有对齐。当您并不真正需要一个内部块时,您已经启动了一个内部块,并且没有正确结束它。您可以在 end if 之后添加一个 end,但该内部块仍然不会添加任何有用的东西。