我尝试在PL / SQL函数中使用3个局部变量,但是当运行日志显示2个无效时
以下是代码:
create or replace function valor_parcela(p_num_venda number, p_juros number)
return number is
tmp_valor_parcela number(7,2);
f_num_parcelas number(7,2);
f_valor number(7,2);
begin
Select num_parcelas
into :f_num_parcela
from VENDS
where numero=p_num_venda;
Select valor_total
into :f_valor
from VENDS
where numero=p_num_venda;
tmp_valor_parcela := (f_valor/f_num_parcela)*p_juros;
return (tmp_valor_parcela);
end;
答案 0 :(得分:3)
尝试这一点,你将从单个查询中获得num_parcelas和valor_total的值。
CREATE OR REPLACE
FUNCTION valor_parcela(
p_num_venda NUMBER,
p_juros NUMBER)
RETURN NUMBER
IS
tmp_valor_parcela NUMBER(7,2);
f_num_parcelas NUMBER(7,2);
f_valor NUMBER(7,2);
BEGIN
SELECT num_parcelas, valor_total
INTO f_num_parcela, f_valor
FROM vends
WHERE numero = p_num_venda;
tmp_valor_parcela := (f_valor/f_num_parcela)*p_juros;
RETURN (tmp_valor_parcela);
END;
/
答案 1 :(得分:3)
正如@REW已经说过的那样,查询的into clause
中的变量名称不应该以冒号开头。
into f_num_parcela -- without colon
和
into f_valor
这两个查询可以简单地换成一个:
Select num_parcelas
, valor_total
into f_num_parcela
, f_valor
from VENDS
where numero=p_num_venda;
您可能可以在查询的select
部分进行计算
Select (valor_total / num_parcelas) *p_juros
into tmp_valor_parcela
from VENDS
where numero=p_num_venda;
但是您应该保证您的查询只返回一条记录,否则将引发too_many_rows
异常。相反,如果查询返回没有行no_data_found
异常将被引发。因此,在您的存储过程中包含exception
部分是个好主意。
答案 2 :(得分:2)
您的局部变量不需要是“绑定变量”。请注意,“select into”现在变为f_num_parcela和f_valor而不是:f_num_parcela和:f_valor。
create or replace function valor_parcela(p_num_venda number, p_juros number)
return number is
tmp_valor_parcela number(7,2);
f_num_parcelas number(7,2);
f_valor number(7,2);
begin
Select num_parcelas into f_num_parcela from VENDS where numero=p_num_venda;
Select valor_total into f_valor from VENDS where numero=p_num_venda;
tmp_valor_parcela := (f_valor/f_num_parcela)*p_juros;
return (tmp_valor_parcela);
end;