Oracle PL/SQL 是否有标准的 ASSERT 例程?

use*_*430 16 oracle error-handling

我想使用功能上类似于其他语言中的 ASSERT 例程,即构造(无论是过程,语法......)

ASSERT( <condition>, <msg>)
Run Code Online (Sandbox Code Playgroud)

这样,当<condition>传入的第一个参数为 false 时,会引发带有指定<msg>描述性消息的异常。

我知道手工做这件事很简单,但我想知道DBMS 是否提供了标准的。

必须自己编写一个或从 3rdy-party 包中导入一个是不切实际的,因为我需要它对我正在处理的每个项目都是完全可移植和透明的。

Phi*_*lᵀᴹ 11

SQL 或 PL/SQL 中没有内置断言过程,因此您必须编写自己的断言过程。

有两种方法可以解决这个问题。您可以手动引发异常,如这篇 Oracle 文章 中所述,或者您可以为该raise_application_error过程编写一个包装器,这在文档的Oracle 异常处理部分进行了介绍。

我要补充一点,异常是为这种场景设计的,所以你最好暂时脱掉你的程序员帽子并使用你的 DBA 帽子:)


Lei*_*fel 8

内置的DBMS_ASSERT包是您正在寻找的范围狭窄的版本。对于 Phil 是正确的其他断言,您将必须构建自己的断言。这是 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;
/
Run Code Online (Sandbox Code Playgroud)