1

我尝试在 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;
4

3 回答 3

3
  1. 正如@REW 已经说过的那样,into clause查询中的变量名称不应以冒号开头。

    into f_num_parcela  -- without colon
    

    into f_valor
    
  2. 这两个查询可以简单地替换为一个:

    Select num_parcelas
         , valor_total
      into f_num_parcela
         , f_valor
      from VENDS
     where numero=p_num_venda;
    
  3. 您可能可以在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在存储过程中包含部分是个好主意。

于 2013-08-28T04:43:02.467 回答
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;
/
于 2013-08-28T04:34:18.150 回答
2

您的局部变量不需要是“绑定变量”。请注意,“选择进入”现在进入 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;
于 2013-08-28T03:29:51.993 回答