【问题标题】:Errors creating Oracle package body创建 Oracle 包体时出错
【发布时间】:2014-10-15 23:43:56
【问题描述】:

我的包中有以下主体,用于在 HR 模式中执行一些 CRUD 操作:

CREATE SEQUENCE emp_sequence;

CREATE OR REPLACE PACKAGE BODY employee_crud AS

   PROCEDURE create_emp(p_last_name IN employees.last_name%type, p_first_name IN    employees.first_name%type, 
                             p_email IN employees.email%type, p_hire_date IN  employees.hire_date%type, 
                             p_job_id IN employees.job_id%type) AS


   BEGIN
     SELECT emp_sequence.NEXTVAL INTO id FROM dual;
     INSERT INTO employees(last_name, first_name, email, hire_date, job_id)
     VALUES (emp_seq.nextval, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
   EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN
     dbms_output.put_line('error');
   END create_emp;


   PROCEDURE erase_emp(p_employee_id IN employees.employee_id%type) AS
   BEGIN
     DELETE FROM employees
     WHERE employee_id = p_employee_id;
   EXCEPTION
   WHEN  NO_DATA_FOUND THEN
     dbms_output.put_line('Error');
   END erase_emp;


   PROCEDURE upd_emp(p_employee_id IN employees.employee_id%type, p_salary IN  employees.salary%type, 
                                  p_email IN employees.email%type, p_department_id IN  employees.department_id%type) AS
   BEGIN
     UPDATE employees
     SET  employee_id = p_employee_id,
          salary = p_salary,
          email = p_email,
          department_id = p_department_id
     WHERE employee_id = p_employee_id;
   EXCEPTION
   WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('error');
   END upd_emp;


   PROCEDURE read_emp(p_employee_id IN employees.employee_id%type, p_last_name OUT  employees.last_name%type, 
                                 p_first_name OUT employees.first_name%type, p_email OUT  employees.email%type, 
                                 p_hire_date OUT  employees.hire_date%type, p_job_id OUT  employees.job_id%type, 
                                 p_salary OUT employees.salary%type) AS
   BEGIN
     SELECT employee_id, last_name, first_name, email, hire_date, job_id, salary
     INTO  p_last_name, p_first_name, p_email, p_hire_date, p_job_id, p_salary
     FROM EMPLOYEES
     WHERE employee_id = p_employee_id;
   EXCEPTION
   WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('Error');
   END read_emp;

END employee_crud;
/

创建规范后(这是正确的),我创建了一个序列来帮助添加员工。但是编译包体,显示如下错误:

LINE/COL ERROR
-------- ----------------------------------------------------
10/5     PL/SQL: SQL Statement ignored
10/38    PLS-00201: 'ID' must be declared
10/41    PL/SQL: ORA-00904: : identifier is not valid
11/5     PL/SQL: SQL Statement ignored
11/17    PL/SQL: ORA-00913: too many values
49/5     PL/SQL: SQL Statement ignored
51/5     PL/SQL: ORA-00947: insufficient values

我应该怎么做才能纠正这些错误?我从我的代码中更改了一些名称,因为这是一项任务,并且我在尝试不出错时遇到了麻烦。

【问题讨论】:

  • 你还没有声明一个名为ID的局部变量? “值过多”和“值不足”错误似乎不言自明 - 只需计算这些语句每个部分中的列/值的数量即可。
  • What should I do to correct these errors? 最佳答案是学习基础知识。有很多错误。他们中的大多数都会为您提供阅读消息本身的线索。万事如意!
  • @MaheswaranRavisankar,AlexPoole,我知道我有一些以前没有看到的小错误(我是新手>

标签: oracle stored-procedures plsql


【解决方案1】:
10/38    PLS-00201: 'ID' must be declared

您正在将数据选择到尚未声明的局部变量 ID 中。如果你想声明一个局部变量,你可以在ASBEGIN之间的声明部分这样做

   PROCEDURE create_emp(p_last_name IN employees.last_name%type, 
                        p_first_name IN    employees.first_name%type, 
                        p_email IN employees.email%type, 
                        p_hire_date IN  employees.hire_date%type, 
                        p_job_id IN employees.job_id%type) 
   AS
     id integer;
   BEGIN
     SELECT emp_sequence.NEXTVAL INTO id FROM dual;

如果你打算这样做,你会想在你的INSERT 语句中使用局部变量id,而不是直接调用emp_sequence.nextval。不过,就个人而言,我会摆脱局部变量,摆脱最初的SELECT,并在您的INSERT 语句中调用emp_sequence.nextval

11/17    PL/SQL: ORA-00913: too many values

不过,无论您如何操作,您都需要 INSERT 中的列数与您指定的 VALUES 数相匹配。

   PROCEDURE create_emp(p_last_name IN employees.last_name%type, 
                        p_first_name IN    employees.first_name%type, 
                        p_email IN employees.email%type, 
                        p_hire_date IN  employees.hire_date%type, 
                        p_job_id IN employees.job_id%type) 
   AS
     id integer;
   BEGIN
     SELECT emp_sequence.NEXTVAL INTO id FROM dual;
     INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id)
       VALUES (id, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
  END create_emp;

或者如果你想直接调用序列

   PROCEDURE create_emp(p_last_name IN employees.last_name%type, 
                        p_first_name IN    employees.first_name%type, 
                        p_email IN employees.email%type, 
                        p_hire_date IN  employees.hire_date%type, 
                        p_job_id IN employees.job_id%type) 
   AS
   BEGIN
     INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id)
       VALUES ( emp_sequence.NEXTVAL, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
  END create_emp;

同样,对于您的下一个错误,您提取的变量数应该与您选择的列数相匹配

51/5     PL/SQL: ORA-00947: insufficient values

在您的 read_emp 中,您选择了 7 个东西并尝试将它们放入 6 个变量中。假设您不想返回employee_id,请不要费心选择它。

   PROCEDURE read_emp(p_employee_id IN employees.employee_id%type, 
                      p_last_name OUT  employees.last_name%type, 
                      p_first_name OUT employees.first_name%type, 
                      p_email OUT  employees.email%type, 
                      p_hire_date OUT  employees.hire_date%type, 
                      p_job_id OUT  employees.job_id%type, 
                      p_salary OUT employees.salary%type) 
   AS
   BEGIN
     SELECT last_name, first_name, email, hire_date, job_id, salary
     INTO  p_last_name, p_first_name, p_email, p_hire_date, p_job_id, p_salary
     FROM EMPLOYEES
     WHERE employee_id = p_employee_id;
   END read_emp;

虽然您可以像这样编写read_emp 过程,但创建一个返回employees%rowtype 记录的函数通常更有意义。

应删除您的例外条款。充其量,他们正在丢弃错误堆栈,该堆栈会告诉人们失败的原因和位置。在最坏的情况下,他们隐藏了错误(你永远不应该假设任何人都会看到你写给 dbms_output 的任何内容)并导致调用代码相信某些操作成功而没有成功。

【讨论】:

  • 哇,我的小错误太多了,我很惭愧!非常感谢您对我的帮助和您的建议。我放了例外,因为我正在学习使用它:)
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多