2009-08-24 12 views
5

Ich habe den folgenden Code:ora-00933: SQL-Befehl nicht richtig beendet

begin 
for i in 1..2 loop 
insert into dba_xy.despatch 
select desp_id_seq.nextval, 
     dbms_random.string('U',5), 
     trunc(dbms_random.value(0000,9999)), 
     prod_id from dba_xy.product 
       prod_name from dba_xy.product;   
end loop; 

Ende;

Wenn ich es laufen, Orakel gibt mir die folgende Fehlermeldung:

prod_name from dba_xy.product; 
         * 

FEHLER in Zeile 8: ORA-06550: Linie 8, Spalte 29: PL/SQL: ORA-00933: SQL Befehl beendet nicht richtig ORA-06550: Zeile 3, Spalte 2: PL/SQL: SQL-Anweisung ignoriert

Was ich versuche zu tun, verbinden die bestehenden prod_id und prod_name mit neuen Daten in die Versandtabelle eingefügt. Ich habe prod_name als eindeutigen Schlüssel in der Produkttabelle und prod_id als Primärschlüssel festgelegt und beide als Fremdschlüsselbeschränkungen in der Versandtabelle festgelegt. Ich muss den prod_name in die Versandtabelle aufnehmen, um den Lesern der Tabelle mehr Verständnis dafür zu geben, was prod_name gefunden werden muss usw., anstatt nur die prod_id anzugeben, die für sie überhaupt keinen Sinn ergibt. Aber vielleicht dachte ich, ich brauche prod_id nicht in der Tabelle. Bitte helfen.

Nach der prod_id Spalte aus der Depesche Tabelle löschen, geändert ich meinen Code:

begin 
for i in 1..2 loop 
insert into dba_xy.despatch 
select desp_id_seq.nextval, 
     dbms_random.string('U',5), 
     trunc(dbms_random.value(0000,9999)), 
       prod_name from dba_xy.product;   
end loop; 

Ende; /

und die folgende Fehlermeldung kam über die einzigartige Einschränkung up: ORA-00001:: unique constraint (DBA_XY.PROD_NAME_UC) verletzt ORA-06512: in Zeile 3

* FEHLER in Zeile 1 beginnt

Antwort

0

Konnten Sie die Einschränkung der eindeutigen Einschränkung erhalten, weil Sie die gleichen Zeilen zweimal einfügen? Soll "i" in der where-Klausel der insert-Anweisung verwendet werden oder möchten Sie wirklich, dass die Zeilen zweimal eingefügt werden?

Ihre erste Anweisung hat zwei FROM-Klauseln, weshalb Sie einen Syntaxfehler erhalten.

select desp_id_seq.nextval, 
      dbms_random.string('U',5), 
      trunc(dbms_random.value(0000,9999)), 
      prod_id, --from dba_xy.product 
       prod_name from dba_xy.product;  
3

Ihr ORA-00933 Fehler ist aufgrund einer falsch SELECT-Anweisung formatiert:

SELECT desp_id_seq.nextval, 
     dbms_random.string('U',5), 
     TRUNC(dbms_random.value(0000,9999)), 
     prod_id from dba_xy.product 
     prod_name from dba_xy.product; 

... wenn es sein sollte:

SELECT DESP_ID_SEQ.nextval, 
     DBMS_RANDOM.string('U',5), 
     TRUNC(DBMS_RANDOM.value(0000,9999)), 
     t.prod_id, 
     t.prod_name 
    FROM dba_xy.product t; 

Sie fehlten das Komma zu trennen die prod_id und prod_name Spalten und zusätzlich eine redundante FROM dba_xy.product-Deklaration an der falschen Stelle.

Das besagt, die dba_xy.despatch Tabelle sollte nur die prod_id enthalten. Wenn Sie eine lesbare Version der Daten bereitstellen müssen, empfehle ich Ihnen, eine view zu erstellen. Beispiel:

CREATE VIEW despatch_vw AS 
SELECT t.prod_id, 
     p.prod_name 
    FROM dba_xy.despatch t 
    JOIN dba_xy.product p ON p.prod_id = t.prod_id 
+0

Ich habe versucht, Ihre Ansicht Code ausgeführt und es kam mit dem folgenden Fehler: Join dba_xy.Produkt p * FEHLER bei Zeile 5: ORA-00905: fehlendes Schlüsselwort – taksIV

+0

Mein schlechtes - ich habe die tatsächlichen JOIN-Kriterien vergessen. Probieren Sie den Ansichtscode jetzt aus. –

+0

Haha, das ist alles gut. Vielen Dank. – taksIV