PL/SQL创建10×10数字网格时触发ORA-06533下标超出计数错误求解决
错误原因分析
ORA-06533: Subscript beyond count 是PL/SQL中典型的集合下标越界错误,你的代码触发该错误的核心原因有3个:
- VARRAY类型的集合使用前必须先调用
EXTEND方法分配存储空间,你仅初始化了grid_var,没有给外层10个元素、内层每个数组的10个元素分配空间,直接访问下标就会触发越界。 - 代码逻辑顺序错误:你还没有完成1-100的数字填充逻辑,就先写了读取打印的逻辑,此时集合都是空的,访问不存在的元素直接报错。
- 循环逻辑存在低级错误:内层循环你写了
EXIT WHEN (N =100),但单个内层数组最多只有10个元素,且N变量在内层循环中没有自增,既会触发越界也有死循环风险。
修复后可运行代码
DECLARE -- 定义长度为10的整数VARRAY类型 TYPE array_10_int IS VARRAY(10) of PLS_INTEGER; -- 定义10*10的二维VARRAY类型 TYPE grid_100_int IS VARRAY(10) of array_10_int; grid_var grid_100_int; i PLS_INTEGER := 0; j PLS_INTEGER :=0; -- 存储要写入的数值 num PLS_INTEGER :=1; BEGIN -- 初始化外层集合,分配10个元素的空间 grid_var := grid_100_int(); grid_var.EXTEND(10); -- 嵌套循环填充1-100的数字 FOR i IN 1..10 LOOP -- 初始化每个内层数组,分配10个元素的空间 grid_var(i) := array_10_int(); grid_var(i).EXTEND(10); FOR j IN 1..10 LOOP grid_var(i)(j) := num; num := num +1; END LOOP; END LOOP; -- 打印10*10网格 FOR i IN 1..10 LOOP FOR j IN 1..10 LOOP IF grid_var(i)(j) < 10 THEN DBMS_OUTPUT.PUT(' ' || grid_var(i)(j) || ' '); ELSIF grid_var(i)(j) < 100 THEN DBMS_OUTPUT.PUT(' ' || grid_var(i)(j) || ' '); ELSE DBMS_OUTPUT.PUT(grid_var(i)(j) || ' '); END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(''); END LOOP; END; /
关键修改点说明
- 填充数据前先给外层集合
grid_var调用EXTEND(10)分配10个元素的空间,每次循环到新的行时,给当前行的内层数组也调用EXTEND(10)分配10个元素的空间,避免越界。 - 先完成1-100的数字填充逻辑,再执行打印逻辑,避免访问空集合元素。
- 改用更简洁的
FOR IN循环替代手动维护计数变量的LOOP循环,避免变量自增、终止条件写错的问题。 - 补充了数值对齐的判断逻辑,保证网格输出整齐。
内容的提问来源于stack exchange,提问作者A A
相关产品推荐
相关产品推荐

