oracle - 循环遍历数组以获取 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
任何帮助表示赞赏
解决方案
我们可以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)
作品。
推荐阅读
- android - Kotlin Firestore - 从特定文档中获取字段
- python - 在 IsolatedAsyncioTestCase 中运行后台任务的首选方法是什么?
- python - 在电子纸屏幕上显示静态内容时,避免繁忙或低效等待的适当策略?
- go - 为什么select总是选择默认?
- mysql - 在有限集合中查找 MIN 值
- amazon-web-services - 合并 2 个工作计算会产生聚合错误
- javascript - 使用正则表达式为文本添加样式
- windows - 如何在 iTextSharp v5 中添加链接以打开没有 Win10 安全警告的文件
- deep-learning - 如何反转 PyTorch 嵌入?
- docker - 主机和容器之间的卷