Oracle从具有自定义数据类型的表中选择查询

时间:2017-05-04 23:50:48

标签: oracle custom-data-type

我继承了一个带有旧Oracle数据库的项目,该数据库包含自定义数据类型列的表:

CREATE TABLE JOB_DOWNLOAD (
    JOBID      NUMBER(8) NOT NULL,
    MSGHEADER  MSGHEADERTYPE,  --Custom DataType
    PAYLOAD    PAYLOADLISTTYPE --Custom DataType
);

我可以在桌面上运行SELECT并只选择JOBID列并获取结果,但是当我尝试选择任何自定义DataType列时,我会收到错误{{1 }}

我一直在搜索,一切都表明这是由于列名无效。我尝试了以下查询,都返回相同的错误消息:

ORA-00904: : invalid identifier

我还能做些什么来帮助诊断错误原因吗?

感谢。

编辑: 其中一种自定义类型的示例:

SELECT * FROM JOB_DOWNLOAD
SELECT JOBID, MSGHEADER, PAYLOAD, FROM JOB_DOWNLOAD
SELECT MSGHEADER  FROM JOB_DOWNLOAD
SELECT PAYLOAD FROM JOB_DOWNLOAD
SELECT MSGHEADER AS "MessageHead" FROM JOB_DOWNLOAD

EDIT2: 我查看了CREATE type msgheadertype as object ( destination destinationtype , org varchar2(20) ) ,它略有不同:

PAYLOADLISTTYPE

然后CREATE type payloadlisttype as table of transactiontype

transactiontype
然后

CREATE TYPE transactiontype as object ( header headertype , data datatype ) headertype嵌套自定义数据类型,这些类型嵌套自定义类型,如果存在差异,则自定义数据类型为7层

EDIT3: 查询datatype顶级数据类型返回:

ALL_OBJECTS

我只针对顶级数据类型运行此操作,是否需要在所有级别完成?

2 个答案:

答案 0 :(得分:0)

使用表别名:

SELECT JOBID,
       j.MSGHEADER,
       j.PAYLOAD
FROM   JOB_DOWNLOAD j

或者,获取类型中的属性:

SELECT JOBID,
       j.MSGHEADER.destination,
       j.MSGHEADER.org,
       j.PAYLOAD.column1,
       j.PAYLOAD.column2
FROM   JOB_DOWNLOAD j

答案 1 :(得分:0)

最简单的方法是将PL / SQL类型列转换为XML:

SELECT XMLTYPE( MSGHEADER ),
XMLTYPE(PAYLOAD)
FROM JOB_DOWNLOAD;

如果只想显示特定值,请使用extractvalue:

SELECT extractvalue( XMLTYPE( MSGHEADER ), 'PAYLOADLISTTYPE/DESTINATION')
FROM JOB_DOWNLOAD;

您可能想检查生成的XML,以找出要在extractvalue函数中作为参数提供的实际路径。