首页 > 解决方案 > 循环遍历数组以获取 where 条件 pl/sql

问题描述

是否可以在 pl/sql 中循环遍历需要进入 pl/sql 语句的 WHERE 子句的多个 id。sql 语句本身非常简单,但我需要遍历多个 id:

SELECT x_name
FROM table_x
WHERE x_id = {array of 90 id's};

如何在此处插入 90 个 ID,以便 sql 对其进行迭代?我尝试使用光标 For Loop,但我被卡住了。下面的代码是错误的,但它可能表明我想在这里实现什么

DECLARE
  TYPE x_id_array IS VARRAY(3) OF NUMBER;
  CURSOR cur_x_id (x_ondz_id NUMBER) IS
  SELECT x_name
  FROM table_x
  WHERE x_id = var_ondz_id;
  loop_total integer;
  x_id x_id_array;
  name VARCHAR;
BEGIN
  x_id_new := x_id_array(8779254, 8819930, 8819931); --3 for testing
  loop_total := x_id_new.count;
  FOR i in 1 .. loop_total LOOP
    dbms_output.put_line('x_id: ' || x_id_new(i) || '= Name: ' || x_name );
  END LOOP;
END;
/

预期的输出将是

x_id: 8779254= Name: Name_1 
x_id: 8819930= Name: Name_2
x_id: 8819931= Name: Name_3
...
... etc for all 90 id's in the array 

任何帮助表示赞赏

标签: oraclefor-loopplsqliteration

解决方案


我们可以TABLE在集合上使用函数来获取数字/字符列表。

SELECT *
FROM TABLE ( sys.odcinumberlist(8779254,8819930,8819931) );

8779254
8819930
8819931

这里我使用的是 Oracle 的内部VARRAY,限制为 32767。您可以使用自己的NESTED TABLE类型。

create OR REPLACE TYPE yourtype AS TABLE OF NUMBER;

然后选择它。

SELECT *
FROM TABLE ( yourtype(8779254,8819930,8819931) );

因此,您的查询可以简单地写为

SELECT x_name
FROM table_x
WHERE x_id IN ( SELECT * FROM 
       TABLE ( yourtype(8779254,8819930,8819931) ) );

12.2 及更高版本,您甚至不需要指定 TABLE.

SELECT * FROM yourtype(8779254,8819930,8819931)作品。


推荐阅读