【问题标题】:Oracle select query from table with custom datatypesOracle 从具有自定义数据类型的表中选择查询
【发布时间】:2017-05-04 23:50:47
【问题描述】:

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

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

我可以在表格上运行 SELECT 并仅选择 JOBID 列并获得结果,但是一旦我尝试选择任何自定义 DataType 列,我就会收到错误 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

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

谢谢。

编辑: 自定义类型之一的示例:

CREATE type msgheadertype as object
( destination       destinationtype
, org           varchar2(20)
)

编辑2: 我看了PAYLOADLISTTYPE,还是有点不一样:

CREATE type payloadlisttype as table of transactiontype

然后transactiontype:

CREATE TYPE transactiontype as object
( header            headertype
, data          datatype
)

headertypedatatype 然后也嵌套自定义数据类型,其中嵌套自定义类型,自定义数据类型向下 7 层,如果有区别的话

编辑3: 查询 ALL_OBJECTS 以获得顶级数据类型返回:

OBJECT_NAME, OBJECT_TYPE, STATUS
----------------------------------
MSGHEADERTYPE,   TYPE,    VALID
MSGHEADERTYPE,   SYNONYM, VALID
PAYLOADLISTTYPE, TYPE,    VALID

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

【问题讨论】:

  • 我建议您首先检查这些数据类型在数据库中是否有效。然后,在此处提供这些数据类型结构,以便我们提供任何帮助。
  • @JorgeCampos 我添加了一种数据类型。我不是 Oracle 专家,能否提供一个如何检查数据类型是否有效的示例?
  • 类似于:select object_name, object_type, status from user_objects where OBJECT_NAME = 'MSGHEADERTYPE'
  • @JorgeCampos 我运行了脚本,它没有返回任何记录,我也在没有where 的情况下运行它来尝试查看是否有任何记录,但它也没有返回任何结果。

标签: oracle custom-data-type


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    使用表别名:

    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
    

    【讨论】:

    • 表别名没有解决问题,但试图获取属性返回一个更具体的错误:ORA-00904: "J"."MSGHEADER"."DESTINATION": invalid identifier 它对所有属性返回相同的错误,属性匹配选择的一个.
    猜你喜欢
    • 2017-02-28
    • 2015-12-03
    • 2014-09-08
    • 2017-08-27
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多