我想编写一个将 2 个参数作为参数的 PL/SQL 函数。第一个参数是一个整数,第二个参数是一个 Oracle 序列对象。
此函数返回一个十进制值,该值param1.param2
必须param2
是作为参数的序列对象的下一个值。
示例:函数myFc(15,objSq)
。假设objSq.nextVal
是 33 那么返回的十进制值一定是 15.33
这似乎有点奇怪。您应该始终知道要使用的序列,并且请注意序列永远不会生成无间隙的数字序列,即完美的 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')
最后,正如大卫在评论中所说,这是一个非常奇怪的要求。你绝对确定这是你想做的吗?也许通过解释你为什么这样做,有人可能会提出更好的建议。