Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

ORA-00907:thiếu dấu ngoặc đơn bên phải

ORA-00907:thiếu dấu ngoặc đơn bên phải

Đây là một trong số các thông báo lỗi chung cho biết mã của chúng tôi chứa một hoặc nhiều lỗi cú pháp. Đôi khi nó có thể có nghĩa là chúng ta đã bỏ qua một dấu ngoặc phải theo nghĩa đen; điều đó đủ dễ dàng để xác minh xem chúng tôi có đang sử dụng trình chỉnh sửa có dấu ngoặc vuông không khả năng (hầu hết các trình soạn thảo văn bản dành cho người viết mã đều có). Nhưng thường thì nó có nghĩa là trình biên dịch đã gặp một từ khóa ngoài ngữ cảnh. Hoặc có lẽ đó là một từ sai chính tả, một khoảng trắng thay vì một dấu gạch dưới hoặc một dấu phẩy bị thiếu.

Thật không may, những lý do có thể xảy ra tại sao mã của chúng tôi không biên dịch là hầu như vô hạn và trình biên dịch không đủ thông minh để phân biệt chúng. Vì vậy, nó đưa ra một thông báo chung chung, hơi khó hiểu, như ORA-00907: missing right parenthesis và giao nó cho chúng tôi để phát hiện ra người nở hoa thực sự.

Tập lệnh đã đăng có một số lỗi cú pháp. Trước tiên, tôi sẽ thảo luận về lỗi gây ra ORA-0097 nhưng bạn sẽ cần phải sửa tất cả.

Ràng buộc khóa ngoại có thể được khai báo cùng với cột tham chiếu hoặc ở cấp bảng sau khi tất cả các cột đã được khai báo. Chúng có các cú pháp khác nhau; tập lệnh của bạn kết hợp cả hai và đó là lý do tại sao bạn nhận được ORA-00907.

Khai báo trong dòng không có dấu phẩy và không bao gồm tên cột tham chiếu.

CREATE TABLE historys_T    (
    history_record    VARCHAR2 (8),
    customer_id       VARCHAR2 (8) 
          CONSTRAINT historys_T_FK FOREIGN KEY REFERENCES T_customers ON DELETE CASCADE,
    order_id           VARCHAR2 (10) NOT NULL,
          CONSTRAINT fk_order_id_orders REFERENCES orders ON DELETE CASCADE)

Ràng buộc mức bảng là một thành phần riêng biệt và do đó, có dấu phẩy và đề cập đến cột tham chiếu.

CREATE TABLE historys_T    (
    history_record    VARCHAR2 (8),
    customer_id       VARCHAR2 (8),    
    order_id           VARCHAR2 (10) NOT NULL,
    CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customers ON DELETE CASCADE,   
   CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders ON DELETE CASCADE)

Đây là danh sách các lỗi cú pháp khác:

  1. Bảng được tham chiếu (và khóa chính được tham chiếu hoặc ràng buộc duy nhất) phải tồn tại trước khi chúng tôi có thể tạo khóa ngoại chống lại chúng. Vì vậy, bạn không thể tạo khóa ngoại cho HISTORYS_T trước khi bạn tạo ORDERS được tham chiếu bảng.
  2. Bạn đã viết sai chính tả tên của các bảng được tham chiếu trong một số mệnh đề khóa ngoại (LIBRARY_TFORMAT_T ).
  3. Bạn cần cung cấp một biểu thức trong mệnh đề DEFAULT. Đối với các cột DATE thường là ngày hiện tại, DATE DEFAULT sysdate .

Nhìn vào mã của chính mình với con mắt tinh tường là một kỹ năng mà tất cả chúng ta cần đạt được để thành công với tư cách là nhà phát triển. Việc làm quen với tài liệu của Oracle thực sự hữu ích. So sánh song song mã của bạn và các ví dụ trong Tham chiếu SQL sẽ giúp bạn giải quyết các lỗi cú pháp này trong vòng chưa đầy hai ngày. Tìm nó tại đây (11g) và tại đây (12c).

Cũng như lỗi cú pháp, tập lệnh của bạn có lỗi thiết kế. Đây không phải là thất bại, mà là thực hành xấu không nên trở thành thói quen.

  1. Bạn chưa đặt tên cho hầu hết các ràng buộc của mình. Oracle sẽ đặt cho chúng một cái tên mặc định nhưng nó sẽ là một cái tên kinh khủng và khiến từ điển dữ liệu khó hiểu hơn. Đặt tên rõ ràng cho mọi ràng buộc giúp chúng ta điều hướng cơ sở dữ liệu vật lý. Nó cũng dẫn đến các thông báo lỗi dễ hiểu hơn khi SQL của chúng ta vi phạm ràng buộc.
  2. Đặt tên cho các ràng buộc của bạn một cách nhất quán. HISTORY_T có các ràng buộc được gọi là historys_T_FKfk_order_id_orders , cả hai đều không hữu ích. Một quy ước hữu ích là <child_table>_<parent_table>_fk . Vì vậy, history_customer_fkhistory_order_fk tương ứng.
  3. Có thể hữu ích khi tạo các ràng buộc bằng các câu lệnh riêng biệt. Tạo bảng sau đó tạo khóa chính rồi khóa ngoại sẽ tránh được các vấn đề với thứ tự phụ thuộc đã xác định ở trên.
  4. Bạn đang cố gắng tạo khóa ngoại theo chu kỳ giữa LIBRARY_TFORMATS . Bạn có thể làm điều này bằng cách tạo các ràng buộc trong câu lệnh riêng biệt nhưng đừng làm thế:bạn sẽ gặp vấn đề khi chèn các hàng và thậm chí là các vấn đề tồi tệ hơn với việc xóa. Bạn nên xem xét lại mô hình dữ liệu của mình và tìm cách mô hình hóa mối quan hệ giữa hai bảng sao cho một bảng là bảng cha và bảng còn lại là bảng con. Hoặc có lẽ bạn cần một mối quan hệ khác, chẳng hạn như một bảng giao nhau.
  5. Tránh các dòng trống trong tập lệnh của bạn. Một số công cụ sẽ xử lý chúng nhưng một số thì không. Chúng ta có thể định cấu hình SQL * Plus để xử lý chúng nhưng tốt hơn là bạn nên tránh trường hợp cần thiết.
  6. Quy ước đặt tên của LIBRARY_T là xấu xí. Cố gắng tìm một cái tên biểu cảm hơn, không yêu cầu hậu tố không cần thiết để tránh xung đột từ khóa.
  7. T_CUSTOMERS thậm chí còn xấu hơn, vừa không phù hợp với các bảng khác của bạn và hoàn toàn không cần thiết, với tư cách là customers không phải là một từ khóa.

Đặt tên cho mọi thứ thật khó. Bạn sẽ không tin những lời phẫn nộ mà tôi đã có về bảng tên trong nhiều năm. Điều quan trọng nhất là tính nhất quán. Nếu tôi xem từ điển dữ liệu và thấy các bảng có tên T_CUSTOMERSLIBRARY_T phản ứng đầu tiên của tôi sẽ là sự nhầm lẫn. Tại sao các bảng này được đặt tên với các quy ước khác nhau? Sự khác biệt về khái niệm là gì điều này thể hiện? Vì vậy, hãy quyết định một quy ước đặt tên và tuân theo. Đặt tên bảng của bạn hoặc tất cả là số ít hoặc tất cả số nhiều. Tránh các tiền tố và hậu tố càng nhiều càng tốt; chúng tôi đã biết đó là một bảng, chúng tôi không cần T_ hoặc _TAB .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quá trình nâng cấp từng bước lên R12.2 Nâng cấp phần -3

  2. Zero Data Loss Appliance Recovery Appliance

  3. Lớp nhóm kết nối Oracle

  4. Truy vấn SQL Oracle:Truy xuất các giá trị mới nhất cho mỗi nhóm dựa trên thời gian

  5. Tại sao ddl tĩnh không được phép trong PL / SQL?