【发布时间】:2021-03-12 18:09:29
【问题描述】:
程序如下:
- 打开游标,然后通过批量收集获取选择查询的输出。
- 问题是所有 ID 都存储在批量收集中,但我无法使用批量收集变量作为输入循环第二个选择查询,它只考虑第一个 ID 而不是全部。
- OUTPUT 应该是 SYS_REFCURSOR,请说明我在这里缺少什么
table1 的测试数据:
| ID | CURRENCY | T_ID |
|---|---|---|
| 10 | GBP | PB1 |
| 15 | GBP | RB |
| 20 | GBP | CC |
| 25 | AUD | DC |
基于 t_id,我正在获取相应的 ID,然后在进一步的 select for 循环语句中使用这些 ID。
通过 SYS_REFCURSOR 的过程的当前输出:
| ID | COUNTRY | ACCOUNT |
|---|---|---|
| 10 | UK | PB1 |
预期输出:
| ID | COUNTRY | ACCOUNT |
|---|---|---|
| 10 | UK | PB1 |
| 15 | Wales | RB |
| 20 | SH | CC |
create or replace procedure myproc (i_id in varchar2, rc out sys_refcursor)
as
cursor names_cur is
select id from table1 where currency='GBP' and t_id=i_id;
names_t names_cur%ROWTYPE;
type names_ntt is table of names_t%TYPE;
l_names names_ntt;
begin
open names_cur;
fetch names_cur bulk collect into l_names ; --Inside l_names (10,15 & 20) would be stored
close names_cur;
--iSSUE IS WITH BELOW FOR LOOP
for cur in l_names.first..l_names.last loop
open rc for --For the below select I want to iterate l_names so for the above scenario it should iterate thrice
select s.id,s.country,s.account from table2 s where s.id=l_names(cur).id;
end loop;
end myproc;
【问题讨论】:
-
一些测试数据会很有帮助。我不清楚你需要这个程序做什么。例如,如果要返回游标,
l_names是什么?您只能生成带有查询的游标,并且只能打开一次。 -
现在肯定会添加数据
-
在您的过程中,您传递一个 ID 并仅从 table1 中选择具有该 ID 的行,但预期的输出包括多个 ID,所以我仍然不清楚您需要它做什么。
-
@William 当我将 i_id(来自 Proc)传递给 table1 中的 t_id(作为输入)时,根据输入,将根据连接条件获取多个匹配的 id,这就是您看到 3 的原因身份证。 1.所以基本上根据传递给过程的t_id获取所有ID的匹配项。 2. 将 ID 存储在一些变量/集合中 3. 在下一个选择查询中迭代 ID 作为输入 4. 将输出生成为 sys_refcursor 或数组
标签: oracle for-loop stored-procedures plsql bulk-collect