2009-08-24 9 views
5

Mam następujący kod:ORA-00933: polecenie SQL nie prawidłowo zakończony

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; 

koniec;

Kiedy go uruchomić, Oracle daje mi się następujący komunikat o błędzie:

prod_name from dba_xy.product; 
         * 

błędu na linii 8: ORA-06550: linia 8, kolumna 29: PL/SQL: ORA-00933: SQL komenda nie prawidłowo zakończony ORA-06550: wiersz 3, kolumna 2: PL/SQL: Oświadczenie SQL ignorowane

Co staram się zrobić, to połączyć istniejący prod_id i usługą PROD_NAME z nowymi danymi umieszczonymi w tabeli wysyłki. Ustawiłem prod_name jako unikalny klucz w tabeli produktów i prod_id jako klucz podstawowy i ustawiłem oba jako ograniczenia klucza obcego w tabeli wysyłki. Muszę umieścić nazwę prod_name w tabeli wysyłki, aby umożliwić czytelnikom tabeli lepsze zrozumienie, jaka nazwa prod_name musi zostać znaleziona itd., A nie tylko podanie prod_id, które nie będzie miało dla nich żadnego sensu. Ale może pomyślałem, że nie potrzebuję prod_id w tabeli wysyłkowej. Proszę o pomoc.

Po wkropleniu kolumnę prod_id z tabeli wysyłki, i zmieniać mi kod:

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; 

koniec; /

i następujący komunikat o błędzie pojawił się o unikalnej przymusu: rozpocząć * BŁĄD w linii 1: ORA-00001 : UNIQUE (DBA_XY.PROD_NAME_UC) naruszył ORA-06512: w wierszu 3

Odpowiedz

0

Czy otrzymujesz wyjątkowe naruszenie ograniczenia, ponieważ wstawiasz te same wiersze dwa razy? Czy "i" powinno być używane w klauzuli where instrukcji insert lub czy naprawdę chcesz wstawić dwa wiersze?

Twoja pierwsza instrukcja ma dwa zdania FROM, dlatego pojawia się błąd składniowy.

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

Twój ORA-00933 Błąd spowodowany jest nieprawidłowo sformatowany 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; 

... kiedy powinno to być:

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; 

Byłaś brakujący przecinek do oddzielenia kolumny prod_id i prod_name oraz dodatkowo zawierał nadmiarową deklarację Dba_xy.product w niewłaściwym miejscu.

To powiedziawszy, tabela dba_xy.despatch powinna zawierać tylko prod_id. Jeśli potrzebujesz zapewnić czytelną dla człowieka wersję danych, polecam skonstruować model view. Przykład:

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

Próbowałem uruchomić swój kod widoku i pojawił się następujący błąd: dołączyć dba_xy.produkt p * BŁĄD w linii 5: ORA-00905: brakujące słowo kluczowe – taksIV

+0

Moje złe - Zapomniałem rzeczywistych kryteriów JOIN. Wypróbuj teraz kod widoku. –

+0

Haha, to wszystko dobrze. Dziękuję Ci. – taksIV