【问题标题】:Wrong number or types of arguments when executing a procedure执行过程时参数的数量或类型错误
【发布时间】:2021-12-11 04:52:42
【问题描述】:

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

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;
    /

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

【问题讨论】:

  • 您需要编辑问题并显示每个参数的类型。
  • 看起来你有 6 个必需参数,你只传递了 5 个。
  • 但是 Andrew 是对的,该过程需要六个参数,最后一个参数是 p_saldo,但您调用它时使用了五个以日期 (p_datum) 结尾的参数。因此,DBMS 正确地抱怨您使用错误数量的参数调用过程。
  • 那又怎样?如果您声明了 6 个参数,则必须传递 6 个参数(因为它们都没有 DEFAULT 值)。
  • 请提出一个新问题。

标签: sql oracle plsql


【解决方案1】:

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

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

您的查询是有效的:

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;

注意:don't put COMMIT statements in procedures; COMMIT 在调用过程的事务中,因为它允许您在单个事务中将多个过程链接在一起,并将ROLLBACK 语句作为一个组应用于它们。


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

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

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

【讨论】:

  • 非常感谢您的帮助!!!现在我得到了工作的程序!但如果没有打印的语句,导致 Saldo(balance) 不是存款表中的列。所以我应该从 konto 表中获取 saldo 的值,并将其添加到新的 belopp/balance 中,并将其打印为帐户中的新余额!
  • 我编辑了问题并添加了您的解决方案。
猜你喜欢
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多