0

我想编写一个将 2 个参数作为参数的 PL/SQL 函数。第一个参数是一个整数,第二个参数是一个 Oracle 序列对象。

此函数返回一个十进制值,该值param1.param2必须param2是作为参数的序列对象的下一个值。

示例:函数myFc(15,objSq)。假设objSq.nextVal是 33 那么返回的十进制值一定是 15.33

4

1 回答 1

1

这似乎有点奇怪。您应该始终知道要使用的序列,并且请注意序列永远不会生成无间隙的数字序列,即完美的 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')

最后,正如大卫在评论中所说,这是一个非常奇怪的要求。你绝对确定这是你想做的吗?也许通过解释你为什么这样做,有人可能会提出更好的建议。

于 2012-12-01T12:22:32.767 回答