Type declaration:
CREATE TYPE INTERVENTO_TY AS OBJECT( Testo VARCHAR2(20), Timestmp DATE ) NOT FINAL; CREATE TYPE COMMENTO_TY UNDER INTERVENTO_TY( Ordine VARCHAR2(20) ); CREATE TYPE POST_TY UNDER INTERVENTO_TY( Titolo VARCHAR2(20), MEMBER PROCEDURE AddCom(Ordine VARCHAR2, Testo VARCHAR2, Timestmp Date) ); CREATE TYPE AUTORE_TY AS OBJECT( Nome VARCHAR2(20), Cognome VARCHAR2(20), IdAutore INT ); CREATE TYPE MEDIA_TY AS OBJECT( Tipo VARCHAR2(20), Nome VARCHAR2(20), IdMedia INT, Titolo VARCHAR2(20) ); CREATE TYPE SCRIVE_INTERVENTO AS TABLE OF REF INTERVENTO_TY; CREATE TYPE DI_AUTORE AS TABLE OF REF AUTORE_TY; ALTER TYPE INTERVENTO_TY ADD ATTRIBUTE DI DI_AUTORE CASCADE; ALTER TYPE AUTORE_TY ADD ATTRIBUTE SCRIVE SCRIVE_INTERVENTO CASCADE; CREATE TYPE IN_INTERVENTO AS TABLE OF REF INTERVENTO_TY; CREATE TYPE CONTIENE_MEDIA AS TABLE OF REF MEDIA_TY; ALTER TYPE INTERVENTO_TY ADD ATTRIBUTE CONTIENE CONTIENE_MEDIA CASCADE; ALTER TYPE MEDIA_TY ADD ATTRIBUTE IN_INT IN_INTERVENTO CASCADE; CREATE TYPE COMMENTATO_POST AS TABLE OF REF COMMENTO_TY; ALTER TYPE COMMENTO_TY ADD ATTRIBUTE A REF POST_TY CASCADE; ALTER TYPE POST_TY ADD ATTRIBUTE COMMENTATO COMMENTATO_POST CASCADE; CREATE TABLE AUTORE_TAB OF AUTORE_TY NESTED TABLE SCRIVE STORE AS SCRIVE_NESTED; CREATE TABLE INTERVENTO_TAB OF INTERVENTO_TY NESTED TABLE DI STORE AS DI_NESTED NESTED TABLE CONTIENE STORE AS CONTIENE_NESTED; CREATE TABLE MEDIA_TAB OF MEDIA_TY NESTED TABLE IN_INT STORE AS IN_INT_NESTED;
I am trying to insert the REF of the newly created POST_TY into the nested table SCRIVE of AUTORE_TY but it gives me this error:
DECLARE
   post POST_TY;
   post_ref REF INTERVENTO_TY;
BEGIN   
   post := new POST_TY('title', SYSDATE, DI_AUTORE((SELECT REF(A) 
                                                    FROM AUTORE_TAB A 
                                                    WHERE IdAutore = 1)), 
                        CONTIENE_MEDIA(), 'text', COMMENTATO_POST()
                       );
   INSERT INTO INTERVENTO_TAB VALUES(post);
   
   SELECT REF(post) INTO post_ref 
   FROM DUAL;
   
   INSERT INTO TABLE(SELECT A.scrive
                     FROM AUTORE_TAB A
                     WHERE A.IdAutore = 1)
   VALUES(postref);
   
END;
/
ORA-06550: line 5, column 56: PLS-00122: CURSOR as separator is allowed only with specific built-in functions ORA-06550: line 0, column 0: PLS-00801: internal error [56402]
Advertisement
Answer
You can solve it using:
DECLARE
  post_ref REF INTERVENTO_TY;
BEGIN   
  INSERT INTO INTERVENTO_TAB t
  VALUES(
    POST_TY(
      'title',
      SYSDATE,
      DI_AUTORE(
        (SELECT REF(A) FROM AUTORE_TAB A WHERE IdAutore = 1)
      ), 
      CONTIENE_MEDIA(),
      'text',
      COMMENTATO_POST()
    )
  )
  RETURNING REF(t) INTO post_ref;
   
  INSERT INTO TABLE(
    SELECT A.scrive FROM AUTORE_TAB A WHERE A.IdAutore = 1
  )
  VALUES( post_ref );
END;
/
I’m not exactly sure what the issue was but it did not appear to work populating the DI_AUTORE collection in the PL/SQL scope but if you move the creation into the INSERT statement which is an SQL (and not PL/SQL) statement then it works.
Similarly, you can’t create a REF to the PL/SQL post variable; you need to create it referencing a table row.
db<>fiddle here