一下SQL在执行到最后一句时报错CREATE TYPE TEACHER AS OBJECT
(
  NAME VARCHAR2(105),
  BIRTH DATE
);
/CREATE TYPE TEACHER_TABLE AS TABLE OF TEACHER;
/CREATE TABLE CENTER(
  NAME VARCHAR2(4) PRIMARY KEY,
  TEACHERS TEACHER_TABLE
)NESTED TABLE TEACHERS STORE AS TEACHER_TABLE_CENTER;INSERT INTO CENTER VALUES('徐汇',
  TEACHER_TABLE(
    TEACHER('张老师', to_date('1980-1-1', 'yyyy-mm-dd')),
    TEACHER('李老师', to_date('1982-1-1', 'yyyy-mm-dd')),
    TEACHER('胡老师', to_date('1978-1-1', 'yyyy-mm-dd'))
  )
);INSERT INTO CENTER VALUES('长宁',
  TEACHER_TABLE(
    TEACHER('方方老师', to_date('1981-12-31', 'yyyy-mm-dd')),
    TEACHER('马老师', to_date('1983-12-31', 'yyyy-mm-dd'))
  )
);CREATE TYPE STUDENT AS OBJECT
(
  NAME VARCHAR2(105),
  STUDNO CHAR(10)
);
/CREATE TYPE STUDENT_ARR AS VARRAY(30) OF STUDENT;
/CREATE TABLE CLASS(
  CLASSID VARCHAR2(7) PRIMARY KEY,
  CENTER_NAME VARCHAR2(4) REFERENCES CENTER(NAME),
  TEACHER_REF REF TEACHER,
  STUDENTS STUDENT_ARR
);INSERT INTO CLASS
SELECT '0722T03', '徐汇', REF(VALUE(T)),
STUDENT_ARR(
STUDENT('张三', '0001155245'),
STUDENT('李四', '0001152444'),
STUDENT('王五', '0001155242'),
STUDENT('赵六', '0001158357')
)
FROM TABLE(SELECT TEACHERS FROM CENTER WHERE NAME = '徐汇') T
WHERE NAME = '张老师';表结构简单来说就时有个CENTER表中有个个TEACHER的嵌套表,CLASS表中的TEACHER_REF字段希望引用该TEACHER嵌套表中的某记录,但在最后实行插入是报缺少右括号,但我实在找不出什么地方缺右括号啊。

解决方案 »

  1.   

    调试了一下,感觉是 REF(VALUE(T)) 错,
    不知道其中的VALUE(T)能不能这样用的?
      

  2.   

    参考
    REF函数用于对象表的创建和插入,看下面的例子:--创建表对象Address_TP
    CREATE TYPE Address_TP AS OBJECT (
    address_id number,
    street VARCHAR2(40),
    building VARCHAR2(40),
    phone VARCHAR2(15)
    );
    --创建表对象Student_TP
    CREATE TYPE Student_TP AS OBJECT (
    Name VARCHAR2(15),
    Age NUMBER,
    Address REF Address_TP
    );
    --创建对象表Address
    CREATE TABLE Address OF Address_TP (
    PRIMARY KEY (address_id)
    );
    --创建对象表Student
    CREATE TABLE Student OF Student_TP (
    PRIMARY KEY (Name)
    );--插入数据
    INSERT INTO Address VALUES (
    1,'BeijingJianGuoMenWaiDaJie','Buiding-A','010-88888888');
    INSERT INTO Address VALUES (
    2,'BeijingChangAnJie','Buiding-B','010-99999999');
    INSERT INTO Student
    SELECT 'LIHUA',22,REF(A)
    FROM Address A
    WHERE building = 'Buiding-A';
    INSERT INTO Student
    SELECT 'ZHANGMING',21,REF(A)
    FROM Address A
    WHERE building = 'Buiding-B';--验证
    select S.Name
    from address A
    ,student S
    where A.building = 'Buiding-A'
    and S.address = REF(A)/*其实相当于多建立了一个Join列。在Forms DataBlock 创建过程中,Block Wizard会自动将Student表中的Address列视为Lookup域对象,可直接创建LOV*/
      

  3.   

    个人认为REF(VALUE(T))是不能这样用的.
    values() 返回的是表中的对象即:TEACHERS
    而ref(参数);参数的类型要求为对象表的别名.
    我测试了一个这个语句:
    SELECT VALUE(T)  FROM TABLE(SELECT TEACHERS FROM CENTER WHERE NAME = '徐汇') T
    WHERE NAME = '张老师';
    返回:TEACHER('张老师', '01-1月 -80')
    这好像不是一个对象表吧,而REF()的参数要求是个对象表别名.不知道这样分析有没有问题?
      

  4.   

    我自己的分析是REF()要求其参数必须是对象表的别名
    而我的代码中VALUE(T)得到的却是一个对象
    所以不能这么用,我在考虑是不是要用到对象视图自己顶一下
      

  5.   

    原因很简单:
       REF的是一个OBJECT, 没有实例化
    而INSERT...SELECT的时候挑出来的是一个实例, 不能完成从实例到类型的转换
      

  6.   

    把CLASS表改成如下:
    CREATE TABLE CLASS(
      CLASSID VARCHAR2(7) PRIMARY KEY,
      CENTER_NAME VARCHAR2(4) REFERENCES CENTER(NAME),
      TEACHER_REF TEACHER_TABLE,
      STUDENTS STUDENT_ARR
    ) NESTED TABLE TEACHER_REF STORE AS CLASS_TEA再把INSERT...SELECT改成:
    INSERT INTO CLASS
    SELECT '0722T03', '徐汇', CAST(MULTISET(SELECT VALUE(T)
                                            FROM TABLE(SELECT TEACHERS FROM CENTER WHERE NAME = '徐汇') T
                                            WHERE T.NAME = '张老师') AS TEACHER_TABLE),
    STUDENT_ARR(
    STUDENT('张三', '0001155245'),
    STUDENT('李四', '0001152444'),
    STUDENT('王五', '0001155242'),
    STUDENT('赵六', '0001158357')
    )
    FROM DUAL;
    就可以了