首页 > 解决方案 > 执行过程时参数的数量或类型错误

问题描述

希望有人可以帮助我,我一直收到这个错误,但我不确定我做错了什么。我创建了这个程序,它将以下信息插入到银行的“存款”表中:序列号、个人号码、帐号、存款金额和日期)。该程序还应该在新存款后打印出总余额。

create or replace procedure do_insättning (
p_radnr kontoägare.radnr NUMBER(9),
p_pnr  bankkund.pnr VARCHAR(11), 
p_knr  konto.knr NUMBER(8), 
p_belopp  insättning.belopp NUMBER(10,2),
p_datum insättning.datum DATE,
p_saldo konto.saldo NUMBER(10,2))
is
begin
insert into kontoägare(radnr)
values(p_radnr);
insert into bankkund (pnr)
values(p_pnr);
insert into konto(knr)
values(p_knr);
insert into insättning(belopp)
values(p_belopp);
insert into insättning(datum)
values(sysdate);
insert into konto(saldo)
values(p_saldo);
commit;

dbms_output.put_line('Saldot är nu = ' || p_belopp + p_saldo);
end;
/

当我以这种方式执行它时,我得到错误数量的参数错误:

EXECUTE do_insättning (radnr_seq.NEXTVAL, '540126-1111', 123, 200, sysdate);

编辑:

所以我编辑了查询并尝试将 saldo 添加为能够打印语句的变量,但这也不起作用。

 create or replace procedure do_insättning (
      p_radnr  kontoägare.radnr%TYPE,
      p_pnr    bankkund.pnr%TYPE, 
      p_knr    konto.knr%TYPE, 
      p_belopp insättning.belopp%TYPE
    )
    is
    v_saldo konto.saldo%type;
    begin
    select saldo 
    into v_saldo
    from konto;
      insert into insättning(
        radnr,   pnr,   knr,   belopp,   datum
      ) values (
        p_radnr, p_pnr, p_knr, p_belopp, SYSDATE
      );
      dbms_output.put_line('Saldot är nu = ' || p_belopp + v_saldo);
    end;
    /

我收到“数字或值错误:字符到数字的转换错误”。

标签: sqloracleplsql

解决方案


我创建了这个程序,将以下信息插入银行的“存款”表中

不,它不会将数据插入到一个表中;它将它插入到四个不同的表(kontoägare、和)中bankkund,并在每个表和表中创建 2 行。kontoinsättningkontoinsättning

您的查询实际上是:

create procedure do_insättning (
  p_radnr  kontoägare.radnr%TYPE,
  p_pnr    bankkund.pnr%TYPE, 
  p_knr    konto.knr%TYPE, 
  p_belopp insättning.belopp%TYPE,
  p_saldo  konto.saldo%TYPE
)
is
begin
  insert into kontoägare(radnr) values (p_radnr);
  insert into bankkund (pnr) values(p_pnr);
  insert into konto(knr, saldo) values(p_knr, NULL);
  insert into konto(knr, saldo) values(NULL, p_saldo);
  insert into insättning(belopp, datum) values(p_belopp, NULL);
  insert into insättning(belopp, datum) values(NULL, SYSDATE);
  COMMIT;
  dbms_output.put_line('Saldot är nu = ' || p_belopp + p_saldo);
end;
/

如果要将单行插入单个表(称为deposits),则只需要一条INSERT语句:

create procedure do_insättning (
  p_radnr  kontoägare.radnr%TYPE,
  p_pnr    bankkund.pnr%TYPE, 
  p_knr    konto.knr%TYPE, 
  p_belopp insättning.belopp%TYPE,
  p_saldo  konto.saldo%TYPE
)
is
begin
  insert into deposits(
    radnr,   pnr,   knr,   saldo,   belopp,   datum
  ) values (
    p_radnr, p_pnr, p_knr, p_saldo, p_belopp, SYSDATE
  );

  dbms_output.put_line('Saldot är nu = ' || p_belopp + p_saldo);
end;
/

然后您可以使用以下方法调用它:

EXECUTE do_insättning(
  p_radnr  => radnr_seq.NEXTVAL,
  p_pnr    => '540126-1111',
  p_knr    => 123,
  p_belopp => 200,
  p_saldo  => 42
);
COMMIT;

注意:不要把COMMIT语句放在过程中COMMIT在调用该过程的事务中,因为它允许您在单个事务中将多个过程链接在一起,并将ROLLBACK语句作为一个组应用于它们。


当我以这种方式执行它时,我得到错误数量的参数错误:

EXECUTE do_insättning (radnr_seq.NEXTVAL, '540126-1111', 123, 200, sysdate);

那是因为你的过程需要 6 个参数,而你只提供了 5 个。


推荐阅读