使用Oracle PL / SQL函数将对象序列作为参数传递

时间:2012-12-01 11:26:54

标签: sql oracle plsql oracle11g

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

此函数返回一个小数值param1.param2,其中param2必须是作为参数的序列对象的下一个值。

示例:函数myFc(15,objSq)。假设objSq.nextVal为33,则返回的十进制值必须为15.33

1 个答案:

答案 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')

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