【问题标题】:how to use 3 variables in PL/SQL function [closed]如何在 PL/SQL 函数中使用 3 个变量 [关闭]
【发布时间】:2013-08-30 23:19:28
【问题描述】:

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

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper


    【解决方案1】:
    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 部分是个好主意。

    【讨论】:

    • f_num_parcelas, f_valor 需要声明...
    【解决方案2】:

    也试试这个,你会从一个查询中得到 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;
    /
    

    【讨论】:

      【解决方案3】:

      您的局部变量不需要是“绑定变量”。请注意,“选择进入”现在进入 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多