如何在PL / SQL函数中使用3个变量

时间:2013-08-28 02:33:31

标签: sql oracle plsql oracle-sqldeveloper

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

3 个答案:

答案 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)

  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;
    
  4. 但是您应该保证您的查询只返回一条记录,否则将引发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;