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 Oracle Package 错误
ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束