Type declaration:
x
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