我想编写一个PL / SQL函数作为参数2参数。第一个参数是整数,第二个参数是Oracle序列对象。
此函数返回一个小数值param1.param2
,其中param2
必须是作为参数的序列对象的下一个值。
示例:函数myFc(15,objSq)
。假设objSq.nextVal
为33,则返回的十进制值必须为15.33
答案 0 :(得分:1)
这看起来有点奇怪。你应该总是知道你将使用什么序列,请注意一个序列永远不会生成a gap-free sequence of numbers,一个完美的1,2 ..n。
由于您不知道对象名称,因此必须使用execute immediate,这样您就可以使用它。您可能还应该使用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')
最后,正如大卫在评论中所说,这是一个非常奇怪的要求。你绝对肯定这是你想要做的吗?也许通过解释为什么你这样做,有人可能会提出更好的建议。