无法使用嵌套表在 PL/SQL 中创建矩阵
Not able to create a matrix in PL/SQL using nested tables
我试图在 PL/SQL 中使用嵌套的 table 创建矩阵:
- 首先,我创建了一个能够存储 varchars 的 table 类型(在我的例子中是名称 lista_principala)
- 其次,使用之前声明的 table 类型 lista_principala 我尝试创建一个包含 lista_principala 类型项目的 table 类型。
我不认为我的逻辑有误,但我的 PL/SQL 实现看起来像这样:
set serveroutput on;
DECLARE
TYPE lista_principala_tip IS TABLE OF varchar2(30);
TYPE lista_liste_tip IS TABLE OF lista_principala_tip;
lista lista_liste_tip;
BEGIN
lista := lista_liste_tip();
lista.extend(20);
lista(1) := lista_principala_tip('Gorila', 'Babuin', 'Urangutan', 'Cimpanzeu', 'Gibon');
lista(2) := lista_principala_tip('Labrador', 'Bulldog', 'Bichon', 'Ciobanesc German');
lista(3) := lista_principala_tip('British Shorthair', 'Siamese', 'Scottish Fold', 'Chartreux');
for i in lista.first..lista.last loop
for j in lista(i).first..lista(i).last loop
DBMS_OUTPUT.PUT_LINE(i||' - '||lista(i)(j));
end loop;
end loop;
END;
我遇到的问题是,当我尝试 运行 这个脚本时,出现以下错误:
Error report -
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 12
您使用 lista.extend(20);
创建了一个包含 20 个项目的列表,这些项目都将被初始化为 NULL
。
然后为集合的前 3 个元素设置值。
然后你遍历所有 20 个项目并尝试遍历每个元素中的 sub-list;但是,在前 3 个之后,元素中不包含 sub-list,因为元素是 NULL
.
或者:
- Just
lista.EXTEND(3);
因为你只需要数组中的 3 个元素;或者
- 添加检查列表元素是否为
NULL
,如果是,则跳过 sub-list 的循环。
第二个选项可以实现为:
DECLARE
TYPE lista_principala_tip IS TABLE OF varchar2(30);
TYPE lista_liste_tip IS TABLE OF lista_principala_tip;
lista lista_liste_tip;
BEGIN
lista := lista_liste_tip();
lista.extend(20);
lista(1) := lista_principala_tip('Gorila', 'Babuin', 'Urangutan', 'Cimpanzeu', 'Gibon');
lista(2) := lista_principala_tip('Labrador', 'Bulldog', 'Bichon', 'Ciobanesc German');
lista(3) := lista_principala_tip('British Shorthair', 'Siamese', 'Scottish Fold', 'Chartreux');
for i in lista.first..lista.last loop
IF lista(i) IS NOT NULL THEN
for j in lista(i).first..lista(i).last loop
DBMS_OUTPUT.PUT_LINE(i||' - '||lista(i)(j));
end loop;
END IF;
end loop;
END;
/
db<>fiddle here
我试图在 PL/SQL 中使用嵌套的 table 创建矩阵:
- 首先,我创建了一个能够存储 varchars 的 table 类型(在我的例子中是名称 lista_principala)
- 其次,使用之前声明的 table 类型 lista_principala 我尝试创建一个包含 lista_principala 类型项目的 table 类型。 我不认为我的逻辑有误,但我的 PL/SQL 实现看起来像这样:
set serveroutput on;
DECLARE
TYPE lista_principala_tip IS TABLE OF varchar2(30);
TYPE lista_liste_tip IS TABLE OF lista_principala_tip;
lista lista_liste_tip;
BEGIN
lista := lista_liste_tip();
lista.extend(20);
lista(1) := lista_principala_tip('Gorila', 'Babuin', 'Urangutan', 'Cimpanzeu', 'Gibon');
lista(2) := lista_principala_tip('Labrador', 'Bulldog', 'Bichon', 'Ciobanesc German');
lista(3) := lista_principala_tip('British Shorthair', 'Siamese', 'Scottish Fold', 'Chartreux');
for i in lista.first..lista.last loop
for j in lista(i).first..lista(i).last loop
DBMS_OUTPUT.PUT_LINE(i||' - '||lista(i)(j));
end loop;
end loop;
END;
我遇到的问题是,当我尝试 运行 这个脚本时,出现以下错误:
Error report - ORA-06531: Reference to uninitialized collection ORA-06512: at line 12
您使用 lista.extend(20);
创建了一个包含 20 个项目的列表,这些项目都将被初始化为 NULL
。
然后为集合的前 3 个元素设置值。
然后你遍历所有 20 个项目并尝试遍历每个元素中的 sub-list;但是,在前 3 个之后,元素中不包含 sub-list,因为元素是 NULL
.
或者:
- Just
lista.EXTEND(3);
因为你只需要数组中的 3 个元素;或者 - 添加检查列表元素是否为
NULL
,如果是,则跳过 sub-list 的循环。
第二个选项可以实现为:
DECLARE
TYPE lista_principala_tip IS TABLE OF varchar2(30);
TYPE lista_liste_tip IS TABLE OF lista_principala_tip;
lista lista_liste_tip;
BEGIN
lista := lista_liste_tip();
lista.extend(20);
lista(1) := lista_principala_tip('Gorila', 'Babuin', 'Urangutan', 'Cimpanzeu', 'Gibon');
lista(2) := lista_principala_tip('Labrador', 'Bulldog', 'Bichon', 'Ciobanesc German');
lista(3) := lista_principala_tip('British Shorthair', 'Siamese', 'Scottish Fold', 'Chartreux');
for i in lista.first..lista.last loop
IF lista(i) IS NOT NULL THEN
for j in lista(i).first..lista(i).last loop
DBMS_OUTPUT.PUT_LINE(i||' - '||lista(i)(j));
end loop;
END IF;
end loop;
END;
/
db<>fiddle here