【问题标题】:PLSQL Procedure to insert employee: ORA-00984插入员工的 PLSQL 过程:ORA-00984
【发布时间】:2021-08-23 21:26:54
【问题描述】:

我正在尝试使用过程将员工数据从 hr 数据库插入到员工表中。我收到这些错误:

19/5 PL/SQL: SQL Statement ignored
20/72 PL/SQL: ORA-00984: column not allowed here

当我执行这段代码时:

CREATE OR REPLACE PROCEDURE proc_add_new_emp(p_employee_id         IN NUMBER,
                                         p_employee_first_name     IN VARCHAR2,
                                         p_employee_last_name      IN VARCHAR2,
                                         p_employee_email          IN VARCHAR2,
                                         p_employee_phone_number   IN VARCHAR2,
                                         p_employee_hire_date      IN DATE,
                                         p_employee_job_id         IN VARCHAR2,
                                         p_employee_salary         IN NUMBER,
                                         p_employee_commission_pct IN NUMBER,
                                         p_employee_manager_id     IN VARCHAR2,
                                         p_employee_department_id  IN VARCHAR2) IS
BEGIN    
INSERT INTO employees (employee_id, employee_first_name, employee_last_name, emp_email, employee_phone_number, employee_hire_date, employee_salary, employee_commission_pct, employee_manager_id, employee_department_id) 
VALUES(p_employee_id, p_employee_first_name, p_employee_last_name, p_emp_email, p_employee_phone_number, p_employee_hire_date, p_employee_salary, p_employee_commission_pct, p_employee_manager_id, p_employee_department_id);          
END;
/

【问题讨论】:

  • 错误标识第 19 行和第 20 行。您显示的代码只有 16 行。
  • 错误的参数名称是usd。只需在VALUES 列表中将p_emp_email 替换为p_employee_email。似乎没有其他错误,大概是 clumn 名称是真的。
  • 我已经更新了 p_employee_email 参数,我收到另一个错误,说 14/204 PL/SQL: ORA-00904: "EMPLOYEE_DEPARTMENT_ID": invalid identifier
  • 那么,表中应该没有名为employee_department_id的列

标签: oracle plsql oracle11g sql-insert


【解决方案1】:

这是错误的原因:

CREATE OR REPLACE PROCEDURE proc_add_new_emp(
    p_employee_id IN NUMBER, 
    p_employee_first_name IN VARCHAR2,
    p_employee_last_name IN VARCHAR2,
    p_employee_email IN VARCHAR2,         --> this  
  
INSERT INTO employees 
  (employee_id, 
   employee_first_name, 
   employee_last_name, 
   emp_email, 
   ...)
VALUES
  (p_employee_id, 
   p_employee_first_name, 
   p_employee_last_name, 
   p_emp_email,                         --> and this

如果参数名称是P_EMPLOYEE_EMAIL,那么你必须在INSERT语句中使用it,而不是P_EMP_MAIL

【讨论】:

  • 我已经更新了 p_employee 参数,但出现了新错误。它说 14/204 PL/SQL: ORA-00904: "EMPLOYEE_DEPARTMENT_ID": invalid identifier
  • 所以不要使用目标表中不存在的列名。由于您没有发布表格的描述,我无法提供更好的帮助。
  • 这是表描述 Name Null?类型 -------------- -------- ------------ EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4 )
  • 列名似乎是 DEPARTMENT_ID。名称列在表描述输出的 - who'd guess - NAME 列中。
  • 看起来程序中的列名在表中不存在,识别此类错误的一种方法是运行存储过程中使用的SQL,在SQL plus / Tpad /SQL developer并找到表中不存在的列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多