2009-08-24 11 views
5

Ho il seguente codice:ora-00933: comando SQL non correttamente concluso

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; 

fine;

quando l'eseguo, oracolo mi dà il seguente messaggio di errore:

prod_name from dba_xy.product; 
         * 

ERRORE alla linea 8: ORA-06550: la linea 8, colonna 29: PL/SQL: ORA-00933: SQL comando non correttamente concluso ORA-06550: linea 3, colonna 2: PL/SQL: istruzione SQL ignorato

Quello che sto cercando di fare è collegare il prod_id e PROD_NAME esistenti con nuovi dati inseriti nella tabella di spedizione. Ho impostato prod_name come chiave univoca nella tabella del prodotto e prod_id come chiave primaria e ho impostato entrambi come vincoli di chiave esterna nella tabella di spedizione. Devo includere il prod_name nella tabella di distribuzione per consentire ai lettori della tabella di avere più comprensione di ciò che prod_name deve essere trovato ecc., Piuttosto che dare solo il prod_id che non avrà alcun senso per loro. Ma forse stavo pensando che non ho bisogno di prod_id nel tavolo delle spedizioni. Per favore aiuto.

Dopo aver lasciato la colonna prod_id dalla tabella spedizione, ho modificato il mio codice:

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; 

fine; /

e il seguente messaggio di errore è venuto fino a circa il vincolo univoco: iniziano * ERRORE alla linea 1: ORA-00001: vincolo univoco (DBA_XY.PROD_NAME_UC) violato ORA-06512: alla linea 3

risposta

0

È possibile ottenere la violazione del vincolo univoco perché si inseriscono due volte le stesse righe? Si suppone che "i" debba essere usato nella clausola where dell'istruzione insert o si desidera veramente che le righe vengano inserite due volte?

La prima frase ha due clausole FROM, motivo per cui si verifica un errore di sintassi.

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

tuo ORA-00933 errore è dovuto ad una dichiarazione non correttamente formattata SELECT:

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; 

... quando dovrebbe essere:

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; 

ti mancava la virgola per separare le colonne prod_id e prod_name e inoltre disponeva di una dichiarazione Dba_xy.product ridondante nella posizione errata.

Detto questo, la tabella dba_xy.despatch deve contenere solo il prod_id. Se è necessario fornire una versione leggibile dei dati, ti consigliamo di creare un view. Esempio:

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

ho provato a fare funzionare il codice di vista e si avvicinò con il seguente errore: unirsi dba_xy.prodotto p * ERRORE alla riga 5: ORA-00905: parola chiave mancante – taksIV

+0

Il mio male: ho dimenticato i criteri di JOIN effettivi. Prova ora il codice di visualizzazione. –

+0

Haha, va tutto bene. Grazie. – taksIV

Problemi correlati