gpt4 book ai didi

oracle - 重构 PL/SQL : many cursors with same rowtype (in theory)

转载 作者:行者123 更新时间:2023-12-01 09:36:53 26 4
gpt4 key购买 nike

我正在编写一些 PL/SQL 并发现自己陷入了重复模式:

cursor c_curs1 is
select a, b, c
from (...) big_subquery_1
where big_subquery_1.a_ind = 'Y'

cursor c_curs2 is
select a, b, c
from (...) big_subquery_2
where big_subquery_2.b_ind = 'R'

cursor c_curs3 is
select a, b, c
from (...) big_subquery_3
where big_subquery_3.c_ind = 'M'

...
type t_curs1_tab is table of c_curs1;
type t_curs2_tab is table of c_curs2;
type t_curs3_tab is table of c_curs3;
...
v_curs1_results t_curs1_tab := t_curs1_tab();
v_curs2_results t_curs2_tab := t_curs2_tab();
v_curs3_results t_curs3_tab := t_curs3_tab();

然后在处理结果时,我有这样的代码:
    open c_curs1;
fetch c_curs1 bulk collect into v_curs1_results;
close c_curs1;

if v_curs1_results.first is not null and v_curs1_results.last is not null then
for i in v_curs1_results.first .. v_curs1_results.last loop
/*Do something with field a in the results
Do something with field b in the results
Do something with field c in the results*/
....
end loop;
end if;

处理循环中的代码对于所有游标都是相同的,因为所有 3 个游标都返回 a,b,c - 唯一的区别是引用了哪个游标。我想将其重构为某种通用结果集处理器,但我被困在这里:
procedure sp_process_collection(in_collection t_curs1_tab) is ...

我只能用 v_curs1_results 调用这个, 我不能用 v_curs2_results 调用它或者我得到一个 PLS-00306 wrong number of types or arguments...编译器错误。有什么办法可以通用地做到这一点,所以我只需要编写一个集合处理程序?我有这种游标模式(返回相同的三列,总是相同的类型)出现在同一个包的其他几个部分和处理循环中,而语义相同的有时用略有不同的代码编写。我非常想将处理集中在一个过程中,我只是想不出如何在 PL/SQL 中做到这一点。我知道 PL/SQL 没有泛型(我认为这会使 Java/C# 解决方案变得相当简单),但我想知道是否有另一种方法来解决我没有想到的这个问题。

(使用 Oracle 10g)

最佳答案

如果结果列相同,则没有理由具有三个 TYPE 声明。你只有一种类型。您是否需要该 TYPE 的一个或多个变量取决于您是否需要同时保存不同的数据集。

cursor c_curs1 is
select a, b, c
from (...) big_subquery_1
where big_subquery_1.a_ind = 'Y'

cursor c_curs2 is
select a, b, c
from (...) big_subquery_2
where big_subquery_2.b_ind = 'R'

cursor c_curs3 is
select a, b, c
from (...) big_subquery_3
where big_subquery_3.c_ind = 'M'

...
type t_curs_tab is table of c_curs1;
...
v_curs_results t_curs_tab := t_curs_tab();
...
open c_curs1;
fetch c_curs1 bulk collect into v_curs_results;
close c_curs1;
...
open c_curs2;
fetch c_curs2 bulk collect into v_curs_results;
close c_curs2;
...
open c_curs3;
fetch c_curs3 bulk collect into v_curs_results;
close c_curs3;

关于oracle - 重构 PL/SQL : many cursors with same rowtype (in theory),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com