PL/SQL Oracle 包错误

Posted

技术标签:

【中文标题】PL/SQL Oracle 包错误【英文标题】:PL/SQL Oracle Package error 【发布时间】:2015-04-27 00:05:24 【问题描述】:

我遇到的问题是包体,我曾多次尝试更改第二个过程的 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” 预期以下情况之一时:;

    创建或替换包体 check_emp_pkg 是 过程 chk_hiredate (p_date IN employees.hire_date%TYPE) 开始

【问题讨论】:

你的包体语法真的很乱。你不能做,“如果选择..”你需要做一个选择,然后检查任何条件。推荐阅读一些pl/sql教程。 【参考方案1】:

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

1.) 您正在使用 p_empid 作为输入变量,您不能再次使用它来存储来自 select 子句的值。 解决方案:使用另一个变量来赋值。

2.) 在 IF 子句中使用 select 。 解决方案:使用 Select into , 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.

【讨论】:

【参考方案2】:

这就是我的包裹体的外观。谢谢你的帮助。

    CREATE OR REPLACE PACKAGE BODY check_emp_pkg IS
PROCEDURE chk_hiredate
    (p_date IN employees.hire_date%TYPE) 
IS 
  g_max_length_of_service CONSTANT NUMBER := 100;
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 
v_empid employees.employee_id%TYPE;
v_mgr   employees.manager_id%TYPE;
BEGIN
  SELECT employee_id, manager_id INTO v_empid, v_mgr
   FROM employees
   WHERE employee_id = p_empid;
  IF p_mgr = v_mgr THEN DBMS_OUTPUT.PUT_LINE('SUCCESS');
   ELSE DBMS_OUTPUT.PUT_LINE('THE NUMBERS ENTERED DO NOT MATCH AN EMPLOYEE AND MANAGER COMBINATION');
 END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
 END chk_dept_mgr;
END check_emp_pkg;

【讨论】:

以上是关于PL/SQL Oracle 包错误的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 包编译错误:PLS-00323

执行函数时 PL/SQL Oracle Package 错误

PL/SQL 编译失败,没有错误消息

并行执行 oracle PL/SQL [重复]

ORACLE PL/SQL编程总结

ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束