使用TREAT更新子类型属性(Oracle 11g)

时间:2010-02-24 10:08:56

标签: oracle11g

我希望能够更新子类型属性,并且一些研究让我相信它可以用TREAT完成。我在这种语法上尝试了几种变体:

UPDATE table1 t SET TREAT(VALUE(t) AS myType).attributeToUpdate = 10 WHERE id=1;

myType是table1类型的子类型。

继续收到错误ORA-00927 missing equals sign

由于

3 个答案:

答案 0 :(得分:0)

我从来没有使用任何这些离奇的“对象表”的东西,所以不能确定,但​​在我看来,TREAT是一个表达式,你不能更新任何表达式的结果,例如这显然是非法的:

UPDATE emp SET UPPER(ename) = 'X'; -- Won't work

答案 1 :(得分:0)

应该为您工作:

DECLARE
    s subclass;

BEGIN
    SELECT treat(value(p) as subclass) INTO s FROM superclass p WHERE id = search;
    s.attributeToChange = 'new value';
    UPDATE superclass p SET value(p) = s WHERE id = search;
END;

答案 2 :(得分:-1)

我完全不了解这个问题,但参考书<>说使用DML构建一个新对象

http://www.howardsmith.net/manuals/Oracle_PL_SQL_Programming.pdf

请参阅第1159页

更好的解决方案可能是更改类型表的设计,因为子类型属性是可访问的,因此可能使其成为超类型。