システムは、マクロのテキストに構文エラーがないかどうかを検査しますが、EXEC文およびDDL文中の意味的なエラーについては検査しません。そのため、構文的には有効ながら、意味的には無効なマクロが作成される可能性があります。その場合、メッセージは返されません。
マクロの定義に意味的なエラーがある場合、メッセージはマクロの実行時にリクエスト側に返されます。
たとえば、システムで定義されていないマクロのEXECリクエストを含むマクロ定義を作成または置換することは可能です。以下の例は、実行されるマクロno_such_macroがデータベースで定義されていないものの、エラーを返すことなくマクロを作成します。
CREATE MACRO test_macro AS ( EXEC no_such_macro;);
システムはリクエストに応じてマクロを作成します。意味的なエラーはtest_macroの実行を試みなければ発見されません。
EXEC test_macro; EXEC test_macro; *** Failure 3824 Macro 'no_such_macro' does not exist. Statement# 1, Info =0 *** Total elapsed time was 1 second.
意味的な正しさを保証できないというこの問題は、EXECリクエストとDDLリクエストに限定されます。マクロ定義にいずれかのDMLリクエストが含まれる場合は、それらの文によって参照されるオブジェクトの存在が必要になります。存在していない場合、システムはマクロの作成の試みをアボートします。
次のCREATE MACROリクエストには、存在しないtable_1というテーブルへの参照が含まれています。table_1は存在しないため、システムはそのリクエストをアボートし、リクエスト側にエラーを返します。
CREATE MACRO test_macro_2 AS ( SELECT * FROM table_1;); CREATE MACRO test_macro_2 AS (SELECT * FROM table_1;); *** Failure 3807 Object 't1' does not exist. Statement# 1, Info =0 *** Total elapsed time was 1 second.