能,仅限同类型的用户自定义RECORD变量间赋值,%ROWTYPE间可互赋,但自定义记录与%ROWTYPE不可混用;LOB和REF字段赋值后共享定位器或句柄,非深拷贝。
能,但仅限同类型的 变量之间,且必须是用户自定义的记录类型(),不能是基于表的 与自定义记录混用。oracle 不支持跨类型隐式转换,哪怕结构完全一致。
常见错误现象: —— 这通常是因为你试图把一个 赋给 ,或反过来。
- 同类型赋值是深拷贝:修改目标记录不会影响源记录
- 之间可以互相赋值(如 ),因为 Oracle 视其为“同构”
- 自定义记录类型之间赋值,要求字段名、数量、顺序、数据类型全部严格匹配;少一个 约束都可能触发编译错误
不需要,只要类型兼容,一行 就够了——这是最简洁、最安全的克隆方式。逐字段写不仅冗长,还容易漏字段、错顺序,尤其在后期表结构变更时极易出错。
使用场景:函数返回记录、游标循环中暂存上一条数据、构造测试数据、备份当前行状态做对比等。
- 如果源记录含 字段(如 ),赋值后两个变量指向同一 LOB 定位器(locator),不是内容拷贝;后续对 LOB 的写操作会影响两者,需显式调用 或 处理
- 若记录里有 ,赋值只是复制游标句柄,两个变量仍共享同一个打开的游标;关闭其中一个会令另一个失效
- 性能上无差异:直cursor 教程接赋值和逐字段赋值在 PL/SQL 引擎内开销基本一致,但可读性和维护性差太多
不影响。同类型记录赋值是值拷贝(value copy),不是引用传递。改 不会动 分毫。
但要注意边界情况:
- 嵌套记录(record inside record):外层赋值是深拷贝,但若内层字段是 实例且声明为 ,那拷贝的是引用,不是对象副本
- 集合类型(如 或 ):赋值后两个变量持有独立集合,但集合元素如果是对象类型且含 ,同样存在共享引用风险
- 不要依赖 来“冻结”动态 SQL 查询结果;如果源记录来自 ,赋值后它只是那一刻快照,与后续查询无关
因为 允许字段映射(column-to-field matching by position or name),而记录赋值要求类型完全一致。比如你用 ,rec 是 ,没问题;但若 rec 是自定义记录且字段顺序不同,或多了个计算字段, 就直接拒绝。
典型陷阱:
- 用 查表再赋给自定义记录:一旦表加字段,编译就失败; + 才安全
- 把 的结果赋给 ,看着一样,但如果 实际是 而定义是 ,赋值可能截断或报错(取决于精度)
- 函数返回记录类型时,调用方必须声明完全相同的类型;别指望用 接收自定义记录返回值
真正容易被忽略的是 LOB 和 REF 的行为——它们看起来像普通字段,但拷贝语义完全不同。不验证这些字段的用途,克隆就只是表面安全。
发布者:Ai探索者,转载请注明出处:https://javaforall.net/279780.html原文链接:https://javaforall.net
