我继承了一个带有旧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
我只针对顶级数据类型运行此操作,是否需要在所有级别完成?
答案 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函数中作为参数提供的实际路径。