BULK COLLECT INTO 多个集合
BULK COLLECT INTO multiple collections
我想知道使用 BULK COLLECT INTO
多个集合是否可以保证行中的相应列在嵌套 table 中具有相同的索引。
示例:
CREATE TABLE tx AS
SELECT CAST(level AS INT) AS col1, level || 'a' AS col2, level || 'b' as col3
FROM dual
CONNECT BY level <= 100000;
数据:
col1 col2 col3
1 1a 1b
2 2a 2b
3 3a 3b
4 4a 4b
5 5a 5b
... ... ...
和代码:
DECLARE
CURSOR cur IS SELECT /*+parallel(4)*/col1, col2, col3 FROM tx;
TYPE t1 IS TABLE of INT;
TYPE t2 IS TABLE of VARCHAR2(20);
vt1 t1;
vt2 t2;
vt3 t2;
BEGIN
OPEN cur;
FETCH cur BULK COLLECT INTO vt1, vt2, vt3 LIMIT 1000;
LOOP
FOR i IN 1..vt1.COUNT LOOP
DBMS_OUTPUT.put_line('i => '|| i || ' vt1 => ' || vt1(i)
|| ' vt2 => '|| vt2(i) || ' vt3 =>' || vt3(i));
END LOOP;
EXIT WHEN cur%NOTFOUND;
FETCH cur BULK COLLECT INTO vt1, vt2, vt3 LIMIT 1000;
END LOOP;
CLOSE cur;
END;
输出:
i => 1 vt1 => 22418 vt2 => 22418a vt3 =>22418b
i => 2 vt1 => 22419 vt2 => 22419a vt3 =>22419b
i => 3 vt1 => 22420 vt2 => 22420a vt3 =>22420b
i => 4 vt1 => 22421 vt2 => 22421a vt3 =>22421b
i => 5 vt1 => 22422 vt2 => 22422a vt3 =>22422b
i => 6 vt1 => 22423 vt2 => 22423a vt3 =>22423b
所以在每一行中总是有相同的前缀。或者在某些情况下可能会得到类似的东西:
i => 1 vt1=> 100 vt2=>200a vt3=>300b
备注:我知道我可以定义记录类型并只使用一个集合。
正在寻找来自官方来源的答案图。
抱歉,我没有从官方渠道获得任何信息,但我猜想去同步化是不可能的,因为这意味着如果您改用记录类型,您最终会在 collection。
例如:rec.vt1 => 100 rec.vt2 => 200a rec.vt3 => 300a
这基本上意味着BULK COLLECT
不可靠。
Oracle 的 PL/SQL 语言参考文档没有明确说明来自同一行的值将具有相同的索引,但确实说明:
PL/SQL processes the BULK COLLECT clause similar to the way it processes a FETCH statement inside a LOOP statement.
此外,关于 BULK COLLECT
的章节给出了一些示例,这些示例隐含地假设来自同一行的值将具有相同的索引。例如。这来自 Oracle PL/SQL Language Reference for version 12.1.
中的示例 12-22
FOR i IN names.FIRST .. names.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(' Employee ' || names(i) || ': $' || sals(i));
END LOOP;
除了 Matthew McPeak 发现的内容之外,我认为这里的关键实际上是 FETCH statement,它总是 select 来自 table 的整行(或多行):
The FETCH statement retrieves rows of data from the result set of a
multiple-row query—one row at a time, several rows at a time, or all
rows at once—and stores the data in variables, records, or
collections.
因此,在获取行之后,Oracle 可以将它们放入记录或一个或多个集合中(如您的示例),但无论哪种方式,索引都是一致的(从同一行中提取)。
我想知道使用 BULK COLLECT INTO
多个集合是否可以保证行中的相应列在嵌套 table 中具有相同的索引。
示例:
CREATE TABLE tx AS
SELECT CAST(level AS INT) AS col1, level || 'a' AS col2, level || 'b' as col3
FROM dual
CONNECT BY level <= 100000;
数据:
col1 col2 col3
1 1a 1b
2 2a 2b
3 3a 3b
4 4a 4b
5 5a 5b
... ... ...
和代码:
DECLARE
CURSOR cur IS SELECT /*+parallel(4)*/col1, col2, col3 FROM tx;
TYPE t1 IS TABLE of INT;
TYPE t2 IS TABLE of VARCHAR2(20);
vt1 t1;
vt2 t2;
vt3 t2;
BEGIN
OPEN cur;
FETCH cur BULK COLLECT INTO vt1, vt2, vt3 LIMIT 1000;
LOOP
FOR i IN 1..vt1.COUNT LOOP
DBMS_OUTPUT.put_line('i => '|| i || ' vt1 => ' || vt1(i)
|| ' vt2 => '|| vt2(i) || ' vt3 =>' || vt3(i));
END LOOP;
EXIT WHEN cur%NOTFOUND;
FETCH cur BULK COLLECT INTO vt1, vt2, vt3 LIMIT 1000;
END LOOP;
CLOSE cur;
END;
输出:
i => 1 vt1 => 22418 vt2 => 22418a vt3 =>22418b
i => 2 vt1 => 22419 vt2 => 22419a vt3 =>22419b
i => 3 vt1 => 22420 vt2 => 22420a vt3 =>22420b
i => 4 vt1 => 22421 vt2 => 22421a vt3 =>22421b
i => 5 vt1 => 22422 vt2 => 22422a vt3 =>22422b
i => 6 vt1 => 22423 vt2 => 22423a vt3 =>22423b
所以在每一行中总是有相同的前缀。或者在某些情况下可能会得到类似的东西:
i => 1 vt1=> 100 vt2=>200a vt3=>300b
备注:我知道我可以定义记录类型并只使用一个集合。
正在寻找来自官方来源的答案图。
抱歉,我没有从官方渠道获得任何信息,但我猜想去同步化是不可能的,因为这意味着如果您改用记录类型,您最终会在 collection。
例如:rec.vt1 => 100 rec.vt2 => 200a rec.vt3 => 300a
这基本上意味着BULK COLLECT
不可靠。
Oracle 的 PL/SQL 语言参考文档没有明确说明来自同一行的值将具有相同的索引,但确实说明:
PL/SQL processes the BULK COLLECT clause similar to the way it processes a FETCH statement inside a LOOP statement.
此外,关于 BULK COLLECT
的章节给出了一些示例,这些示例隐含地假设来自同一行的值将具有相同的索引。例如。这来自 Oracle PL/SQL Language Reference for version 12.1.
FOR i IN names.FIRST .. names.LAST LOOP DBMS_OUTPUT.PUT_LINE(' Employee ' || names(i) || ': $' || sals(i)); END LOOP;
除了 Matthew McPeak 发现的内容之外,我认为这里的关键实际上是 FETCH statement,它总是 select 来自 table 的整行(或多行):
The FETCH statement retrieves rows of data from the result set of a multiple-row query—one row at a time, several rows at a time, or all rows at once—and stores the data in variables, records, or collections.
因此,在获取行之后,Oracle 可以将它们放入记录或一个或多个集合中(如您的示例),但无论哪种方式,索引都是一致的(从同一行中提取)。