Oracle存储过程执行报错:参数数量不匹配及字符转数值转换错误求助
问题原因分析
第一版参数数量错误原因
- 存储过程定义了6个输入参数,执行时仅传入5个参数,参数数量不匹配导致报错。
- 第一版的插入逻辑存在严重业务错误:单独向每个表插入单个字段,会产生大量字段为空的无效记录,且会向存款表(insättning)插入两条无关联的独立记录,不符合存款业务的逻辑。
第二版字符转数字错误原因
- Oracle中字符串拼接符
||的优先级高于算术运算符+,执行'Saldot är nu = ' || p_belopp + v_saldo时,会先将字符串和p_belopp拼接为字符串,再尝试和数字类型的v_saldo做加法运算,触发类型转换失败报错。 - 额外隐藏问题:查询余额的SQL没有加
where knr = p_knr的过滤条件,如果账户表(konto)有多条记录,会触发too many rows报错;且存款后没有更新对应账户的余额,打印的余额不会真实生效。
修复后的存储过程代码
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 where knr = p_knr for update; -- 插入一条完整的存款记录 insert into insättning( radnr, pnr, knr, belopp, datum ) values ( p_radnr, p_pnr, p_knr, p_belopp, SYSDATE ); -- 更新对应账户的实际余额 update konto set saldo = saldo + p_belopp where knr = p_knr; -- 用括号提升算术运算优先级,避免类型转换错误 dbms_output.put_line('Saldot är nu = ' || (p_belopp + v_saldo)); commit; end; /
执行方式
-- 修复后存储过程仅需4个入参,按顺序传入对应参数即可 EXECUTE do_insättning (radnr_seq.NEXTVAL, '540126-1111', 123, 200);
内容的提问来源于stack exchange,提问作者S.J.
相关产品推荐
相关产品推荐

