gpt4 book ai didi

plsql - Oracle 11g : When declaring new TYPE as TABLE, 我必须添加 "INDEX BY PLS_INTEGER"吗?

转载 作者:行者123 更新时间:2023-12-01 04:35:48 25 4
gpt4 key购买 nike

INDEX BY PLS_INTEGER有什么区别而不是在新表类型声明的末尾。看这个例子:

DECLARE
GC_BULK_LIMIT CONSTANT INTEGER := 500;
CURSOR CUR_CLIENTS IS SELECT C.ID, C.NAME FROM CLIENTS C;
TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE;
-- TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER;
LT_CLIENTS RT_CLIENTS;
BEGIN
OPEN CUR_CLIENTS;
LOOP
FETCH CUR_CLIENTS BULK COLLECT INTO LT_CLIENTS LIMIT GC_BULK_LIMIT;
EXIT WHEN LT_CLIENTS.COUNT = 0;
FOR I IN 1..LT_CLIENTS.COUNT LOOP
-- ... SOME LOGIC
END LOOP;
END LOOP;
CLOSE CUR_CLIENTS;
END;

最佳答案

回应“我必须添加”。最简洁的答案是不。

不同之处在于

TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE;

是嵌套表。这意味着对于这种类型的给定变量,我们知道下标是连续的。即下标从 1 开始并上升到数组长度。

因此,以下循环是访问嵌套表数组的正确方法:
FOR I IN 1..LT_CLIENTS.COUNT LOOP

然而,这被称为关联数组:
TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER;

(如果需要,您也可以通过 varchar2 索引)。不同之处在于,这种情况下的下标不必是连续的,具体取决于数组的填充方式。在您的代码中,它们将是(因为批量收集会这样做),但情况并非总是如此。

访问和循环的安全方式 index by数组是:
  v_subscript := t_arr.first;
while v_subscript is not null loop
dbms_output.put_line(v_subscript || ': ' || t_arr(v_subscript));
v_subscript := t_arr.next(v_subscript);
end loop;

哪里 v_subscript是与 index by 相同数据类型的变量部分。

同样使用嵌套表,您可以使用以下命令快速填充数组:
declare
type myarr is table of number;
t_arr myarr;
v_subscript number;
begin
t_arr := myarr(1, 12, 44);

而通过数组索引,你必须在那里有三行来填充它:
  t_arr(1):= 1;
t_arr(2):= 12;
t_arr(3):= 44;

对于您的特定情况,没有 index by完全没问题。

进一步阅读: http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/composites.htm

关于plsql - Oracle 11g : When declaring new TYPE as TABLE, 我必须添加 "INDEX BY PLS_INTEGER"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14355174/

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