我有一个pl/sql过程。它执行一个sql语句并返回一个json响应。
我想限制使用offset子句返回的行。如:
select *
from wherever
where something = parameter
offset 0 rows
fetch next 25 rows only;
然而,在上面的例子中,我似乎无法使用变量来替换0和25。
当然有办法解决这个问题。我可以像11g中出现offset子句之前那样编写代码。但它看起来很难看,可能不会表现得很好…我错过了什么。在过程或游标的sql的offset子句中可以使用参数吗?
例如,下面的过程确实编译,但返回的游标总是空的(当我硬编码值时不是空的):
procedure test (pPageSize in pls_integer:=25, pPageno in pls_integer:=1, RecipeList out sys_refcursor) is
vNextRows pls_integer;
vOffset pls_integer;
begin
vOffset:= pPageSize*(pPageno-1);
vNextRows:= pPageSize;
open RecipeList
for
select *
from recipes
order by recipeno
offset vOffset rows
fetch next vNextRows rows only;
end test;
3条答案
按热度按时间ar5n3qh51#
这样地:
zfciruhq2#
当你把这个过程称为
您正在覆盖默认值;如果要使用默认值,则不要提供前两个参数:
或者,如果不想使用默认值,请提供参数:
或保留默认大小,但获取特定页面:
db<>小提琴
根据文件:
要声明的形式参数的默认值。表达式的数据类型必须与数据类型兼容。
如果子程序调用没有为形式参数指定实际参数,那么该调用将计算表达式并将其值赋给形式参数。
如果子程序调用确实为形式参数指定了一个实际参数,那么该调用将实际参数的值赋给形式参数,并且不计算表达式。
您正在指定实际参数。您传递的是null,但这意味着您将形式参数指定为null,而不是根本不指定它们。微妙但重要的区别。
我想如果我愿意的话,我可以在proc中手动设置默认值。
是的,非常简单:
db<>小提琴
14ifxucb3#
我试过了。
如果您将值传递给过程,则工作正常。它不使用默认值。
--创建过程
--不使用默认值
--使用非默认值