PL/SQL嵌套表变量声明后必须显式初始化,否则EXTEND或下标赋值报ORA-06531;MULTISET运算要求类型完全一致;SQL中使用需TABLE(CAST(...));函数返回前须确保初始化,调用方需先判NULL再COUNT。
PL/SQL嵌套表变量声明后必须显式初始化才能赋值
直接声明嵌套表类型变量却不初始化,后续用
或下标赋值会报
。这不是语法错误,是运行时陷阱——pl/sql不会自动为你分配内存空间。
声明后立刻用
(空构造函数)初始化,这是最安全的做法
如果想带初始值,直接写
(1, 2, 3),括号里是元素列表,类型必须严格匹配
不能用
初始化嵌套表变量,
会让它保持未初始化状态,后续任何访问都崩
MULTISET UNION/INTERSECT/EXCEPT 要求类型完全一致
运算符不是“看起来像就行”,左右操作数必须是同一嵌套表类型(包括 schema、精度、字符集等),连是否
都得对齐。类型不匹配会报
,而不是更友好的提示。
别指望
和
自动兼容,哪怕值域一样也得显式转换
如果两个嵌套表来自不同包或不同作用域,即使结构一模一样,也得用
强转成同一个类型名,比如
会去重并忽略重复次数(即集合语义),不是数组差集;要保留频次差异得自己写循环
在 SQL 语句中使用嵌套表需配合 TABLE() 函数和 CAST
PL/SQL 里的嵌套表变量不能直接塞进
或
,必须先转成 SQL 可识别的格式。否则报
。
用
是标准写法,
不可省略
如果嵌套表元素是对象类型,确保该对象类型已用
在 SQL 层注册,PL/SQL 包里定义的类型不行
性能上,大嵌套表走
会产生临时段,频繁调用建议改用绑定变量 + 临时表,别硬扛
嵌套表作为函数返回值时,调用方必须处理空集合情况
函数返回嵌套表,但内部逻辑可能没初始化就直接
,调用方拿到的是未初始化变量,不是空集合。这时候在 SQL 中用
会崩,在 PL/SQL 中用
会报错,而不是返回 0。
函数末尾务必检查:如果逻辑路径可能无数据,显式
(空构造)
调用方别信
,先做
判断
用
运算时,任一操作数为
,整个结果就是
,不是空集合——这点和普通数值运算逻辑完全不同
类型一致性、初始化时机、SQL/PLSQL上下文切换这三处,最容易漏检。写完记得跑边界用例:空输入、单元素、跨类型混合、函数提前返回。
extendora-06531: reference to uninitialized collection:= my_nested_table_type():= my_nested_table_typeNULLmy_var := NULLMULTISETNOT NULLORA-00932: inconsistent datatypesNUMBERPLS_INTEGERCASTCAST(t1 AS my_pkg.t_nested)MULTISET EXCEPTSELECT ... IN (SELECT ...)WHERE col MEMBER OFORA-22905: cannot access rows from a non-nested table itemTABLE(CAST(my_plsql_var AS my_nested_table_type))CASTCREATE OR REPLACE TYPETABLE()RETURNTABLE()COUNTRETURN my_type()IF my_var.COUNT > 0 THENIF my_var IS NOT NULL THENMULTISETNULLNULL