16.20 - SQL_statement - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ定義言語 構文規則および例

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-162K-JPN
Language
日本語 (日本)

SQLリクエストを指定します。マクロのどのリクエストも、セミコロン文字で終了する必要があります。

マクロ本体で参照されるパラメータ名の前には、COLON(:))文字を付ける必要があります。マクロの中に別のマクロを実行するEXECUTEリクエストを含めることもできます。

行レベル セキュリティの管理のSQL DCL文とDDL文はマクロで許可されていません。

例: ABORTまたはROLLBACK条件の指定

定義内にABORTリクエストまたはROLLBACKリクエストを組み入れることにより、マクロの実行を中止させる条件を指定します。実行中に指定された条件が検出されると、そのマクロはアボートされます。進行中のトランザクションは終了し、テーブルに対するロックは解除され、データに対して行なわれた変更は元に戻され、スプール出力は削除されます。

例として、部門番号が300の重役室に従業員を加えないようnew_employeeマクロを使用不能にするためには、次のようにABORTリクエストをマクロの指定に組み込みます。

    CREATE MACRO personnel.new_employee
     (number    (SMALLINT     FORMAT '9(5)'), 
      name      (VARCHAR(12)), 
      dept      (SMALLINT     FORMAT '999'), 
      position  (VARCHAR(12)), 
      birthdate (DATE         FORMAT 'MMMbDDbYYYY'), 
      sex       (CHARACTER(1)) 
      education (BYTEINT))   AS
    (
    (ABORT 'Department 300 not valid' 
     WHERE :dept = 300;
     INSERT INTO employee (empno,name,deptno,jobtitle,dob,sex,edlev)
     VALUES (:number,:name,:dept,:position,:birthdate,:sex,:education);     );

ABORTキーワードに続けて、任意のエラー メッセージをAPOSTROPHE文字で囲んで指定します。このメッセージは、指定された条件でこのマクロがアボートされた場合に、端末の画面に表示されます。この例では、ABORTリクエストのWHERE句の中でアボート条件:dept = 300が指定されています。

例: ABORT条件を使用した削除

この例では、DELETEリクエストを示し、次にdepartmentテーブルのその従業員数が減らされるところを示しています。削除しようとする従業員の行がemployeeテーブルにない場合、ABORTリクエストでこのマクロの実行を終了させます。

次の例に、ANSIモードで使用するために設計されたマクロを示します。この例では、ユーザーは、削除および更新操作が正常に終了した場合に、コミットすることを希望しています。マクロ内のリクエストは、1つの複文リクエストとして処理されます。そのため、ROLLBACK文のWHERE条件を満たした場合、リクエスト全体がアボートされ、empcountの値は保護されます。

    CREATE MACRO delete_employee 
     (num   SMALLINT    FORMAT '9(5)', 
      dname VARCHAR(12), 
      dept  SMALLINT    FORMAT '999') AS
    (ABORT 'Name does not exist' 
     WHERE :num NOT IN (SELECT empno
                        FROM employee 
                        WHERE name = :dname);
          
     DELETE FROM employee 
     WHERE name = :dname;
          
     UPDATE department 
     SET empcount = empcount - 1
     WHERE deptno = :dept; 
     COMMIT WORK; );