Oracle PL / SQL có một thói quen ASSERT tiêu chuẩn không?


14

Tôi muốn sử dụng một thói quen ASSERT có chức năng tương tự như thói quen được tìm thấy trong các ngôn ngữ khác, tức là một cấu trúc (có thể là một thủ tục, cú pháp ...)

ASSERT( <condition>, <msg>)

sao cho khi <condition>thông qua trong đối số đầu tiên là sai, một ngoại lệ được đưa ra với <msg>thông báo mô tả được chỉ định .

Tôi biết điều này là tầm thường khi làm bằng tay nhưng tôi đang hỏi liệu có một tiêu chuẩn nào được cung cấp với DBMS không.

Việc phải viết một cái của riêng tôi hoặc nhập một gói từ các gói của 3 bên sẽ là không thực tế, vì tôi cần nó phải hoàn toàn di động và minh bạch cho mọi dự án tôi đang làm.


Không, bạn sẽ phải xây dựng của riêng bạn. Tính không thực tế hiện nay có ngưỡng thấp :)
Vincent Malgrat

Câu trả lời:


11

Không có quy trình xác nhận tích hợp trong SQL hoặc PL / SQL, vì vậy bạn sẽ phải tự viết.

Có hai cách để đi về điều này. Bạn có thể tự đưa ra một ngoại lệ, như được thảo luận trong bài viết này của Oracle hoặc bạn có thể viết một trình bao bọc cho raise_application_errorthủ tục, được ghi lại trong xử lý ngoại lệ của Oracle phần trong tài liệu.

Tôi sẽ thêm rằng các trường hợp ngoại lệ được thiết kế cho loại kịch bản này, vì vậy bạn nên bỏ mũ lập trình viên của mình trong một giây và sử dụng mũ DBA của bạn :)


7

Việc xây dựng trong DBMS_ASSERT gói là một phiên bản trong gang tấc scoped về những gì bạn đang tìm kiếm. Đối với các khẳng định khác Phil là chính xác, bạn sẽ phải xây dựng của riêng bạn. Đây là một minh chứng đơn giản về tùy chọn thứ hai trong câu trả lời của Phil +1 :

set serveroutput on size 1000000
Declare

   Procedure Assert (pCondition In Number, pMessage In Varchar2) Is
   Begin
      If (pCondition = 1) Then
         Return; 
      End If;
      Raise_Application_Error(-20001, pMessage);
   End Assert;

Begin
   DBMS_Output.Put_Line('Start');

   Assert(Case When 1+1=2 Then 1 Else 0 End,'Something is wrong 1.');
   Assert(Case When 1+1=9 Then 1 Else 0 End,'Something is wrong 2.');

   DBMS_Output.Put_Line('End');
End;
/

1
DBMS_ASSERT được nhắm mục tiêu vào phân tích cú pháp SQL, do đó tôi không đề cập đến nó.
Philᵀᴹ

1
@ Phil và đó là lý do tại sao tôi nói trong phạm vi hẹp. Có lẽ đó là phạm vi cực kỳ hẹp. :)
Leigh Riffel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.