Oracle中未声明的object_column来源及派生对象更新方法咨询
问题解答
关于object_column的疑问
你提到的object_column并不是手动创建的对象——实际上你的SQL里这个写法是错误的。当你用CREATE TABLE extaddr OF address_object;创建对象表时,Oracle会自动生成系统维护的隐藏列(默认名为SYS_NC_OID$)来唯一标识每个对象实例,但它不会自动创建名为object_column的列。
你写的更新语句里的object_column应该是对对象表引用方式的误解。在对象表中,要引用整行的对象实例,应该用VALUE(表别名)函数,而不是虚构的object_column。
Oracle中更新对象类型值的正确方式
根据对象的存储方式(对象表或普通表中的对象列),更新方式略有不同:
1. 更新对象表中的对象属性
针对你创建的extaddr对象表,正确的更新语句应该是这样的:
-- 使用VALUE()函数匹配对象实例 UPDATE extaddr e SET e.state = 'GA' WHERE VALUE(e) = :addrref;
或者直接省略别名,直接引用属性:
UPDATE extaddr SET state = 'GA' WHERE VALUE(extaddr) = :addrref;
2. 更新普通表中的对象列
如果是在普通表中定义了对象类型的列(比如下面的例子):
CREATE TABLE person ( id NUMBER PRIMARY KEY, home_addr address_object );
更新对象属性的写法是:
-- 更新对象的单个属性 UPDATE person SET home_addr.state = 'GA' WHERE id = 1; -- 替换整个对象实例 UPDATE person SET home_addr = address_object('GA', '30301') WHERE id = 1;
3. 使用对象引用(REF)更新
如果需要通过对象引用来操作,首先要确保对象表有主键或唯一约束,然后可以用REF()函数获取对象引用:
-- 先给对象表加主键 ALTER TABLE extaddr ADD PRIMARY KEY (state, zip); -- 通过REF查询并更新 UPDATE extaddr e SET e.state = 'GA' WHERE REF(e) = :addrref;
内容的提问来源于stack exchange,提问作者cmucheru
相关产品推荐
相关产品推荐

