Home » SQL & PL/SQL » SQL & PL/SQL » Oracle Type with Member (Oracle, 19.2, Linux)
Oracle Type with Member [message #690489] Fri, 26 June 2026 13:52 Go to next message
Duane
Messages: 593
Registered: December 2002
Senior Member
Hello,

Just trying to see if this can be done a different way.

Resolution:  I'm wanting the values within the "Name" column to be in separate columns.  

Not sure if that can be done or not with my current SQL statement.  That's why I'm asking.


Table/Table Data

create table fallen_stars 
  (id varchar2(9),
   first_name varchar2(60),
   middle_name varchar2(60),
   last_name  varchar2(60));

Insert into FALLEN_STARS (ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME) values ('123','Elvis','Aaron','Presley');
Insert into FALLEN_STARS (ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME) values ('456','James',null,'Dean');
Insert into FALLEN_STARS (ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME) values ('789','Marilyn ','Jeane','Monroe');

Type

create or replace type FallenStarsType as object(ID         varchar2(9),
                                                 Name       varchar2(400),
                                                 FirstName  varchar2(60),
                                                 MiddleName varchar2(60),
                                                 LastName   varchar2(60));

create or replace type FallenStarsTable as table of FallenStarsType;

Oracle Type Spec/Body

create or replace type Stars as object (ID       varchar2(9),
                                        NameType varchar2(30),

  member function StarID return varchar2,
  member function Name   return FallenStarsTable pipelined);

create or replace type body Stars as 

  member function StarID return varchar2 is

    StarIDNumber fallen_stars.id%type;

    begin
      select id
        into StarIDNumber
        from fallen_stars
          where id = self.ID;    

      return StarIDNumber;

    exception
      when no_data_found
        then
          return '';

    end StarID;


  member function Name return FallenStarsTable pipelined is

    Name       varchar2(400);
    FirstName  fallen_stars.first_name%type;
    LastName   fallen_stars.last_name%type;
    MiddleName fallen_stars.middle_name%type;
    
    cursor DataElements is
      select id,
             trim(first_name) first_name,
             trim(last_name) last_name,
             trim(middle_name) middle_name,
             case
               when upper(self.NameType) = 'FIRST'
                 then
                   trim(first_name)

               when upper(self.NameType) = 'LAST'
                 then
                   trim(last_name)

               when upper(self.NameType) = 'FIRSTLAST'
                 then
                   trim(first_name)||' '||trim(last_name)

               when upper(self.NameType) = 'LASTFIRST'
                 then
                   trim(last_name)||', '||trim(first_name)

               when upper(self.NameType) = 'FIRSTMIDDLELAST'
                 then
                   trim(first_name)||' '||trim(middle_name)||' '||trim(last_name)

               when upper(self.NameType) = 'LASTFIRSTMIDDLE'
                 then
                   trim(last_name)||', '||trim(first_name)||' '||trim(middle_name)

                 else
                   null
             end name
        from fallen_stars
          where id = self.ID;

    begin
      for i in DataElements
        loop
          pipe row (FallenStarsType(i.id,
                                    i.name,
                                    i.first_name,
                                    i.middle_name,
                                    i.last_name));
        end loop;
       
      return;

    exception
      when no_data_found
        then
          raise;
          
    end Name;

end;

Query

select Stars(id, null).StarID() ID,
       Stars(id, 'LASTFIRST').Name() Name
  from fallen_stars
    order by ID

This is after I click within the "Name" column.

[img]/forum/fa/14876/0/[/img]


Query 2


This query provides the data elements into separate columns but I'm unsure how to integrate this with the fallen_stars table.

select *
  from Stars(123, 'LASTFIRST').Name() Name



Re: Oracle Type with Member [message #690491 is a reply to message #690489] Wed, 01 July 2026 07:37 Go to previous messageGo to next message
Solomon Yakobson
Messages: 3312
Registered: January 2010
Location: Connecticut, USA
Senior Member
You need Stars member function Name to return object type, not table type:

create or replace type StarsSY as object (
                                          ID       varchar2(9),
                                          NameType varchar2(30),

  member function StarID return varchar2,
  member function Name return FallenStarsType);
/
create or replace type body StarsSY as 

  member function StarID return varchar2 is

    StarIDNumber fallen_stars.id%type;

    begin
      select id
        into StarIDNumber
        from fallen_stars
          where id = self.ID;    

      return StarIDNumber;

    exception
      when no_data_found
        then
          return '';

    end StarID;


  member function Name return FallenStarsType is
    v_res FallenStarsType;
    begin
      select FallenStarsType(
                             id,
                             trim(first_name),
                             trim(last_name),
                             trim(middle_name),
                             case
                               when upper(self.NameType) = 'FIRST' then trim(first_name)
                               when upper(self.NameType) = 'LAST' then trim(last_name)
                               when upper(self.NameType) = 'FIRSTLAST' then trim(first_name)||' '||trim(last_name)
                               when upper(self.NameType) = 'LASTFIRST' then trim(last_name)||', '||trim(first_name)
                               when upper(self.NameType) = 'FIRSTMIDDLELAST' then trim(first_name)||' '||trim(middle_name)||' '||trim(last_name)
                               when upper(self.NameType) = 'LASTFIRSTMIDDLE' then trim(last_name)||', '||trim(first_name)||' '||trim(middle_name)
                             end
                            )
        into v_res
        from fallen_stars
        where id = self.ID;
        return v_res;
    exception
      when no_data_found
        then
          raise;
    end Name;
end;
/
Now:

select * from table(select cast(collect(StarsSY(ID, 'LASTFIRST').Name()) as FALLENSTARSTABLE) from fallen_stars);

ID    NAME                 FIRSTNAME            MIDDLENAME           LASTNAME
----- -------------------- -------------------- -------------------- --------------------
123   Elvis                Presley              Aaron                Presley, Elvis
456   James                Dean                                      Dean, James
789   Marilyn              Monroe               Jeane                Monroe, Marilyn

SQL>
You will need to use

select *
  from FALLENSTARSTABLE(StarsSY(123, 'LASTFIRST').Name()) Name
instead of

select *
  from Stars(123, 'LASTFIRST').Name() Name
Or you could have both member functions.

SY.
Re: Oracle Type with Member [message #690492 is a reply to message #690489] Wed, 01 July 2026 09:37 Go to previous messageGo to next message
Solomon Yakobson
Messages: 3312
Registered: January 2010
Location: Connecticut, USA
Senior Member
Actually, you can get rid of member function StarID and add ID as member function Name parameter:

create or replace type StarsX as object (NameType varchar2(30),

  member function Name(p_id varchar2) return FallenStarsTable pipelined);
/
create or replace type body StarsX as 
  member function Name(p_id varchar2) return FallenStarsTable pipelined is

    Name       varchar2(400);
    FirstName  fallen_stars.first_name%type;
    LastName   fallen_stars.last_name%type;
    MiddleName fallen_stars.middle_name%type;
    
    cursor DataElements is
      select id,
             trim(first_name) first_name,
             trim(last_name) last_name,
             trim(middle_name) middle_name,
             case
               when upper(self.NameType) = 'FIRST'
                 then
                   trim(first_name)

               when upper(self.NameType) = 'LAST'
                 then
                   trim(last_name)

               when upper(self.NameType) = 'FIRSTLAST'
                 then
                   trim(first_name)||' '||trim(last_name)

               when upper(self.NameType) = 'LASTFIRST'
                 then
                   trim(last_name)||', '||trim(first_name)

               when upper(self.NameType) = 'FIRSTMIDDLELAST'
                 then
                   trim(first_name)||' '||trim(middle_name)||' '||trim(last_name)

               when upper(self.NameType) = 'LASTFIRSTMIDDLE'
                 then
                   trim(last_name)||', '||trim(first_name)||' '||trim(middle_name)

                 else
                   null
             end name
        from fallen_stars
          where id like p_ID;

    begin
      for i in DataElements
        loop
          pipe row (FallenStarsType(i.id,
                                    i.name,
                                    i.first_name,
                                    i.middle_name,
                                    i.last_name));
        end loop;
       
      return;

    exception
      when no_data_found
        then
          raise;
          
    end Name;

end;
/
Now:

select * from StarsX('LASTFIRST').Name('%');

ID    NAME                 FIRSTNAME            MIDDLENAME           LASTNAME
----- -------------------- -------------------- -------------------- --------------------
123   Presley, Elvis       Elvis                Aaron                Presley
456   Dean, James          James                                     Dean
789   Monroe, Marilyn      Marilyn              Jeane                Monroe

SQL>
Or:

select * from StarsX('LASTFIRST').Name('123');

ID    NAME                 FIRSTNAME            MIDDLENAME           LASTNAME
----- -------------------- -------------------- -------------------- --------------------
123   Presley, Elvis       Elvis                Aaron                Presley

SQL>
SY.
Re: Oracle Type with Member [message #690493 is a reply to message #690489] Wed, 01 July 2026 16:17 Go to previous message
Duane
Messages: 593
Registered: December 2002
Senior Member
This is wonderful, thank you so much.
Previous Topic: 4 CONSECTIVE ABSENT NEXT REST MARK ABSENT
Next Topic: Please help me tune the query (merged)
Goto Forum:
  


Current Time: Sun Jul 19 14:48:46 CDT 2026