PSQL Programmer's Guide (v11)

SQL 制御ステートメント

ストアド プロシージャの本体内でのみ制御ステートメントを使用できます。これらのステートメントは、プロシージャの実行を制御します。制御ステートメントは以下のとおりです。

複合ステートメント

複合ステートメントは、ほかのステートメントをグループ化します。

BEGIN
   DECLARE :NumEnrolled INTEGER;
   DECLARE :MaxEnrollment INTEGER;

   DECLARE :failEnrollment CONDITION
      FOR SQLSTATE '09000';

   SET :NumEnrolled = (SELECT COUNT (*)
      FROM Enrolls
      WHERE Class_ID = classId);

   SET :MaxEnrollment = (SELECT Max_Size
      FROM Class
      WHERE ID = classId);

   IF (:NumEnrolled >= :MaxEnrollment) THEN
      SIGNAL :failEnrollment ELSE
      SET :NumEnrolled = :NumEnrolled + 1;
   END IF; 
END 

ストアド プロシージャまたはトリガーの本体内で複合ステートメントを使用できます。トリガーの詳細については、SQL トリガーを参照してください。

ほかの複合ステートメント内に複合ステートメントをネストできますが、最も外側の複合ステートメントだけに DECLARE ステートメントを取り込むことができます。

複合ステートメントの構文の詳細については、『SQL Engine Reference』で 「BEGIN [ATOMIC]」 を参照してください。

IF ステートメント

IF ステートメントは、条件の真の値に基づいて条件付き実行を行います。

IF (:counter = :NumRooms) THEN
   LEAVE Fetch_Loop; 
END IF; 

IF ステートメントの構文の詳細については、『SQL Engine Reference』で 「IF」 を参照してください。

LEAVE ステートメント

LEAVE ステートメントは、複合ステートメントまたは Loop ステートメントから離れることによって実行を続けます。

LEAVE Fetch_Loop 

LEAVE ステートメントは、ラベル付き複合ステートメント内またはラベル付き Loop ステートメント内に現れるはずです。LEAVE ステートメントからのステートメント ラベルは、LEAVE を含むラベル付きステートメントのラベルと同じでなければなりません。このラベルは、対応ラベルと呼ばれています。


メモ

複合ステートメントには、Loop ステートメントを取り込むことができます。Loop ステートメントを埋め込むことができるので、LEAVE ステートメントのステートメント ラベルは埋め込みループのラベルまたはストアド プロシージャの本体のラベルに一致します。


LEAVE ステートメントの構文の詳細については、『SQL Engine Reference』で 「LEAVE」 を参照してください。

LOOP ステートメント

LOOP ステートメントは、ステートメント ブロックの実行を繰り返します。

FETCH_LOOP: 
LOOP 
   FETCH NEXT cRooms INTO CurrentCapacity;

   IF (:counter = :NumRooms) THEN
      LEAVE FETCH_LOOP;
   END IF;

   SET :counter = :counter + 1;
   SET :TotalCapacity = :TotalCapacity + :CurrentCapacity; 
END LOOP; 

SQL ステートメント リスト内の各ステートメントがエラーなく実行され、また、Pervasive PSQL に LEAVE ステートメントが発生しないか、ハンドラーを呼び出す場合は、LOOP ステートメントの実行が繰り返されます。LOOP ステートメントは、与えられた条件が真である間に実行が継続されるという点で、WHILE ステートメントに似ています。

LOOP ステートメントに開始ラベルがある場合、このステートメントはラベル付き LOOP ステートメントと呼ばれます。終了ラベルを指定する場合、そのラベルは開始ラベルと同じでなければなりません。

LOOP ステートメントの構文の詳細については、『SQL Engine Reference』で 「LOOP」 を参照してください。

WHILE ステートメント

WHILE ステートメントは、指定された条件が真である間にステートメント ブロックの実行を繰り返します。

FETCH_LOOP: 
WHILE (:counter < :NumRooms) DO 
   FETCH NEXT cRooms INTO :CurrentCapacity; 
   IF (SQLSTATE = '02000') THEN 
     LEAVE FETCH_LOOP; 
   END IF; 
 
   SET :counter = :counter + 1; 
   SET :TotalCapacity = :TotalCapacity + :CurrentCapacity; 
END WHILE; 

Pervasive PSQL は、ブール値の式を評価します。その値が真であれば、Pervasive PSQL は SQL ステートメント リストを実行します。SQL ステートメント リスト内の各ステートメントがエラーなく実行され、また、LEAVE ステートメントが発生しない場合は、Loop ステートメントの実行が繰り返されます。ブール値の式が偽または不明である場合、Pervasive PSQL は Loop ステートメントの実行を終了します。

WHILE ステートメントに開始ラベルがある場合、このステートメントはラベル付き WHILE ステートメントと呼ばれます。終了ラベルを指定する場合、そのラベルは開始ラベルと同じでなければなりません。WHILE ステートメントの構文の詳細については、『SQL Engine Reference』で 「WHILE」 を参照してください。


SQL 変数ステートメント

SQL トリガー