【问题标题】:Write Oracle Procedure To Accept List of Items used in Select编写 Oracle 过程以接受 Select 中使用的项目列表
【发布时间】:2011-01-04 20:31:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 创建一个对象类型是你的ID类型的表,然后你可以在子查询的FROM子句中使用TABLE()函数
  • 当您说“另一个数据存储”时,您是指一个单独的物理数据库吗?

标签: oracle stored-procedures cursors


【解决方案1】:

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

所以,你要做的是定义一个描述引用游标输出的一行的 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));

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

【讨论】:

  • 我在 Ask Tom 上看到了这个,并且玩了一些。我无法让它发挥作用,但我非常有信心这是我自己的失败。我确实有一个问题是我可以将这些类型定义放在我的包中吗?我在其他地方看到必须在数据库级别定义类型。
  • 没错,你必须创建 SQL 类型,而不是包中的类型。
【解决方案2】:

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

其他可能的解决方案:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2021-03-06
    • 1970-01-01
    • 2017-10-08
    • 2018-02-27
    • 2012-09-18
    • 2019-07-20
    相关资源
    最近更新 更多