2

PLSQLでネストされた関数を使用する正しい方法を知りたい。次のスニペットでは、関数'to_number'は正常に機能しますが、2つのネストされた関数を同じ方法で使用することはできません。

Declare
  Tettt Number;
  Function lolazo(pigt Number, p_Fecha_Fact Date)
  Return Number Is
    resultado number;
  Begin
    Select Vp.Valor
    into resultado
    from valor_precio vp
    Where Vp.Id_Tipo_Cargo = 103
      And Vp.Id_Grupo_Precio = pigt
      and vp.f_inicio_precio =
        (select max(vp2.f_inicio_precio)
         From Valor_Precio Vp2
         Where Vp2.Id_Grupo_Precio = pigt
           And Vp2.F_Inicio_Precio < p_fecha_fact
           And Vp2.Id_Tipo_Cargo = 103 );
    Return Resultado;
  End Lolazo;
  Function Multi(Uno Number, Dos Number) Return Number Is
  Begin
    return uno*dos;
  End Multi;
Begin
  Select to_number('123')
  Into Tettt
  From Dual;

--  Doesn't work!
--  Select lolazo(1544, to_date('01/01/2011','dd/mm/yyyy')) 
--  Into Tettt
--  From Dual;

--  Doesn't work!
--  select Multi(2,3) into Tettt from dual;

Dbms_Output.Put_Line(lolazo(1544, to_date('01/01/2011','dd/mm/yyyy')));
Dbms_Output.Put_Line(Multi(2,3));
dbms_output.put_line(Tettt);
end;
4

1 に答える 1

8

関数はSQLで使用できないため、次のことを行わないでくださいselect into some_variable from dual

割り当てを使用してみてください:

Tettt := Multi(2,3);

また、スクリプトからエラーを投稿します(機能しないと言う代わりに)。実際の問題を確認するのははるかに簡単です。

これらの関数をSQLから本当に使用したい場合は、SQLエンジン(匿名ブロックが存在するPL / SQLの世界の外)にそれらを公開する必要があります。これには通常、個別のストアドプロシージャを作成するか、パッケージ仕様でそれらを定義することが含まれます。

お役に立てば幸いです。

于 2012-08-21T09:25:59.353 に答える