PL / SQL Oracle包错误

时间:2015-04-27 00:05:24

标签: sql plsql oracle11g packages procedure

我遇到的问题是包体,我试图在第二个程序的select语句中多次更改我的代码并且我无法解决这个问题。

有没有人有任何见解?我的所有代码和错误都在下面。

CREATE OR REPLACE PACKAGE check_emp_pkg IS
    g_max_length_of_service CONSTANT NUMBER := 100;

PROCEDURE chk_hiredate
    (p_date IN employees.hire_date%TYPE);

PROCEDURE chk_dept_mgr
    (p_empid IN employees.employee_id%TYPE
     , p_mgr IN employees.manager_id%TYPE);

END check_emp_pkg;
/

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
  IF SELECT employee_id, manager_id INTO p_empid, p_mgr
   FROM employees
    WHERE manager_id = p_mgr THEN DBMS_OUTPUT.PUT_LINE('SUCCESS');
  ELSE NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
 END IF;
 END chk_dept_mgr;

END check_emp_pkg;
/
  

第15行出错:PLS-00103:遇到符号“CHECK_EMP_PKG”   期待以下之一时:;

     
      
  1. 创建或替换包裹身体check_emp_pkg IS
  2.   
  3. 程序chk_hiredate
  4.   
  5. (p_date IN employees.hire_date%TYPE)IS BEGIN
  6.   

1 个答案:

答案 0 :(得分:0)

我创建了一个示例表,并说明了如何使用您的过程。编码中存在很多错误。

1。)您使用p_empid作为输入变量,不能再使用它来存储select子句中的值。 解决方案:使用另一个变量来分配值。

2。)在IF子句中使用select。 解决方案:将Select into用于变量并使用它在if语句中进行验证。

3.)更好地利用NO_DATA_FOUND作为例外。

这是一个示例,创建了一个仅包含2个字段的员工表

create table employees (employee_id int, manager_id int);
INSERT INTO employees (employee_id,manager_id) values (123,456);

SQL> SELECT * FROM EMPLOYEES;

EMPLOYEE_ID MANAGER_ID
----------- ----------
        123        456

SQL>

SQL>     create or replace  PROCEDURE chk_dept_mgr
  2       (p_empid IN employees.employee_id%TYPE, p_mgr IN employees.manager_id%TYPE) IS
  3       l_empid employees.employee_id%TYPE:=p_empid ;
  4       l_mgr employees.manager_id%TYPE:=p_mgr;
  5       emp_count int;
  6       BEGIN
  7
  8         SELECT count(1) into emp_count
  9          FROM employees where manager_id=l_mgr ;
 10          IF (emp_count>0)
 11           THEN
 12          DBMS_OUTPUT.PUT_LINE('SUCCESS');
 13          ELSE
 14          DBMS_OUTPUT.PUT_LINE('NO employee found');
 15         END IF;
 16        END chk_dept_mgr;
 17
 18       /

Procedure created.

SQL>  exec chk_dept_mgr(123,456);
SUCCESS

PL/SQL procedure successfully completed.

SQL>  exec chk_dept_mgr(123,457);
NO employee found

PL/SQL procedure successfully completed.