Solved

problem with CAST MULTISET

Posted on 2009-05-11
3
1,095 Views
Last Modified: 2013-12-18
I'm learning how to use CAST MULTISET.  The following resulted in an error ("ORA-00904 : Invalid identifier" for the syntax "candidates.experiences").  What would be the correct way to do this?
CREATE OR REPLACE TYPE t_experience AS OBJECT

(

    companyname    varchar2(20),

    position       varchar2(20),

    noofyears      number(2)

);

/

 

CREATE OR REPLACE TYPE t_experience_tbl AS TABLE OF t_experience; 

/

 

CREATE TABLE candidates

(

    name            varchar2(20),

    experiences     t_experience_tbl

) NESTED TABLE experiences STORE AS experiences_tab;

/

 

INSERT INTO candidates VALUES

(

    'John',

    t_experience_tbl

    (

        t_experience('A company','Software Engineer',3),

        t_experience('B company','System Analyst',2),

        t_experience('C company','Research Fellow',4)

     )

);

/

 

INSERT INTO candidates VALUES

(

    'Jack',

    t_experience_tbl

    (

        t_experience('E company','Hardware Engineer',3),

        t_experience('F company','Data Analyst',5),

        t_experience('G company','Database Admin',5)

     )

);

/

 

DECLARE

  l_tempTable t_experience_tbl;

 

BEGIN

  SELECT experiences INTO l_tempTable FROM candidates WHERE name = 'John';

  SELECT experiences MULTISET UNION l_tempTable INTO l_tempTable FROM candidates WHERE name = 'Jack';

 

  FOR i IN l_tempTable.FIRST .. l_tempTable.LAST LOOP

    DBMS_OUTPUT.PUT_LINE(l_tempTable(i).companyname || ' ' || l_tempTable(i).position || ' ' || l_tempTable(i).noofyears);

  END LOOP;

 

  -- everything works fine up to this point --

  -- then I added this part to play with CAST MULTISET

  -- to see if I can get it to do the work of the few lines of code above

  

  SELECT CAST (MULTISET (SELECT * FROM TABLE(candidates.experiences)) AS t_experience_tbl) INTO l_tempTable FROM dual;

 

  FOR i IN l_tempTable.FIRST .. l_tempTable.LAST LOOP

    DBMS_OUTPUT.PUT_LINE(l_tempTable(i).companyname || ' ' || l_tempTable(i).position || ' ' || l_tempTable(i).noofyears);

  END LOOP;

END;

/

Open in new window

0
Comment
Question by:n_fortynine
  • 2
3 Comments
 
LVL 11

Accepted Solution

by:
Andytw earned 500 total points
ID: 24412200
If you want to use CAST( MULTISET(  ) ) then see the code below:
DECLARE

   l_tempTable t_experience_tbl;
 

BEGIN

   SELECT experiences

   INTO   l_tempTable

   FROM   candidates

   WHERE  NAME = 'John';

   SELECT experiences MULTISET

   UNION l_tempTable

   INTO   l_tempTable

   FROM   candidates

   WHERE  NAME = 'Jack';
 

   FOR i IN l_tempTable.FIRST .. l_tempTable.LAST LOOP

      DBMS_OUTPUT.PUT_LINE(l_tempTable(i).companyname || ' ' || l_tempTable(i).position || ' ' || l_tempTable(i).noofyears);

   END LOOP;
 

   -- everything works fine up to this point --

   -- then I added this part to play with CAST MULTISET

   -- to see if I can get it to do the work of the few lines of code above
 

   /*SELECT CAST(MULTISET (SELECT *

                FROM   TABLE(candidates.experiences)) AS t_experience_tbl)

   INTO   l_tempTable

   FROM   dual;*/

   SELECT CAST(MULTISET (SELECT e.companyname,

                    e.position,

                    e.noofyears

             FROM   candidates c,

                    TABLE(c.experiences) e

             WHERE  c.NAME IN ('John', 'Jack')) AS t_experience_tbl) experiences

   into l_tempTable          

   FROM   dual;

   
 

   FOR i IN l_tempTable.FIRST .. l_tempTable.LAST LOOP

      DBMS_OUTPUT.PUT_LINE(l_tempTable(i).companyname || ' ' || l_tempTable(i).position || ' ' || l_tempTable(i).noofyears);

   END LOOP;

END;

/

Open in new window

0
 
LVL 11

Assisted Solution

by:Andytw
Andytw earned 500 total points
ID: 24412222
However, I think the following is a lot more readable:

SELECT t_experience(e.companyname, e.position, e.noofyears)
BULK COLLECT INTO l_tempTable
FROM   candidates c,
             TABLE(c.experiences) e
WHERE  c.NAME IN ('John', 'Jack');
0
 
LVL 4

Author Comment

by:n_fortynine
ID: 24427720
Ah, thanks for pointing out the correct syntax.  If you don't mind me asking, what is the purpose of CAST MULTISET then, when BULK COLLECT will work just as well?  (Should I make a separate question?)
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Why doesn't the Oracle optimizer use my index? Querying too much data Most Oracle developers know that an index is useful when you can use it to restrict your result set to a small number of the total rows in a table. So, the obvious side…
Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
This video explains at a high level about the four available data types in Oracle and how dates can be manipulated by the user to get data into and out of the database.
This video explains what a user managed backup is and shows how to take one, providing a couple of simple example scripts.

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now