编写Oracle过程以接受Select中使用的项目列表
有几个提示似乎让我接近了这里,但有一些独特的问题,我希望这个问题是有区别的,足以值得自己的张贴 首先,这是我所拥有的。我有一个Oracle过程,它返回一个标准的编写Oracle过程以接受Select中使用的项目列表,oracle,stored-procedures,cursors,Oracle,Stored Procedures,Cursors,有几个提示似乎让我接近了这里,但有一些独特的问题,我希望这个问题是有区别的,足以值得自己的张贴 首先,这是我所拥有的。我有一个Oracle过程,它返回一个标准的REF CURSOR,这个REF CURSOR被传递回我的应用程序。REF光标是查找ID的列表 然后我想将这个列表带到另一个数据存储区,并在select语句中使用它。通过遍历REF光标完全可以实现这一点,但我希望避免这种情况。我更希望能够编写一个SELECT…WHERE lookup\u id IN result\u ref\u curs
REF CURSOR
,这个REF CURSOR
被传递回我的应用程序。REF光标是查找ID的列表
然后我想将这个列表带到另一个数据存储区,并在select语句中使用它。通过遍历REF光标完全可以实现这一点,但我希望避免这种情况。我更希望能够编写一个SELECT…WHERE lookup\u id IN result\u ref\u cursor
或SELECT…WHERE EXISTS…
首先,这是可能的,还是我应该尝试一种不那么优雅的解决方案?如果可能的话,有没有关于我应该从哪里开始寻找的提示
我对Oracle比较陌生,但总体上对RDBMs有相当的经验,所以请随意浏览我的一些链接,我可以继续学习。非常感谢您可以选择几个方向,但我搜索了您想要的具体解决方案,似乎没有人经常这样做,以至于出现在那里。您可以做的是搜索oracle metalink—这通常非常擅长于查找模糊的答案。(虽然您确实需要一份服务协议,但刚刚发现我的服务协议过期了:()
其他可能的解决办法:
在数据存储之间创建一个链接,以便您可以直接在plsql中进行选择
在Java中创建一个函数,在其中循环,以便为查询创建字符串。这至少看起来更漂亮一点
否则,REF-CURSOR需要来回移动-我不知道如何将REF-CURSOR在一个连接中的结果传递到另一个连接中的查询,而不进行循环。我不知道为什么kurosch没有将他的响应作为“答案”来处理
所以,您要做的是定义一个SQL类型,它描述了ref游标输出的一行,以及一个SQL类型,它是上一个表。然后,您将创建一个管道函数,返回ref游标返回的行。然后,这个函数可以在标准SQL中使用。我从这个函数中借用
create or replace type myLookupId as object ( id int)
/
create or replace type myLookupIdTable as table of myLookupId
/
create or replace function f return myLookupIdTable PIPELINED is
l_data myLookupId;
l_id number;
p_cursor SYS_REFCURSOR;
begin
p_cursor := function_returning_ref_cursor();
loop
fetch p_cursor into l_id;
exit when p_cursor%notfound;
l_data := myLookupId( l_id );
pipe row (l_data);
end loop;
return;
end;
/
现在是一个示例查询
SELECT *
FROM SOME_TABLE
WHERE lookup_id in (SELECT ID FROM table(f));
很抱歉,如果代码不完全正确,我现在没有要测试的DB。创建一个对象类型,它是您ID类型的表,然后您可以在子查询的FROM子句中使用table()函数,当您说“另一个数据存储”时你是说一个单独的物理数据库吗?我在Ask Tom上看到了这一点,并玩了一些。我无法让它工作,但我非常确信这是我自己的失败。我确实有一个问题,我可以把这些类型定义放在我的包中吗?我在其他地方看到,这些类型必须在DB级别定义。没错,你知道吗必须生成SQL类型,而不是包中的类型。