Oracle PL/SQL:首先选择一组 id,然后循环/处理它们的方法

Posted

技术标签:

【中文标题】Oracle PL/SQL:首先选择一组 id,然后循环/处理它们的方法【英文标题】:Oracle PL/SQL: Approach to select an array of ids first, then loop/process them 【发布时间】:2015-10-01 13:39:03 【问题描述】:

我,Oracle 新手,正在尝试将具有复杂查询的主键 ID 选择到一个数组结构中,以便之后使用它。 基本工作流程如下:

1. Select many ids (of type long) found by a long and complicated query (if I would know if and how this is possible, I would separate this into a function-like subquery of its own)
2. Store the ids in an array like structure
3. Select the rows with those ids
4. Check for duplicates (compare certain fields for equality) 
5. exclude some (i.e. duplicates with a later DATE field)

我阅读了很多关于 PL/SQL 的建议,但没有找到正确的概念。 oracle documentation 声明如果我需要一个数组,我应该使用 VARRAY。 到目前为止,我最好的方法是

declare
TYPE my_ids IS VARRAY(100000) OF LONG
begin
SELECT id INTO my_ids FROM myTable WHERE mycondition=true
-- Work with the ids here, i.e. loop through them
dbms_output.put_line('Hello World!');
END; 

但我得到一个错误:“不适合左侧”。此外,我不想在顶部声明数组的大小。 所以我认为这种方法是错误的。

谁能给我一个更好的?它不必是完整的代码,只需“使用这个数据结构、这些 SQL 结构、那个循环,你就会得到你需要的东西”。我想一旦我知道我应该走哪个方向,我就能弄清楚。

提前致谢!

【问题讨论】:

您可以使用关联数组来保存 ID:***.com/questions/5183330/… 【参考方案1】:

My_ids 在您的示例中是 type,而不是 variable。 您不能将数据存储到该类型中,您只能将数据存储到该类型的某些变量中。 试试这个代码:

declare
  TYPE my_ids_type IS VARRAY(100000) OF LONG; /* type declaration */
  my_ids my_ids_type; /* variable declaration */
begin
  SELECT my_id BULK COLLECT INTO my_ids FROM myTable;
  -- Work with the ids here, i.e. loop through them
  dbms_output.put_line('Hello World!');
END;

阅读这篇文章:http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html 了解如何在 PL/SQL 中批量收集数据的基础知识。

【讨论】:

以上是关于Oracle PL/SQL:首先选择一组 id,然后循环/处理它们的方法的主要内容,如果未能解决你的问题,请参考以下文章

在用户只能访问与其 id 列相关的列的条件下向用户授予选择列权限 - Oracle pl/sql

Oracle PL/SQL 在循环中捕获锁定异常并继续

pl/sql:在oracle中选择作为函数的参数/参数

Oracle PL/SQL 在原始选择和分层选择之间切换

选择 PL/SQL 中两个非空列值之间的行集

Oracle PL/SQL Developer:从包过程中返回 %RowType