0

パラメータとして2つの引数を取るPL/SQL関数を作成したいと思います。最初のパラメータは整数で、2番目のパラメータはOracleシーケンスオブジェクトです。

この関数は10進値を返します。これは、パラメーターとして使用されるシーケンスオブジェクトの次の値である必要がありますparam1.param2param2

例:関数myFc(15,objSq)。が33であるとするとobjSq.nextVal、返される10進値は15.33でなければなりません。

4

1 に答える 1

1

これは少し奇妙に思えます。使用するシーケンスを常に知っておく必要があります。また、シーケンスによってギャップのない数列、つまり完全な1、2..nが生成されることは決してないことに注意してください。

オブジェクト名がわからないので、すぐに実行する必要があります。これにより、オブジェクトを使用できるようになります。dbms_assertSQLインジェクションから保護するためにも使用する必要があります。

あなたの質問に対する答えは次のようになります。

create or replace my_function ( 
                Pnumber in number
              , Psequence in varchar2 ) return number is

   l_nextval number;

begin

   execute immediate '
       select ' || dbms_assert.sql_object_name(Psequence) || '.nextval
         from dual'
         into l_nextval;

   -- Who knows how many decimal places you might need?
   return to_number(Pnumber || '.' || l_nextval, '99.9999');

end;
/

しかし、なぜあなたがこれをしたいのか分かりません。あなたは明らかにあなたが使おうとしているシーケンスの名前を知っています。関数を使用する代わりに、呼び出し元のコードでこの情報を使用するだけで済みます。

to_number(15 || '.' || sequence_name.nextval, '99.9999')

最後に、Davidがコメントで述べているように、これは非常に奇妙な要件です。これがあなたがやりたいことだと絶対に確信していますか?たぶん、あなたがこれをしている理由を説明することによって、誰かがより良い提案を思い付くことができるかもしれません。

于 2012-12-01T12:22:32.767 に答える