我遇到的问题是包体,我试图在第二个程序的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 IS
- 程序chk_hiredate
- (p_date IN employees.hire_date%TYPE)IS BEGIN
醇>
答案 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.