Oracle PL/SQL中如何访问嵌套TABLE类型内RECORD中的值
Oracle PL/SQL中嵌套TABLE OF TABLE OF RECORD结构的字段访问方法
你提供的示例代码存在几个关键问题,导致无法正确访问最内层RECORD的字段,下面是修正方案和核心要点:
核心问题分析
- 未声明变量实例:
A和A_DET只是自定义类型,不是可操作的变量,不能直接用a.first或a_det.first调用集合方法 - 访问语法错误:不能用类型名
a_det去访问外层集合元素的内层表,必须通过外层变量的索引定位到内层表实例后,再用内层索引访问记录字段
修正后的完整代码
DECLARE -- 定义最内层记录类型 TYPE a_rec IS RECORD ( name VARCHAR2(100), adress VARCHAR2(100) ); -- 定义记录类型的嵌套表 TYPE A_DET IS TABLE OF A_REC; -- 定义嵌套表的嵌套表(外层表) TYPE A IS TABLE OF A_DET; -- 声明外层表变量并初始化数据 v_a A := A( A_DET( a_rec(name => '张三', adress => '北京'), a_rec(name => '李四', adress => '上海') ), A_DET( a_rec(name => '王五', adress => '广州') ) ); BEGIN -- 遍历外层表的每个元素(每个元素是一个A_DET类型的嵌套表) FOR i IN v_a.first .. v_a.last LOOP -- 遍历当前外层元素对应的内层表 FOR j IN v_a(i).first .. v_a(i).last LOOP -- 正确访问最内层记录的name字段 dbms_output.put_line('第' || i || '组第' || j || '条记录:' || v_a(i)(j).name); END LOOP; END LOOP; END; /
关键访问规则
- 外层表变量
v_a通过索引i定位到一个内层表实例:v_a(i) - 再通过内层索引
j定位到最内层的记录:v_a(i)(j) - 最后直接访问记录的字段:
v_a(i)(j).name或v_a(i)(j).adress
额外注意事项
- PL/SQL嵌套表默认是空集合,必须先初始化并填充数据才能遍历,否则会抛出
NO_DATA_FOUND异常 - 如果需要动态添加元素,可以使用
EXTEND方法,比如v_a.EXTEND; v_a(v_a.last) := A_DET();
内容的提问来源于stack exchange,提问作者Nassim 94
相关产品推荐
相关产品推荐

