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