ORACLE PL/SQL存储过程插入和执行错误

ORACLE PL/SQL存储过程插入和执行错误,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,我试图创建一个存储过程,将值插入EMPLOYEE表。 当我尝试使用值执行该过程时,它会抛出一个错误。请你帮忙好吗?先谢谢你 存储过程---- 执行命令--- 错误消息---- 桌子----- 当然,您应该在大括号内的表名之后、values关键字之前列出所有列。并且必须按照插入值的顺序匹配列 但是,传递给过程的值的数量与声明的参数的数量不同 而且 以下方面存在问题: 员工的开始日期。开始日期%TYPE 员工中的结束日期。结束日期%类型 2015/02/022017/02/02 因此,2015/

我试图创建一个存储过程,将值插入EMPLOYEE表。 当我尝试使用值执行该过程时,它会抛出一个错误。请你帮忙好吗?先谢谢你

存储过程----

执行命令---

错误消息----

桌子-----

  • 当然,您应该在大括号内的表名之后、values关键字之前列出所有列。并且必须按照插入值的顺序匹配列

  • 但是,传递给过程的值的数量与声明的参数的数量不同

  • 而且

以下方面存在问题:

员工的开始日期。开始日期%TYPE

员工中的结束日期。结束日期%类型

2015/02/022017/02/02


因此,
2015/02/02
2017/02/02
不是日期。你应该通过约会

要插入日期值,请始终使用格式正确的日期

使用将参数值传递到\u DATE

EXECUTE create_emp(58, 'John', 'Testy', 'Here Lane', 'Himble', 'UK', 'Skipper', 
TO_DATE('2015/02/02','YYYY/MM/DD'), TO_DATE('2017/02/02','YYYY/MM/DD')); 
错误消息显示:

PLS-00306:调用“CREATE_EMP”时参数的数量或类型错误

我已将您给定的参数映射到方法所需的参数:

empid = 58
firstname = 'John'
surname = 'Testy'
address = 'Here Lane'
city = 'Himble'
county
postcode
country = 'UK'
jobtitle = 'Skipper'
startdate = 2015/02/02
enddate = 2017/02/02
因为没有参数具有默认值,所以正如错误消息所说,您只需在调用中错过2个参数


编辑:我找到了解决方案:

在匿名块中执行
CREATE_EMP
。这对我起了作用:

begin
  CREATE_EMP(58, 'John', 'Testy', 'Here Lane', 'Himble', 'Abc','1225', 'UK', 'Skipper', TO_DATE('2015/02/02','YYYY/MM/DD'), TO_DATE('2017/02/02','YYYY/MM/DD'));
end;
这是数据库创建和
CREATE\u EMP
定义:

CREATE TABLE EMPLOYEE ( 
  EMP_ID  NUMBER(8,0),
  FIRST_NAME  VARCHAR2(30),
  SURNAME VARCHAR2(30),
  ADDRESS VARCHAR2(50),
  CITY    VARCHAR2(30),
  COUNTY_STATE    VARCHAR2(30),
  POSTCODE_ZIP    VARCHAR2(10),
  COUNTRY VARCHAR2(5),
  JOB_TITLE   VARCHAR2(20),
  START_DATE  DATE,
  END_DATE    DATE
);

//

create or replace PROCEDURE CREATE_EMP
(
  empid IN EMPLOYEE.EMP_ID%TYPE,
  firstname IN EMPLOYEE.FIRST_NAME%TYPE,
  surname IN EMPLOYEE.SURNAME%TYPE,
  address IN EMPLOYEE.ADDRESS%TYPE,
  city IN EMPLOYEE.CITY%TYPE,
  county IN EMPLOYEE.COUNTY_STATE%TYPE,
  postcode IN EMPLOYEE.POSTCODE_ZIP%TYPE,
  country IN EMPLOYEE.COUNTRY%TYPE,
  jobtitle IN EMPLOYEE.JOB_TITLE%TYPE,
  startdate IN EMPLOYEE.START_DATE%TYPE,
  enddate IN EMPLOYEE.END_DATE%TYPE)
AS 
BEGIN
  INSERT INTO EMPLOYEE
    (EMP_ID, FIRST_NAME, SURNAME, ADDRESS, CITY, COUNTY_STATE, POSTCODE_ZIP, COUNTRY, JOB_TITLE, START_DATE, END_DATE)
  VALUES
    (empid, firstname, surname, address, city, county, postcode, country, jobtitle, startdate, enddate);
END CREATE_EMP;
  • 传递给过程的参数数量与过程定义中的参数数量不匹配(11!=9)(它们的顺序和数据类型也很重要)
  • 不要像传递一样传递日期数据类型,将它们放在单个qotous中并使用
    to_date
    函数,即:使用
    to_date('2015/02/02','YYYY/MM/DD')
    而不是
    2015/02/02

  • (1) Oracle错误提示Oracle,因此我删除了SQL Server标记。(2) 使用
    insert
    时,列出表名后面的所有列。这不会解决您的问题,但这是一个很好的做法。
    2015/02/02
    2017/02/02
    不是日期。谢谢您的输入,但不幸的是,它没有起作用:(抛出此错误)。错误起始于命令中的第2行-截止日期('2015/02/02','YYYY/MM/DD'),截止日期('2017/02/02','YYYY/MM/DD)错误报告-未知命令“您好,谢谢您的输入,我添加了更多内容,但仍会显示相同的错误消息:/很抱歉,这没用。您能从表中找到列类型吗?我认为Lalit的回答显示了继续寻找修复的好方法,即使他目前的状态没有帮助。我想可能是某种类型的不匹配在第一次查看时并不明显。我已经在正文中添加了它们。:)
    EXECUTE create_emp(58, 'John', 'Testy', 'Here Lane', 'Himble', 'UK', 'Skipper', 
    TO_DATE('2015/02/02','YYYY/MM/DD'), TO_DATE('2017/02/02','YYYY/MM/DD')); 
    
    empid = 58
    firstname = 'John'
    surname = 'Testy'
    address = 'Here Lane'
    city = 'Himble'
    county
    postcode
    country = 'UK'
    jobtitle = 'Skipper'
    startdate = 2015/02/02
    enddate = 2017/02/02
    
    begin
      CREATE_EMP(58, 'John', 'Testy', 'Here Lane', 'Himble', 'Abc','1225', 'UK', 'Skipper', TO_DATE('2015/02/02','YYYY/MM/DD'), TO_DATE('2017/02/02','YYYY/MM/DD'));
    end;
    
    CREATE TABLE EMPLOYEE ( 
      EMP_ID  NUMBER(8,0),
      FIRST_NAME  VARCHAR2(30),
      SURNAME VARCHAR2(30),
      ADDRESS VARCHAR2(50),
      CITY    VARCHAR2(30),
      COUNTY_STATE    VARCHAR2(30),
      POSTCODE_ZIP    VARCHAR2(10),
      COUNTRY VARCHAR2(5),
      JOB_TITLE   VARCHAR2(20),
      START_DATE  DATE,
      END_DATE    DATE
    );
    
    //
    
    create or replace PROCEDURE CREATE_EMP
    (
      empid IN EMPLOYEE.EMP_ID%TYPE,
      firstname IN EMPLOYEE.FIRST_NAME%TYPE,
      surname IN EMPLOYEE.SURNAME%TYPE,
      address IN EMPLOYEE.ADDRESS%TYPE,
      city IN EMPLOYEE.CITY%TYPE,
      county IN EMPLOYEE.COUNTY_STATE%TYPE,
      postcode IN EMPLOYEE.POSTCODE_ZIP%TYPE,
      country IN EMPLOYEE.COUNTRY%TYPE,
      jobtitle IN EMPLOYEE.JOB_TITLE%TYPE,
      startdate IN EMPLOYEE.START_DATE%TYPE,
      enddate IN EMPLOYEE.END_DATE%TYPE)
    AS 
    BEGIN
      INSERT INTO EMPLOYEE
        (EMP_ID, FIRST_NAME, SURNAME, ADDRESS, CITY, COUNTY_STATE, POSTCODE_ZIP, COUNTRY, JOB_TITLE, START_DATE, END_DATE)
      VALUES
        (empid, firstname, surname, address, city, county, postcode, country, jobtitle, startdate, enddate);
    END CREATE_EMP;