Reputation: 1217
I have inherited a project with an old Oracle database with tables that contain custom datatype columns:
CREATE TABLE JOB_DOWNLOAD (
JOBID NUMBER(8) NOT NULL,
MSGHEADER MSGHEADERTYPE, --Custom DataType
PAYLOAD PAYLOADLISTTYPE --Custom DataType
);
I can run a SELECT
on the table and select just the JOBID
column and get results, however as soon as I try to select any of the custom DataType columns I receive the error ORA-00904: : invalid identifier
I have searched around and everything suggests it is due to an invalid column name. I have tried the following queries, all return the same error message:
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
Is there anything else I can do to help diagnose the cause of the error?
Thanks.
Edit: An example of one of the custom types:
CREATE type msgheadertype as object
( destination destinationtype
, org varchar2(20)
)
Edit2:
I looked at the PAYLOADLISTTYPE
and it is slightly different:
CREATE type payloadlisttype as table of transactiontype
Then transactiontype
:
CREATE TYPE transactiontype as object
( header headertype
, data datatype
)
headertype
and datatype
then also nest custom data types, which nest custom types, there are custom datatypes down 7 layers if that makes a difference
Edit3:
Querying ALL_OBJECTS
for the top level data types returns:
OBJECT_NAME, OBJECT_TYPE, STATUS
----------------------------------
MSGHEADERTYPE, TYPE, VALID
MSGHEADERTYPE, SYNONYM, VALID
PAYLOADLISTTYPE, TYPE, VALID
I only ran this against the top level data types, does it need to be done at all levels?
Upvotes: 3
Views: 5400
Reputation: 906
Easiest way is to convert the PL/SQL type column to XML:
SELECT XMLTYPE( MSGHEADER ),
XMLTYPE(PAYLOAD)
FROM JOB_DOWNLOAD;
If you want to display only specific values, use extractvalue:
SELECT extractvalue( XMLTYPE( MSGHEADER ), 'PAYLOADLISTTYPE/DESTINATION')
FROM JOB_DOWNLOAD;
You might want to inspect te resulting XML to find out what the actual path is you want to provide as a parameter in the extractvalue function.
Upvotes: 1
Reputation: 167932
Use a table alias:
SELECT JOBID,
j.MSGHEADER,
j.PAYLOAD
FROM JOB_DOWNLOAD j
or, to get the attributes within the types:
SELECT JOBID,
j.MSGHEADER.destination,
j.MSGHEADER.org,
j.PAYLOAD.column1,
j.PAYLOAD.column2
FROM JOB_DOWNLOAD j
Upvotes: 1