2009-08-24 29 views
5

Tôi có đoạn mã sau:ora-00.933: lệnh SQL không đúng cách kết thúc

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; 

cuối;

Khi tôi chạy nó, oracle mang lại cho tôi được thông báo lỗi sau:

prod_name from dba_xy.product; 
         * 

LỖI tại dòng 8: ORA-06.550: dòng 8, cột 29: PL/SQL: ORA-00.933: SQL lệnh không được kết thúc đúng cách ORA-06550: dòng 3, cột 2: PL/SQL: Câu lệnh SQL bị bỏ qua

Điều tôi đang cố gắng là liên kết prod_id và prod_name hiện tại với dữ liệu mới được chèn vào bảng. Tôi đã đặt prod_name làm khóa duy nhất trong bảng sản phẩm và prod_id làm khóa chính và đã đặt cả hai ràng buộc khóa ngoài trong bảng despatch. Tôi cần phải bao gồm prod_name vào bảng despatch để cho phép độc giả của bảng để có thêm sự hiểu biết về những gì prod_name cần phải được tìm thấy vv, thay vì chỉ cho prod_id mà sẽ làm cho không có ý nghĩa với họ cả. Nhưng có lẽ tôi đã nghĩ rằng tôi không cần prod_id trong bảng despatch. Xin vui lòng giúp đỡ.

Sau khi thả cột prod_id từ bảng mau lẹ, tôi thay đổi mã của tôi:

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; 

cuối; /

và thông báo lỗi sau đã đưa ra về những hạn chế duy nhất: bắt đầu * ERROR at line 1: ORA-00001: hạn chế duy nhất (DBA_XY.PROD_NAME_UC) vi phạm ORA-06.512: tại dòng 3

Trả lời

0

Bạn có thể nhận được vi phạm ràng buộc duy nhất vì bạn đang chèn cùng một hàng hai lần không? Là "i" nghĩa vụ phải được sử dụng trong mệnh đề where của câu lệnh chèn hoặc bạn có thực sự muốn các hàng được chèn hai lần không?

Câu lệnh đầu tiên của bạn có hai mệnh đề FROM, đó là lý do bạn nhận được lỗi cú pháp.

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

bạn ORA-00.933 lỗi là do một tuyên bố được định dạng không đúng CHỌN:

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; 

... khi nó nên là:

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; 

Bạn đã thiếu dấu phẩy để tách các cột prod_idprod_name và bổ sung có tuyên bố dba_xy.product thừa từ sai vị trí.

Điều đó cho biết, bảng dba_xy.despatch chỉ nên chứa prod_id. Nếu bạn cần cung cấp phiên bản dữ liệu có thể đọc được của con người, tôi khuyên bạn nên tạo một view. Ví dụ:

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

Tôi đã thử chạy mã xem của bạn và đã xảy ra lỗi sau: tham gia dba_xy.product p * L ERI tại dòng 5: ORA-00905: thiếu từ khóa – taksIV

+0

Tệ của tôi - Tôi đã quên tiêu chí JOIN thực tế. Hãy thử mã xem ngay bây giờ. –

+0

Haha, đó là tất cả tốt. Cảm ơn bạn. – taksIV

Các vấn đề liên quan