パラメータとして2つの引数を取るPL/SQL関数を作成したいと思います。最初のパラメータは整数で、2番目のパラメータはOracleシーケンスオブジェクトです。
この関数は10進値を返します。これは、パラメーターとして使用されるシーケンスオブジェクトの次の値である必要がありますparam1.param2
。param2
例:関数myFc(15,objSq)
。が33であるとするとobjSq.nextVal
、返される10進値は15.33でなければなりません。
これは少し奇妙に思えます。使用するシーケンスを常に知っておく必要があります。また、シーケンスによってギャップのない数列、つまり完全な1、2..nが生成されることは決してないことに注意してください。
オブジェクト名がわからないので、すぐに実行する必要があります。これにより、オブジェクトを使用できるようになります。dbms_assert
SQLインジェクションから保護するためにも使用する必要があります。
あなたの質問に対する答えは次のようになります。
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がコメントで述べているように、これは非常に奇妙な要件です。これがあなたがやりたいことだと絶対に確信していますか?たぶん、あなたがこれをしている理由を説明することによって、誰かがより良い提案を思い付くことができるかもしれません。