Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写Oracle过程以接受Select中使用的项目列表_Oracle_Stored Procedures_Cursors - Fatal编程技术网

编写Oracle过程以接受Select中使用的项目列表

编写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

有几个提示似乎让我接近了这里,但有一些独特的问题,我希望这个问题是有区别的,足以值得自己的张贴

首先,这是我所拥有的。我有一个Oracle过程,它返回一个标准的
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类型,而不是包中的类型。