Oracle PL / SQLには標準のASSERTルーチンがありますか?


14

私は、他の言語で見られるものと機能的に類似したASSERTルーチンを使用したいと思います。つまり、コンストラクト(プロシージャ、構文など)です。

ASSERT( <condition>, <msg>)

その<condition>ため、最初の引数で渡された値がfalseの場合、指定された<msg>説明メッセージで例外が発生します。

これは手で行うのは簡単ですが、DBMSで提供される標準的なものがあるかどうかを尋ねています。

自分で作成したり、サードパーティのパッケージからインポートしたりすることは、作業中のすべてのプロジェクトに対して完全に移植可能で透過的である必要があるため、実用的ではありません。


いいえ、独自に構築する必要があります。非現実性は最近低いしきい値を持っています:)
ビンセントマルグラート

回答:


11

SQLやPL / SQLには組み込みのアサーションプロシージャがないため、独自のアサーションプロシージャを作成する必要があります。

これを行うには2つの方法があります。このOracleの記事で説明されているように、手動で例外を発生させるかraise_application_error、ドキュメントのOracle例外処理セクションに記載されている手順のラッパーを作成できます。

例外はこの種のシナリオ用に設計されたものであるため、プログラマーの帽子を少し脱ぎ、DBAの帽子を使用する方が良いでしょう:)


7

ビルトインDBMS_ASSERTパッケージは、探しているものの狭い範囲のバージョンです。フィルが正しいと断言する他の人のために、あなたはあなた自身を構築する必要があります。以下は、Philの回答+1の2番目のオプションの簡単なデモンストレーションです。

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解析を対象としているため、言及していません。
フィリ

1
@Philそしてそれが私が狭い範囲で言った理由です。おそらくそれは非常に狭い範囲に限定されるべきです。:)
リーリフェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.