2016-03-27 3 views
0

ich diese Prozedur 'TT1_ajoute_person_dans_album' schrieb die OID von Album Zeile in der verschachtelten Tabelle der Spalte 'Album' in der Tabelle 'Personnage'PL/SQL: ORA-00936: fehlende Ausdruck

Create or replace PROCEDURE TT1_ajoute_person_dans_album(pnum IN NUMBER,anum IN NUMBER) IS 
BEGIN 
INSERT INTO TABLE (SELECT ALBUMS from TT1_PERSONNAGE_TABLE where NUMP=pnum) 
values (SELECT REF(a) from TT1_ALBUM_TABLE a where a.NUMA=anum); 
    COMMIT; 
END TT1_ajoute_person_dans_album; 

Diejenigen einfügen die Objekte sind:

Create Type TT1_Album_Type As Object(NumA Number, Titre Varchar(50), Annee_Pub Number, Album_Suiv Varchar(50)); 

Create Type TT1_Album_NT_Type As Table OF REF TT1_Album_Type ; 
Create Type TT1_Personnage_Type As Object(NumP Number, Nom Varchar(40), Prenom Varchar(40), Profession varchar(50), Sexe Varchar(1), Genre Varchar(20), albums TT1_Album_NT_Type); 

Aber eine Nachricht erschien ERROR at line 6: PL/SQL: ORA-00936: missing expression

Was ist los?

+0

Huh? Die INSERT-Anweisung ist wirklich vermasselt. https://docs.oracle.com/database/121/SQLRF/statements_9014.htm#SQLRF01604 – OldProgrammer

+0

Es wäre hilfreich, wenn Sie Ihre Frage bearbeiten und die Definitionen von 'TT1_PERSONNAGE_TABLE' und' TT1_ALBUM_TABLE' hinzufügen würden. Vielen Dank. –

+0

@OldProgrammer Aus dem Syntax-Abschnitt Ihres Links gehen Sie zu ['insert_into_clause'] (https://docs.oracle.com/database/121/SQLRF/statements_9014.htm#i2121694)> [' DML_table_expression_clause'] (https://docs.oracle.com/database/121/SQLRF/statements_9014.htm#i2126242)> ['table_collection_expression'] (https://docs.oracle.com/database/121/SQLRF/statements_9014.htm#i2121871) und Sie finde die Syntax dort. – MT0

Antwort

0

Die Syntax für das Einfügen in eine geschachtelte Tabelle lautet INSERT INTO TABLE(subquery) VALUES (values). Die Unterabfrage hat jedoch die Syntax (SELECT nested_table_column FROM table_name WHERE ...). Wenn Sie also die Klammern um die Unterabfrage beachten, benötigen Sie zwei Klammern. Das gleiche gilt für die VALUES Klausel:

Create or replace PROCEDURE TT1_ajoute_person_dans_album(
    pnum IN NUMBER, 
    anum IN NUMBER 
) IS 
BEGIN 
    INSERT INTO TABLE(
    (SELECT ALBUMS FROM TT1_PERSONNAGE_TABLE WHERE NUMP=pnum) 
) VALUES (
    (SELECT REF(a) FROM TT1_ALBUM_TABLE a WHERE a.NUMA=anum) 
); 
    COMMIT; 
END TT1_ajoute_person_dans_album; 
/

Auch sind Sie wirklich sicher, dass Sie eine COMMIT in dem Verfahren ausgegeben werden soll? Wenn Sie mehrere Prozeduren haben, die jeweils Commits enthalten und eine fehlschlägt, können Sie nicht alle zurücksetzen.