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


14

我想使用一种ASSERT例程,其功能与其他语言中发现的例程类似,即一种构造(它是一种过程,语法...)

ASSERT( <condition>, <msg>)

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

我知道手工完成这项工作很简单,但是我想问一下DBMS是否提供了一个标准的工具。

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


不,您将必须建立自己的。如今,不切实际的门槛很低:)
Vincent Malgrat 2012年

Answers:


11

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

有两种解决方法。您可以按照本Oracle文章中的讨论手动引发异常,也可以为该raise_application_error过程编写包装,该包装在文档的Oracle异常处理部分中进行了介绍。

我还要补充说,异常是为这种情况而设计的,因此最好还是先离开程序员的帽子,再戴上DBA的帽子:)


7

内置的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;
/

1
DBMS_ASSERT的目标是SQL解析,因此我没有提及它。
Philᵀᴹ

1
@Phil,这就是为什么我说范围狭窄。也许应该将其范围缩小。:)
Leigh Riffel 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.