使用TABLE(...)与对象类型时遇ORA-00907缺失右括号错误求助
解决ORA-00907: missing right parenthesis错误
嘿,我来帮你搞定这个报错!你遇到的ORA-00907错误,根源出在REF(VALUE(a))的写法不符合Oracle对引用操作的语法规则。
错误原因拆解
REF()函数的作用是获取对象表中某一行的引用,但当你用TABLE(c.airports)展开嵌套表时,a代表的是嵌套表中存储的AirportType对象实例本身——并非对象表中的行记录。VALUE(a)返回的就是这个实例,直接对它套用REF()会触发语法错误,因为REF()不接受对象实例作为参数。
解决方案
根据你的需求,分两种情况处理:
情况1:你只需要获取机场对象的内容(不需要引用)
如果只是想查询符合条件的机场数据,完全不需要用REF(),直接用VALUE(a)获取对象实例,或者直接查询属性:
-- 获取完整的机场对象 SELECT VALUE(a) FROM CITY c, TABLE(c.airports) a WHERE a.code = 'LHR'; -- 或者直接查询指定属性 SELECT a.code, a.Size FROM CITY c, TABLE(c.airports) a WHERE a.code = 'LHR';
情况2:你确实需要获取机场对象的引用
要获取嵌套表中对象的引用,得调整你的类型和表结构,让嵌套表存储对象引用而非实例:
- 先创建机场对象类型和对应的对象表:
CREATE TYPE AirportType AS OBJECT( Code varchar2(10), Size int ); -- 创建专门存储机场对象的表 CREATE TABLE Airport OF AirportType;
- 定义存储对象引用的嵌套表类型:
CREATE TYPE AirportRefListType AS TABLE OF REF AirportType;
- 重新定义城市类型并创建表:
CREATE TYPE CityType AS OBJECT( Name varchar2(30), Airports AirportRefListType ); CREATE TABLE CITY OF CityType NESTED TABLE Airports STORE AS Airport_Ref_Tab;
- 插入数据时,先插入机场对象,再引用它们:
-- 先插入机场对象 INSERT INTO Airport VALUES(AirportType('LHR', 999)); -- 引用已存在的机场对象插入城市 INSERT INTO CITY VALUES(CityType('London', AirportRefListType( (SELECT REF(a) FROM Airport a WHERE a.code = 'LHR') )));
- 现在可以正常查询引用了:
-- 获取引用并解析对象内容 SELECT DEREF(a.COLUMN_VALUE) FROM CITY c, TABLE(c.airports) a WHERE DEREF(a.COLUMN_VALUE).code = 'LHR'; -- 或者直接获取引用本身 SELECT a.COLUMN_VALUE FROM CITY c, TABLE(c.airports) a WHERE DEREF(a.COLUMN_VALUE).code = 'LHR';
备选方案:不修改现有结构获取引用
如果不想改动现有类型和表,也可以通过查询嵌套表的存储表Airport_Tab来获取引用(因为你的嵌套表是存储为对象表Airport_Tab的):
SELECT REF(at) FROM CITY c, TABLE(c.airports) a, Airport_Tab at WHERE a.code = 'LHR' AND at.code = a.code AND at.Size = a.Size;
注意:这种方式依赖于机场对象属性的唯一性,如果有属性完全相同的机场,会返回重复引用,所以更推荐前面的结构调整方案。
内容的提问来源于stack exchange,提问作者AwesomeGuy
相关产品推荐
相关产品推荐

