批量收集到特定的收集列
Posted
技术标签:
【中文标题】批量收集到特定的收集列【英文标题】:Bulk collect into specific columns of collection 【发布时间】:2012-04-26 14:07:48 【问题描述】:TYPE t_project_financial_table IS TABLE OF project_financial%ROWTYPE;
g_project_financial_table t_project_financial_table;
表 project_financial 有 15 列。 select 语句返回 2 列。我可以批量收集到集合 g_project_financial_table 的 2 个特定列中并将其他列保留为空,还是我必须批量收集到 2 个可变数组(对于每列)并循环遍历这些以将 2 列的值放入集合 g_project_financial_table 中。
像 BULK COLLECT INTO g_project_financial_table.column3, g_project_financial_table.column8 之类的东西?
SELECT k.tag,
(SELECT pa.available
FROM pers_account pa
WHERE pa.valid_from =
(SELECT MAX(pa2.valid_from)
FROM pers_account pa2
WHERE pa2.valid_from <= k.tag)) AS available
BULK COLLECT INTO g_project_financial_table ???????
FROM kalender k
WHERE k.tag BETWEEN to_date('20120430','YYYYMMDD')
AND to_date('20120504','YYYYMMDD')
AND k.ist_werktag = 1
ORDER BY k.tag;
【问题讨论】:
您为什么不修改您的选择,为PROJECT_FINANCIAL
中剩余的 13 列选择空值?这样您就可以直接批量收集到集合中。
【参考方案1】:
您知道,对于较大的日期范围,此查询的性能会成为一个问题,因为您为每一行执行 2 个额外的查询,对吧?
无论如何,如果您想批量插入,我的解决方案是收集到 2 个集合中。 但老实说,这看起来不像您要插入大量行,因此使用普通插入可能是最简单的。无论如何,这是批量插入。
create or replace procedure add_days_to_financial(p_date_from in date, p_date_to in date)
as
cursor cur_kalender
is
SELECT k.tag,
(SELECT pa.available
FROM pers_account pa
WHERE pa.valid_from =
(SELECT MAX(pa2.valid_from)
FROM pers_account pa2
WHERE pa2.valid_from <= k.tag)) AS available
FROM kalender k
WHERE k.tag BETWEEN p_date_from and p_date_to
AND k.ist_werktag = 1
ORDER BY k.tag;
type t_tag is table of kalender.tag%type;
type t_available is table of kalender.available%type;
arr_tag t_tag;
arr_available t_available;
begin
open cur_kalender;
loop
fetch cur_kalender bulk collect into arr_tag, arr_available limit 500;
forall i in arr_tag.first .. arr_tag.last
insert into project_financial
(tag, available)
values
(arr_tag(i), arr_available(i));
commit;
exit when cur_kalender%notfound;
end loop;
close cur_kalender;
commit;
exception
when others then
-- log?
raise;
end;
【讨论】:
【参考方案2】:您不能将数据仅收集到 15 列记录的 2 列中。但是,您可以在 SELECT
语句的适当位置添加 13 个额外的 NULL 列。或者,按照您的建议,您可以将数据批量收集到两个不同的集合中。
【讨论】:
以上是关于批量收集到特定的收集列的主要内容,如果未能解决你的问题,请参考以下文章