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. これらの 2 つのクエリは、単純に 1 つに置き換えることができます。

    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;
    

ただし、クエリが正確に 1 つのレコードを返すことを保証する必要があります。そうしないと、too_many_rows例外が発生します。逆に、クエリが行を返さない場合、no_data_found例外が発生します。exceptionそのため、ストアド プロシージャに sectionを含めることをお勧めします。

于 2013-08-28T04:43:02.467 に答える
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;
于 2013-08-28T03:29:51.993 に答える