You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:24:04