执行包时出错

时间:2013-11-29 07:06:05

标签: oracle plsql syntax-error

表格结构:

Name       Null Type         
---------- ---- ------------ 
DPT_NO          NUMBER       
SALARY          NUMBER(10)   
PERIOD          VARCHAR2(10) 
START_DATE      DATE         
END_DATE        DATE     

包装:

CREATE OR REPLACE package body salary_sal AS
   PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE) IS
   c_sal salary.salary%TYPE;
   BEGIN
      SELECT salary INTO c_sal
      FROM salary
      WHERE c_dpt_no= 108;
      dbms_output.put_line('Salary: '|| c_sal);
   END find_sal;
END salary_sal;

执行上面时我遇到了错误

Error: PL/SQL: Compilation unit analysis terminated
Error(1,14): PLS-00201: identifier 'SALARY_SAL' must be declared
Error(1,14): PLS-00304: cannot compile body of 'SALARY_SAL' without its specification.

3 个答案:

答案 0 :(得分:4)

你错过了包裹的声明。想法是分离包的声明(“标题”,如果你愿意的话),所以其他包/过程/函数可以从主体(实现)编译它。

在你的情况下,你需要像:

CREATE OR REPLACE package salary_sal AS
   PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE);
END salary_sal;

现在,一旦声明了包,就可以创建它的主体:

CREATE OR REPLACE package body salary_sal AS
   PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE) IS
   c_sal salary.salary%TYPE;
   BEGIN
      SELECT salary INTO c_sal
      FROM salary
      WHERE c_dpt_no= 108;
      dbms_output.put_line('Salary: '|| c_sal);
   END find_sal;
END salary_sal;

答案 1 :(得分:0)

该包需要一个规范(即一个单独的接口定义),如错误消息所示。你必须在包体的定义之前添加一些东西(即它的实现):

CREATE OR REPLACE package salary_sal AS
   PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE);
END salary_sal;
/

答案 2 :(得分:0)

您需要创建包规范,然后才能创建包体。

您需要执行包,即在包中执行存储过程,函数等。