2

有一些提示似乎让我很接近这里,但有一些独特的问题,我希望这个问题足够突出,值得自己发布。

首先,这就是我所拥有的。我有一个返回标准的 Oracle 过程,并将其REF CURSOR传递REF CURSOR回我的应用程序。这REF CURSOR是查找 ID 的列表。

然后,我想获取此列表并将其带到另一个数据存储并在 select 语句中使用它。通过循环 REF CURSOR 绝对有可能实现这一点,但我希望避免这种情况。我宁愿能够写一个SELECT...WHERE lookup_id IN result_ref_cursorORSELECT...WHERE EXISTS...

首先这是可能的还是我应该尝试一个不太优雅的解决方案?如果可能的话,关于我应该从哪里开始寻找的任何提示?

我对 Oracle 比较陌生,但总体上在 RDBM 方面相当有经验,所以请随意通过我的一些链接,我可以继续学习。非常感激

4

2 回答 2

1

为什么 kurosch 没有将他的回答作为“答案”我不知道。

因此,您要做的是定义一个描述 ref 游标输出的一行的 SQL 类型,以及一个作为前一个表的 SQL 类型。然后,您将创建一个流水线函数,该函数返回 ref 游标返回的行。然后可以在标准 SQL 中使用此函数。我正在向 Ask Tom借这个。

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));

抱歉,如果代码不完全正确,我现在没有要测试的数据库。

于 2011-01-05T04:07:36.360 回答
0

您可以使用几个方向,但我搜索了您想要的特定解决方案,似乎没有人经常这样做以出现在那里。你可以做的是搜索 oracle metalink——它通常非常擅长寻找晦涩难懂的答案。(虽然你确实需要一份服务协议——刚刚发现我的过期了:()

其他可能的解决方案:

在数据存储之间创建一个链接,以便您可以直接在 plsql 中进行选择

在 Java 中创建一个循环遍历它的函数,以便您为查询创建字符串。这至少看起来会更漂亮一些。

否则,REF CURSOR 需要来回切换 - 我不知道如何在一个连接中将 REF CURSOR 的结果通过管道传输到另一个连接中的查询而不循环它。

于 2011-01-04T21:29:45.553 回答