...

SQL ストアド・プロシージャおよび埋め込みSQL

by user

on
Category: Documents
90

views

Report

Comments

Transcript

SQL ストアド・プロシージャおよび埋め込みSQL
Teradata Database
SQL ス ト ア ド ・ プ ロ シージ ャ および
埋め込み SQL
Release リ リ ース 15.0
B035-1148-015K-JPN
2014 年 3 月
本書に記載 さ れてい る 製品は、 Teradata Corporation ま たはその関連会社が ラ イ セ ン ス を有する 製品です。
Teradata、 Active Data Warehousing、 Active Enterprise Intelligence、 Applications-Within、 Aprimo Marketing Studio、 Aster、 BYNET、
Claraview、 DecisionCast、 Gridscale、 MyCommerce、 SQL-MapReduce、 Teradata Decision Experts、 Teradata Labs ロ ゴ、 Teradata
ServiceConnect、 Teradata Source Experts、 WebAnalyst、 お よ び Xkoto は、 Teradata Corporation ま たはその関連会社の米国お よ びその
他の国におけ る 商標ま たは登録商標です。
Adaptec お よ び SCSISelect は、 Adaptec, Inc. の商標ま たは登録商標です。
AMD Opteron お よ び Opteron は、 Advanced Micro Devices, Inc. の商標です。
Apache、 Apache Hadoop、 Hadoop、 お よ び黄色い象の ロ ゴは、 Apache Software Foundation の米国お よ びその他の国におけ る 登録商
標ま たは商標です。
Apple、 Mac、 お よ び OS X すべては、 Apple Inc. の登録商標です。
Axeda は、 Axeda Corporation の登録商標です。 Axeda Agents、 Axeda Applications、 Axeda Policy Manager、 Axeda Enterprise、 Axeda
Access、 Axeda Software Management、 Axeda Service、 Axeda ServiceLink、 お よ び Firewall-Friendly は、 Axeda Corporation の商標であ
り 、 Maximum Results お よ び Maximum Support は、 Axeda Corporation の役務商標です。
Data Domain、 EMC、 PowerPath、 SRDF、 お よ び Symmetrix は、 EMC Corporation の登録商標です。
GoldenGate は、 Oracle の商標です。
Hewlett-Packard お よ び HP は、 Hewlett-Packard Company の登録商標です。
Hortonworks、 Hortonworks ロ ゴお よ びその他の Hortonworks 商標は、 Hortonworks Inc. の米国お よ びその他の国におけ る 商標です。
Intel、 Pentium、 お よ び XEON は、 Intel Corporation の登録商標です。
IBM、 CICS、 RACF、 Tivoli、 お よ び z/OS は、 International Business Machines Corporation の登録商標です。
Linux は、 Linus Torvalds の登録商標です。
LSI は、 LSI Corporation の登録商標です。
Microsoft、 Active Directory、 Windows、 Windows NT、 お よ び Windows Server は、 Microsoft Corporation の米国お よ びその他の国にお
け る 登録商標です。
NetVault は、 Dell, Inc. の米国ま たはその他の国におけ る 商標ま たは登録商標です。
Novell お よ び SUSE は、 Novell, Inc. の米国お よ びその他の国におけ る 登録商標です。
Oracle、 Java、 お よ び Solaris は、 Oracle ま たはその関連会社の登録商標です。
QLogic お よ び SANbox は、 QLogic Corporation の商標ま たは登録商標です。
Quantum お よ び Quantum ロ ゴは、 Quantum Corporation の商標であ り 、 米国お よ びその他の国で登録 さ れてい ます。
Red Hat は、 Red Hat, Inc. の商標であ り 、 米国お よ びその他の国で登録 さ れてい ます。 ラ イ セン ス に基づいて使用 さ れます。
SAS お よ び SAS/C は、 SAS Institute Inc. の商標ま たは登録商標です。
SPARC は、 SPARC International, Inc. の登録商標です。
Symantec、 NetBackup、 お よ び VERITAS は、 Symantec Corporation ま たはその関連会社の米国お よ びその他の国におけ る 商標ま た
は登録商標です。
Unicode は、 Unicode, Inc. の米国お よ びその他の国におけ る 登録商標です。
UNIX は、 The Open Group の米国お よ びその他の国におけ る 登録商標です。
その他記載 さ れてい る 製品名お よ び企業名は、 各社の商標です。
本書に記載 さ れてい る 情報は、 「現状の ま ま」 提供 さ れ、 商用お よ び特定の用途での使用に対す る 適合性、 ま た
は権利侵害がない こ と に関す る 暗黙的な保証を含め、 明示的ま たは暗黙的なすべての保証は一切あ り ません。 一
部の法域では暗黙的保証の除外を許可 し ないため、 上記制限が適用 さ れない こ と があ り ます。 いかな る 場合 も
TERADATA CORPORATION は、 逸失利益ま たは逸失財産を含む、 あ ら ゆ る 間接的、 直接的、 特殊、 付随的、 ま たは
必然的な損害に対 し 、 た と えその よ う な損害の可能性を明示的に通知 さ れていた と し て も 、 責任を負 う こ と はあ
り ません。
本書に記載 さ れてい る 情報は、 日本では発表 さ れていないか も し く は利用で き ない機能、 製品やサービ ス を参照ま たは相互参照
し てい る 場合があ り ます。 こ れ ら の参照は、 必ず し も Teradata Corporation が日本で こ れ ら の機能、 製品やサービ ス を発表す る 意図
があ る こ と を意味す る も のではあ り ません。 日本で利用可能な機能、 製品やサービ ス については、 日本テ ラ デー タ 株式会社の担
当者に確認 く だ さ い。
本書に記載 さ れてい る 情報には、 技術的に不正確な記述ま たは誤植が含まれてい る 可能性があ り ます。 本書の情報は、 予告な し
に変更ま たは更新 さ れ る 場合があ り ます。 ま た、 Teradata Corporation は、 本書に記載 さ れてい る 製品やサービ ス を随時予告な し に
改良ま たは変更す る こ と がで き ます。
製品お よ びサービ ス の品質を維持す る ため、 本書の正確性、 明瞭性、 構成、 有用性について コ メ ン ト を頂け る と 幸いです。 次の
ア ド レ ス に E メ ールで連絡 く だ さ い。 [email protected]
Teradata Corporation に送 ら れた コ メ ン ト や資料 ( 「フ ィ ー ド バ ッ ク 」 と 総称す る ) は、 機密情報 と は見な さ れません。 Teradata
Corporation は、 フ ィ ー ド バ ッ ク に関 し ていかな る 種類の義務 も 負わず、 フ ィ ー ド バ ッ ク と その派生物を無償で制限な し に使用、
複製、 開示、 公開、 表示、 変換、 派生物の作成、 お よ び配布で き る も の と し ます。 さ ら に、 Teradata Corporation は、 その よ う な
フ ィ ー ド バ ッ ク に含まれ る 、 あ ら ゆ る 考え、 概念、 ノ ウ ハ ウ や技術を、 フ ィ ー ド バ ッ ク を組み込んだ製品やサービ ス の開発、 製
造、 ま たは販売を含め、 ど の よ う な目的にで も 自由に使用で き る も の と し ます。
Copyright © 2000-2014 by Teradata. All Rights Reserved.
ま えがき
目的
<SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL> は、 SQL を使っ てデー タ を操
作す る サーバーお よ び ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン を作成す る 方法について説
明 し てい ます。
対象読者
こ のマニ ュ アルの主な対象読者は、 アプ リ ケーシ ョ ン ・ プ ロ グ ラ マです。 こ のマ
ニ ュ アルは、 Teradata Database の設計、 保守、 お よ び使用を担当す る 、 シ ス テ ム
管理者、 デー タ ベース管理者、 セキ ュ リ テ ィ 管理者、 Teradata フ ィ ール ド 技術員、
お よ びその他の技術者に役立つ情報を記載 し てい ます。
サポー ト さ れる ソ フ ト ウ ェ ア ・ リ リ ース と オペ レ ー テ ィ ン
グ ・ シ ス テム
こ のマニ ュ アルは、 Teradata® Database 15.0 用です。
Teradata Database 15.0 は、 以下のオペレーテ ィ ン グ ・ シ ス テ ムでサポー ト さ れてい
ます。
• SUSE Linux Enterprise Server 10 SP3
• SUSE Linux Enterprise Server 11 SP1
Teradata Database ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンは他のオペレーテ ィ ン グ ・ シ ス
テ ムに対応 し てい ます。
前提条件
Teradata Database 管理シ ス テ ムの基本的な知識が必要な場合には、 本書をお読みに
な る 前に、 <Teradata 入門 > を読んでお く と 役立ち ます。
埋め込み SQL を使用 し た アプ リ ケーシ ョ ンの開発に関す る さ ら に詳 し い情報は、
<Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
3
ま えが き
こ のマニ ュ アルの改訂内容
こ のマ ニ ュ アルの改訂内容
リ リ ース
説明
Teradata Database 15.0
2014 年 3 月
• SET CRASH = WAIT_NOTELL ま たは NOWAIT_TELL 時のア
プ リ ケーシ ョ ン の動作を修正 し ま し た。
• Teradata ス ト ア ド ・ プ ロ シージ ャ では、 CREATE FUNCTION
文をサポー ト し ません。
• Teradata ス ト ア ド ・ プ ロ シージ ャ では、 JSON デー タ ・ タ イ
プ を使用 し た ロ ーカル変数の宣言をサポー ト し ます。
• JSON SQLDA エ ン コ ーデ ィ ン グ を新たに追加 し ま し た。
• ク ラ イ ア ン ト ・ サーバー間での対話のための独自の API と し
ての CLIv2 の用語集の定義を改訂 し ま し た。 リ リ ース 15.0 で
は、 ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン と Teradata Database の
間の通信のために、 JDBC と .NET API をサポー ト し ます。
追加情報
URL
説明
www.info.teradata.com/
「Teradata Information Products Publishing Library」 サ イ ト
では、 英語版について以下が可能です。
• マニ ュ アルを表示ま たはダ ウ ン ロ ー ド し ます。
1 [Downloadable Publications] で [General Search] を
選択 し ます。
2 検索基準を入力 し て [Search] を ク リ ッ ク し ます。
• マニ ュ アル CD-ROM を ダ ウ ン ロ ー ド し ます。
1 [Downloadable Publications] で [General Search] を
選択 し ます。
2 [Title or Keyword] フ ィ ール ド で CD-ROM と 入力 し 、
[Search] を ク リ ッ ク し ます。
www.teradata.com
Teradata ホームページには、 Teradata に関す る 情報を得 る
ための リ ン ク が多数用意 さ れてい ます。 次の リ ン ク があ
り ます。
• エグゼ ク テ ィ ブ ・ レ ポー ト 、 ホ ワ イ ト ・ ペーパー、
Teradata 導入企業の事例研究、 お よ び ソ ー ト ・ リ ー
ダーシ ッ プ
• 技術情報、 ソ リ ュ ーシ ョ ン、 お よ び専門的ア ド バ イ ス
• プ レ ス ・ リ リ ース、 関連記事、 お よ び メ デ ィ ア ・
リ ソ ース
4
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
ま えが き
製品安全情報
URL
説明
www.teradata.com/t/TEN/
Teradata Customer Education では、 ユーザーに よ る
Teradata への投資を最大限ま で活かす こ と がで き る よ う
にす る ため、 ユーザーの技術 と 能力を確立す る ための ト
レーニ ン グ を提供 し てい ます。
tays.teradata.com/
Teradata @ Your Service を利用すれば、 オ レ ン ジ ・ ブ ッ
ク 、 テ ク ニ カル ・ ア ラ ー ト 、 ナ レ ッ ジ ・ リ ポジ ト リ の参
照、 フ ォ ー ラ ムの閲覧 と 参加、 ソ フ ト ウ ェ ア ・ パ ッ チの
ダ ウ ン ロ ー ド を行な う こ と がで き ます。
developer.teradata.com/
Teradata Developer Exchange では、 Teradata 製品の使い方、
技術検討フ ォー ラ ム、 コ ー ド のダ ウ ン ロ ー ド な ど の コ ー
ナーを提供 し てい ます。
製品お よ びサービ ス の品質を維持す る ため、 本書の正確性、 明瞭性、 構成、 有用性
について コ メ ン ト を頂け る と 幸いです。 次のア ド レ ス に E メ ールで連絡 く だ さ い。
[email protected]
製品安全情報
こ のマニ ュ アルには、 数種類の製品の安全に関す る 注意書 き が記載 さ れてい る 場合
があ り ます。
安全情報の種類
説明
注記
注意を怠 る と 、 機器やデー タ な ど の財産に損傷を与え る 恐れがあ
る が、 人がケガ をす る 恐れはない状況を示 し ます。
注意
注意を怠 る と 、 人が軽微な ケ ガ ま たは中程度のケガ をす る 恐れが
あ る 危険な状況を示 し ます。
警告
避け ら れない場合、 死亡ま たは重症の人体への傷害を も た ら すお
それがあ る 危険な状況を示 し ます。
例:
注記 :
Reconfiguration ユーテ ィ リ テ ィ を不適切に使用す る と 、 デー タ が失われ る おそれが
あ り ます。
注意 :
ド ラ イ ブ ・ ト レ イ ・ シ ャ シーの重量は約 28.6 kg (63 lb) です。 必ず ド ラ イ ブ と モ
ジ ュ ールをすべて取 り 外 し てか ら 、 シ ャ シーの取 り 外 し ま たは取 り 付け を行な っ て
く だ さ い。
警告 :
感電の危険 ! 修理前は常に電源ま たはフ ァ ン ・ モジ ュ ールに電力が残っ ていない よ
う に し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
5
ま えが き
Teradata Database のオプシ ョ ン機能
Teradata Database のオ プ シ ョ ン機能
こ のマニ ュ アルには、 Teradata Database の以下のオプシ ョ ン機能 と 製品に関す る 説
明が含まれてい る 場合があ り ます。
• Teradata Columnar
• Teradata 行レベル ・ セキ ュ リ テ ィ
• Teradata SQL-H
• Teradata Temporal
• Teradata Virtual Storage (VS)
• Unity Source Link
こ れ ら の機能は適切な ラ イ セ ン ス がない と 使用で き ません。 こ れ ら の機能が製品
メ デ ィ アに含ま れていた り 、 ダ ウ ン ロ ー ド で き た り し て も 、 ま たは入手 し た資料
で説明 さ れていた と し て も 、 適切な ラ イ セ ン ス な し ではそれ ら の機能を使用で き
ません。
オプシ ョ ン機能の購入お よ び有効化については、 Teradata 営業担当者ま で ご連絡 く
だ さ い。
6
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
目次
ま えがき . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
対象読者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
サポー ト さ れ る ソ フ ト ウ ェ ア ・ リ リ ース と オペレーテ ィ ン グ ・ シ ス テ ム . . . . . . . . . 3
前提条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
こ のマニ ュ アルの改訂内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
追加情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
製品安全情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Teradata Database のオプシ ョ ン機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
第 1 章 : 序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
ス ト ア ド ・ プ ロ シージ ャ の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
埋め込み SQL の概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
第 2 章 : SQL カ ー ソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
カー ソ ルが必要な理由 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
カー ソ ルの タ イ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
カー ソ ルの状態お よ び位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
カー ソ ルが増分 さ れ る 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
カー ソ ル と ス ト ア ド ・ プ ロ シージ ャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
カー ソ ル と 埋め込み SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
ト ラ ンザ ク シ ョ ン と カー ソ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
定位置カー ソ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
7
目次
第 3 章 : SQL カ ー ソル制御および DML 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
ALLOCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
CLOSE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
DEALLOCATE PREPARE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
DECLARE CURSOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
DECLARE CURSOR ( 動的 SQL 形式 ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
DECLARE CURSOR ( マ ク ロ 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
DECLARE CURSOR ( 要求形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
DECLARE CURSOR ( 選択形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . 56
DELETE ( 定位置形式 ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
EXECUTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
EXECUTE IMMEDIATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
FETCH ( 埋め込み SQL 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
OPEN ( 埋め込み SQL 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
OPEN ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
POSITION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
PREPARE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
REWIND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
SELECT AND CONSUME … INTO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
SELECT … INTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
UPDATE ( 定位置形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
第 4 章 : 結果コ ー ド 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
SQLSTATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
SQLCODE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
ACTIVITY_COUNT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
ス ト ア ド ・ プ ロ シージ ャ での結果 コ ー ド 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
ス ト ア ド ・ プ ロ シージ ャ に関係す る 権限の付与 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
ス ト ア ド ・ プ ロ シージ ャ の権限チ ェ ッ ク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
目次
ス ト ア ド ・ プ ロ シージ ャ での SQL 文の使用に関す る 規則. . . . . . . . . . . . . . . . . . . . . 117
ス ト ア ド ・ プ ロ シージ ャ の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
ス ト ア ド ・ プ ロ シージ ャ の再 コ ンパ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
ス ト ア ド ・ プ ロ シージ ャ に関す る 制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
ス ト ア ド ・ プ ロ シージ ャ の語彙 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
ス ト ア ド ・ プ ロ シージ ャ の DDL 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
ス ト ア ド ・ プ ロ シージ ャ の DML 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
ス ト ア ド ・ プ ロ シージ ャ の DCL 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
ス ト ア ド ・ プ ロ シージ ャ の診断文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
ス ト ア ド ・ プ ロ シージ ャ での SQL 操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
ス ト ア ド ・ プ ロ シージ ャ 内の制御文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
完了条件、 例外条件、 お よ びユーザー定義条件のハン ド ラ ー . . . . . . . . . . . . . . . . . 138
カー ソ ル宣言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト の返送 . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
再帰的ス ト ア ド ・ プ ロ シージ ャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
ス ト ア ド ・ プ ロ シージ ャ のアーカ イ ブ、 コ ピーお よ び復元 . . . . . . . . . . . . . . . . . . . 147
ス ト ア ド ・ プ ロ シージ ャ と 戦術的問合わせ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
ス ト ア ド ・ プ ロ シージ ャ のデバ ッ グ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
ス ト ア ド ・ プ ロ シージ ャ のサンプル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
第 6 章 : 条件処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
条件処理の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
条件処理の用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
SQLSTATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
診断域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
条件 と 条件ハン ド ラ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
条件ハン ド ラ ーの タ イ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
条件の発生 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
制御文の処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
条件ハン ド ラ ーのルール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
入れ子の複合文の中の条件ハン ド ラ ーのルール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
ス テー タ ス変数の値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
個々の条件ハン ド ラ ーの優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
例外条件 ト ラ ンザ ク シ ョ ンの意義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
ハン ド ラ ー ・ ア ク シ ョ ンで発生す る 条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
9
目次
ハン ド ラ ー ・ ア ク シ ョ ンに よ っ て引 き 起 こ さ れた条件の報告のための規則 . . . . . 175
ス ト ア ド ・ プ ロ シージ ャ 内にあ る 複数の条件ハン ド ラ ー . . . . . . . . . . . . . . . . . . . . . 180
文固有の条件処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
DECLARE CONDITION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
DECLARE HANDLER ( 基本構文 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
DECLARE HANDLER (CONTINUE タ イ プ ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
DECLARE HANDLER (EXIT タ イ プ ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
DECLARE HANDLER (SQLEXCEPTION タ イ プ ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
DECLARE HANDLER (SQLWARNING タ イ プ ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
DECLARE HANDLER (NOT FOUND タ イ プ ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
診断域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
診断文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
SIGNAL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
RESIGNAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
GET DIAGNOSTICS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
第 7 章 : ホス ト 変数 と 複文要求. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
ホ ス ト 構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
ホ ス ト 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
入力ホ ス ト 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
出力ホ ス ト 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
ホ ス ト 変数 と し ての SQL 文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
標識変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
埋め込み SQL での複文要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
第 8 章 : SQL 制御文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
BEGIN … END. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
DECLARE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
ITERATE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
LEAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
LOOP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
REPEAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
10
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
目次
SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
第 9 章 : 静的埋め込み SQL 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
定位置カー ソ ルの文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
BEGIN DECLARE SECTION. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
COMMENT ( 戻 り 形式 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
DATABASE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
DECLARE STATEMENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
DECLARE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
END DECLARE SECTION. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
END-EXEC 文終了子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
EXEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
EXEC SQL 文先頭子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
INCLUDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
INCLUDE SQLCA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
INCLUDE SQLDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
WHENEVER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
第 10 章 : 動的埋め込み SQL 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
動的 SQL の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
SQL 文の動的な実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
動的 SQL 文の構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
DESCRIBE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
EXECUTE ( 動的 SQL 形式 ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
EXECUTE IMMEDIATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
PREPARE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
第 11 章 : ク ラ イ ア ン ト - サーバー接続文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンか ら Teradata Database への接続 . . . . . . . . . . . . . 367
CONNECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
GET CRASH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
LOGOFF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
11
目次
LOGON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
SET BUFFERSIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
SET CHARSET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
SET CONNECTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
SET CRASH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
SET ENCRYPTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン
非同期プ ログ ラ ミ ング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
埋め込み SQL を使用 し たマルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グ . . . . . . . . . . . . . . . . 399
マルチセ ッ シ ョ ン非同期要求プ ロ グ ラ ミ ン グのサポー ト . . . . . . . . . . . . . . . . . . . . . 402
ASYNC 文修飾子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
TEST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
WAIT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
付録 A: 表記法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
構文図の規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
付録 B: SQL 記述子領域 (SQLDA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
ANSI への準拠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
SQLDA を使用す る SQL 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
SQL 文が SQLDA を使用す る 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
アプ リ ケーシ ョ ン用の SQLDA の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
SQLDA の構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
SQLDA デー タ ・ タ イ プ ・ コ ー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
付録 C: SQL コ ミ ュ ニケーシ ョ ン領域 (SQLCA) . . . . . . . . . . . . . . . . . . . . . . . . 439
ANSI への準拠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
アプ リ ケーシ ョ ン用の SQLCA の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
ス テー タ ス変数の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
結果の報告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
12
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
目次
SQLCA フ ィ ール ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
SQLCODE 値の SQLSTATE 値へのマ ッ ピ ン グ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
CLI コ ー ド か ら SQLCODE 値へのマ ッ ピ ン グ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
付録 D: SQLSTATE のマ ッ ピ ング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
SQLSTATE コ ー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ . . . . . . . . . 453
CLI コ ー ド か ら SQLSTATE 値へのマ ッ ピ ン グ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
付録 E: SQL ス ト ア ド ・ プ ロ シージ ャ ・ コ マ ン ド 関数 コ ー ド . . . . . . . . . . . . . 463
付録 F: 性能に関する考慮事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
問合わせ設計を最適化す る ための更新可能カー ソ ルの使用 . . . . . . . . . . . . . . . . . . . 467
用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
13
目次
14
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第1章:
序
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL は、 カー ソ ルや動的 SQL な ど、 い く
つかの同様の機能をサポー ト す る ため、 同一のマニ ュ アルで説明 し ます。
こ のマニ ュ アルでは、 で き る だけ機能的に類似 し た文を、 ス ト ア ド ・ プ ロ シージ ャ
と 埋め込み SQL の両方を説明す る 項ま たは章に収めてい ます。
こ の章では、 ス ト ア ド ・ プ ロ シージ ャ と 埋め込み SQL の概要について簡単に説明
し ます。
ス ト ア ド ・ プ ロ シ ージ ャ の概要
定義
ス ト ア ド ・ プ ロ シージ ャ (Teradata Database で実行 さ れ る デー タ ベース ・ オブジ ェ
ク ト ) は、 Teradata Database への イ ン タ ーフ ェース を提供す る 、 SQL 文 と 制御文 と
条件処理文の組み合わせです。
注 : ス ト ア ド ・ プ ロ シージ ャ と い う 用語は、 SQL 文を使っ て記述 し た ス ト ア ド ・
プ ロ シージ ャ を指 し ます。 外部ス ト ア ド ・ プ ロ シージ ャ と い う 用語は、 C、 C++ ま
たは Java で記述 し た ス ト ア ド ・ プ ロ シージ ャ を指 し ます。
通常、 ス ト ア ド ・ プ ロ シージ ャ は以下の も のか ら 成 り 立っ てい ます。
• プ ロ シージ ャ 名
• 入力パ ラ メ ー タ お よ び出力パ ラ メ ー タ
• プ ロ シージ ャ 本体
ス ト ア ド ・ プ ロ シージ ャ ご と に、 デー タ ベース内に ス ト ア ド ・ プ ロ シージ ャ 表があ
り ます。 こ の表には、 ユーザーが記述 し た ス ト ア ド ・ プ ロ シージ ャ 本体 と それに対
応す る コ ンパ イ ル済みの ス ト ア ド ・ プ ロ シージ ャ ・ オブジ ェ ク ト ・ コ ー ド が含まれ
ます。 デー タ ・ デ ィ ク シ ョ ナ リ 表には、 ス ト ア ド ・ プ ロ シージ ャ のパ ラ メ ー タ と 属
性が含まれます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
15
第1章:序
ス ト ア ド ・ プ ロ シージ ャ の概要
プ ロ シージ ャ 本体 と ソ ース ・ テキス ト
以下の用語は、 ス ト ア ド ・ プ ロ シージ ャ の構造を理解す る のに役立ち ます。
用語
定義
プ ロ シー
ジ ャ 本体
ス ト ア ド ・ プ ロ シージ ャ の メ イ ン ・ タ ス ク を構成す る 文の集合。
ソ ース ・
テキ ス ト
プ ロ シージ ャ 本体は、 単一の制御文や SQL 文、 ま たは BEGIN…END 複
合文 ( ブ ロ ッ ク と も 呼ばれ る ) にで き ます。 複合文は入れ子にな る こ と も
あ り ます。
CREATE/REPLACE PROCEDURE ス テー ト メ ン ト 、 パ ラ メ ー タ 、 プ ロ
シージ ャ 名、 お よ び ス ト ア ド ・ プ ロ シージ ャ 本体 を 含む、 ス ト ア ド ・
プ ロ シージ ャ の定義全体。
プ ロ シージ ャ 本体に含まれる構成要素
プ ロ シージ ャ 本体には、 次の よ う な構成要素が含まれてい ます。
ス ト ア ド ・ プ ロ シージ ャ
本体の タ イ プ
含む こ と がで き る も の
単一文
単一の SQL 文ま たは制御文 ( 動的 SQL を含む )。
注 : 次の構成要素を含め る こ と は で き ません 。
• すべての宣言 ( ロ ーカル変数、 条件、 カー ソ ル、 ま たは条
件ハン ド ラ ー ) 文
• カー ソ ル文 (OPEN、 FETCH、 ま たは CLOSE)
複合文
•
•
•
•
•
•
ロ ーカル変数の宣言
条件宣言
カー ソ ル宣言
条件ハン ド ラ ーの宣言
制御文
動的 SQL を含む、 ス ト ア ド ・ プ ロ シージ ャ がサポー ト す
る SQL デー タ 操作言語 (DML)、 デー タ 定義言語 (DDL)、
お よ びデー タ 制御言語 (DDL) 文
プ ロ シージ ャ 本体に含ま れ る 文が 1 文のみで、 宣言を一切含 ま ない場合は、 複合
文を BEGIN…END キーワ ー ド で囲む必要はあ り ません。
ス ト ア ド ・ プ ロ シージ ャ の利点
ス ト ア ド ・ プ ロ シージ ャ には、 複数の入力お よ び出力パ ラ メ ー タ と ロ ーカル変数に
加え て制御文お よ び条件処理文が含まれてお り 、 こ れ ら に よ っ て SQL は完全な計
算用プ ロ グ ラ ミ ン グ言語 と な り ます。
16
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第1章:序
埋め込み SQL の概要
ス ト ア ド ・ プ ロ シージ ャ をベース と す る アプ リ ケーシ ョ ンは、 同等の埋め込み SQL
アプ リ ケーシ ョ ン と 比べて以下の利点があ り ます。
•
ク ラ イ ア ン ト / サーバー間のネ ッ ト ワー ク ・ ト ラ フ ィ ッ ク が非常に少ないため、
パフ ォーマ ン ス が優れてい ます。
• サーバー上で ビ ジネ ス規則を カプセル化お よ び実施で き る ので、 アプ リ ケー
シ ョ ンの保守が向上 し ます。
• ト ラ ンザ ク シ ョ ンの制御が向上 し ます。
• ユーザーにデー タ 表への直接ア ク セ ス を求め る のではな く 、 プ ロ シージ ャ への
ユーザー ・ ア ク セ ス に制限す る こ と で、 アプ リ ケーシ ョ ンのセキ ュ リ テ ィ が向
上 し ます。
• ス ト ア ド ・ プ ロ シージ ャ に埋め込まれてい る すべての SQL 言語文を、 1 つの
CALL 文を通 し てサーバー上で実行で き る ので、 アプ リ ケーシ ョ ンの実行が向上
し ます。
CALL 文を入れ子にす る と 、 入れ子に さ れたプ ロ シージ ャ 内のすべての ト ラ ン
ザ ク シ ョ ン と 複雑な問い合わせが、 結合 さ れて 1 つの明示的な ト ラ ンザ ク シ ョ ン
にな り 、 入れ子に さ れたプ ロ シージ ャ 内のエ ラ ーが内部的に処理 さ れ る ため、
パフ ォーマ ン ス が向上 し ます。
関連 ト ピ ッ ク
•
ス ト ア ド ・ プ ロ シージ ャ の詳細は、 第 5 章 : 「SQL ス ト ア ド ・ プ ロ シージ ャ 」 を
参照 し て く だ さ い。
• ス ト ア ド ・ プ ロ シージ ャ 制御文については、 第 8 章 : 「SQL 制御文」 を参照 し て
く だ さ い。
• 外部 ス ト ア ド ・ プ ロ シージ ャ につい て は、 <SQL デー タ 定義言語 > お よ び
<SQL 外部ルーチン ・ プ ロ グ ラ ミ ン グ > を参照 し て く だ さ い。
• ス ト ア ド ・ プ ロ シージ ャ 作成用の構文については、 <SQL デー タ 定義言語 > の
「CREATE/REPLACE PROCEDURE」 を参照 し て く だ さ い。
埋め込み SQL の概要
定義
埋め込み SQL は、 ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン内か ら 実行ま たは宣言す る
SQL 文を指 し ます。
埋め込み Teradata SQL ク ラ イ ア ン ト ・ プ ロ グ ラ ムは、 次の も ので構成 さ れます。
•
ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ言語文。
• 1 つ以上の埋め込み SQL 文。
•
ホ ス ト 言語に よ り 異な る 、 1 つ以上の埋め込み SQL 宣言セ ク シ ョ ン。
SQL 宣言セ ク シ ョ ンは、 COBOL お よ び PL/I では任意指定ですが、 C では必須
です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
17
第1章:序
埋め込み SQL の概要
特殊接頭辞の EXEC SQL に よ り 、 アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムに埋め込まれた
SQL 言語文 と 、 ホ ス ト ・ プ ロ グ ラ ミ ン グ言語が区別 さ れます。
埋込み SQL 文の場合、 文の連結お よ び終了、 変数名の構成な ど に関係 し た、 ホ ス
ト ・ プ ロ グ ラ ミ ン グ言語の規則に従わなければな り ません。 こ れ ら の規則を別にす
れば、 埋め込み SQL はホ ス ト 言語に依存 し ません。
埋め込み SQL 用の特殊 SQL 文
埋め込み SQL には、 言語の対話的使用がサポー ト さ れていない多 く の SQL 言語構
成が必要です。
ただ し、 い く つかの例外を除いて、 埋め込み SQL アプ リ ケーシ ョ ンで対話的に実行
で き る ほ と んどの SQL 文が使用で き ます。 例外には、 次の よ う な も のがあ り ます。
• 非 ANSI Teradata 拡張機能の ECHO お よ び USING
• CREATE FUNCTION お よ び REPLACE FUNCTION
• 以下の問合わせ ロ ギ ン グ文
• BEGIN QUERY LOGGING
•
END QUERY LOGGING
•
FLUSH QUERY LOGGING
•
REPLACE QUERY LOGGING
埋め込み SQL には、 次の SQL コ ン ポーネ ン ト が含まれます。
• 直接、 ま たは対話的な SQL
• ホ ス ト 変数サポー ト を提供す る 拡張機能
• 埋め込み SQL を サポー ト す る 次の構成をサポー ト す る 文
• 宣言
•
動的 SQL
•
カー ソ ル
サポー ト さ れる ホス ト 言語
• C
• COBOL
• PL/I
埋め込み SQL 文の事前処理
ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ言語は SQL を理解 し ないので、 SQL が含まれてい
る ソ ース ・ コ ー ド は、 プ リ コ ンパ イ ラ ま たはプ リ プ ロ セ ッ サを使用 し て事前処理す
る 必要があ り ます。 こ れに よ っ て まず SQL 言語構成要素を コ メ ン ト 化 し てか ら 、
CLIv2 呼び出 し に変換 し ま す。 その後で、 それ ら を適切な C、 COBOL、 ま たは
PL/I コ ンパ イ ラ を使用 し て コ ンパ イ ル し ます。
プ リ プ ロ セ ッ サ 2 は、 Teradata Database プ リ コ ンパ イ ラ お よ び実行時 SQL 文マネー
ジ ャ です。
18
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第1章:序
埋め込み SQL の概要
デー タ を返す文
デー タ を返す文は、 1 行以上のデー タ を プ ロ グ ラ ムに返す埋め込み SQL 文です。
デー タ を返す SQL 文には、 次の も のがあ り ます。
• CHECKPOINT
• COMMENT ( コ メ ン ト を返す形式 )
• EXPLAIN
• HELP
• SELECT
• SHOW
それぞれのデー タ を返す文は、 返すデー タ を入れ る ホ ス ト 出力変数を指定 し なけれ
ばな り ません。
状況
その場合
1 行だけのデー タ を返す
INTO 句 と 、 ホ ス ト 変数 を 指定す る 文 と を 使用 し ま す。
複数の行を返す
選択カー ソ ル ( 第 2 章 : 「SQL カー ソ ル」 を参照 ) を使用
し 、 INTO 句は指定 し ないで く だ さ い。
デー タ を返す文を動的に実行
する
予期す る 応答行の数に関係な く 、 動的カー ソ ルを定義 し
なければな り ません 。
規則
• すべての埋め込み SQL 文には、 接頭辞の EXEC SQL が必要です。
• すべての埋め込み SQL 文は、 終了 し ていな ければな り ま せん。 終了記号は、
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン言語に応 じ て異な り ます。
言語
SQL 終了子
COBOL
END-EXEC
C
;
PL/I
• すべての 実行可能な SQL 文は、 実行可能な ク ラ イ ア ン ト ・ ア プ リ ケーシ ョ ン
言語文が表記で き る と こ ろではど こ で も 表記で き ます。
• 埋め込み SQL 文は、 ホ ス ト 変数を参照す る こ と がで き ます。
•
ホ ス ト 変数は、 BEGIN DECLARE SECTION 文 と END DECLARE SECTION 文の
間で定義 し なければな り ません。
• ホ ス ト 変数は、 それ を 参照す る ど の SQL 文 よ り も 先に定義 し な ければな り ま
せん。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
19
第1章:序
埋め込み SQL の概要
• すべてのホ ス ト 変数は、 その タ ーゲ ッ ト の列 と 同 じ ド メ イ ンか ら 引いて き た も
のにす る 必要があ り ます。
• UDT はいかな る 形式の埋め込み SQL で も 明示的にはサポー ト さ れてい ません。
ただ し 、 埋め込み SQL アプ リ ケーシ ョ ンで も 、 UDT で適切な tosql 変換ま たは
fromsql 変換が定義 さ れていれば、 UDT を参照す る SQL 文が使用で き ます。
少な く と も 、 アプ リ ケーシ ョ ンか ら ア ク セ スす る UDT 列に対す る UDTUSAGE
権限が必要です。
さ ら に、 アプ リ ケーシ ョ ンは UDT デー タ を その外部 (UDT ではない ) デー タ ・
タ イ プの形式で送受信 し なければな り ません。
•
ホ ス ト 変数 と 列には同 じ 名前を付け る こ と がで き ます。
• すべての埋め込み SQL プ ロ グ ラ ムは、 Teradata Database と ク ラ イ ア ン ト ・ アプ
リ ケーシ ョ ン と の間で ス テー タ ス を通信す る ために、 SQLSTATE ホ ス ト 変数 と
SQLCODE ホ ス ト 変数の ど ち ら か、 ま たは両方を含んでいなければな り ません。
SQLCODE の使用は、 ANSI/ISO SQL-92 規格では推奨 さ れず、 ANSI/ISO SQL-99
規格ではサポー ト さ れな く な り ま し た。 こ のため、 ANSI モー ド で実行予定のア
プ リ ケーシ ョ ンでは SQLSTATE 変数を使用す る 必要があ り ます。
ACTIVITY_COUNT 結果 コ ー ド 変数を埋め込み SQL アプ リ ケーシ ョ ンに組み込
む と 便利な こ と も あ り ます。
• 埋め込み SQL 文の実行後には、 必ず SQLCODE ま たは SQLSTATE ( あ る いはそ
の両方 ) の値を検査す る 必要があ り ます。
関連 ト ピ ッ ク
• 埋め込み SQL について、 詳細は以下を参照 し て く だ さ い。
• 第 9 章 : 「静的埋め込み SQL 文」
•
第 10 章 : 「動的埋め込み SQL 文」
•
サポー ト さ れてい る ク ラ イ ア ン ト 言語で記述 さ れた埋め込み SQL アプ リ ケー
シ ョ ンの例については、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・
ガ イ ド > を参照 し て く だ さ い。
• 宣言について、 詳細は以下を参照 し て く だ さ い。
• カー ソ ル宣言については、 第 2 章 : 「SQL カー ソ ル」 を参照 し て く だ さ い。
• 他 の すべ て の 埋 め 込み SQL 宣言 に つ い て は、 第 9 章 : 「静的埋め込み
SQL 文」 を参照 し て く だ さ い。
• カー ソ ルについての詳細は、 第 2 章 : 「SQL カー ソ ル」 を参照 し て く だ さ い。
• UDT について、 詳細は以下を参照 し て く だ さ い。
• <SQL デー タ 定義言語 > の 「CREATE TRANSFORM」 を参照 し て く だ さ い。
• UDT 列値に対す る ア ク セ ス と 操作に必要な権限について、 詳細は <SQL デー
タ 制御言語 > を参照 し て く だ さ い。
20
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第1章:序
埋め込み SQL の概要
• SQLCODE お よ び SQLSTATE について、 詳細は以下を参照 し て く だ さ い。
• 「SQLSTATE」 (105 ページ )
•
「SQLCODE」 (108 ページ )
• SQLCODE お よ び SQLSTATE の値の検査についての詳細は、 「WHENEVER」
(349 ページ ) を参照 し て く だ さ い。
• ACTIVITY_COUNT についての詳細は、 「ACTIVITY_COUNT」 (111 ページ ) を
参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
21
第1章:序
埋め込み SQL の概要
22
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第2章:
SQL カ ー ソル
こ の章では、 SQL カー ソ ルについて、 それが何をす る も のか、 いつ、 ど の よ う に使
用す る と SQL 応答セ ッ ト 内の行を指す こ と がで き る のか を説明 し ます。
定義
カー ソ ルは、 SQL 問い合わせに よ っ て返 さ れた応答セ ッ ト 内の結果行を指すため
に、 ス ト ア ド ・ プ ロ シージ ャ お よ び Preprocessor2 に よ っ て実行時に使用 さ れ る デー
タ 構造です。
ま た、 ス ト ア ド ・ プ ロ シージ ャ と 埋め込み SQL では、 複文要求お よ び SQL マ ク ロ
の挿入、 更新、 実行を管理す る ために も カー ソ ルを使用 し ます。
機能的に類似 し た カー ソ ル制御文の構文が、 ス ト ア ド ・ プ ロ シージ ャ で使用 さ れ る
か、 埋め込み SQL で使用 さ れ る かに よ っ て異な る 場合があ り ます。 こ のマニ ュ ア
ルでは、 個別のカー ソ ル制御文で異な る 構文形式を説明 し てい ます。 埋め込み SQL
でのみ有効な カー ソ ル制御文 も あ り ます。
BTEQ の よ う な問い合わせマネージ ャ を使用 し て端末か ら 対話的に実施す る セ ッ
シ ョ ンでは、 カー ソ ルは無効にな り ます。
カ ー ソ ルが必要な理由
宣言 さ れた カ ー ソ ル
以下の情報は、 結果セ ッ ト ・ カー ソ ルには適用 さ れません。
埋め込み ま たは ス ト ア ド ・ プ ロ シージ ャ の SQL SELECT 文は、 デー タ 行を 1 度に
1 行だけ取得で き ます。 それ ら のアプ リ ケーシ ョ ン内に複数のデー タ 行を取得す る
SELECT 文があ る と 、 エ ラ ーが発生 し ます。
要求か ら 検索 さ れ る 行数が分か ら なければ、 SELECT の結果を保持す る のに必要な
ホ ス ト 変数の数 も 分か り ません。 1 つの結果行 し か検索で き ないのにはその よ う な
理由があ り ます。
こ れは、 1 行だけ を返す よ う に記述 し た SELECT 文、 いわゆ る シ ン グル ト ン
SELECT では問題にな り ません。 し か し 、 SQL 問い合わせは よ く 、 結果表ま たは応
答セ ッ ト の形式で複数の行を返 し ます。 こ れは、 処理を行な う プ ロ グ ラ ミ ン グ言語
が配備 さ れていない場合に よ く 起 き ます。
COBOL、 C、 お よ び PL/I な ど の従来のプ ロ グ ラ ミ ン グ言語はレ コ ー ド 指向ですが、
リ レーシ ョ ナル ・ デー タ ベース と その演算子は本質的にセ ッ ト 指向です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
23
第 2 章 : SQL カー ソ ル
カー ソ ルの タ イ プ
カー ソ ルに よ っ て、 レ コ ー ド 指向の言語でセ ッ ト 指向のデー タ を処理で き る よ う に
な り ます。 カー ソ ルは、 結果表内の単一のデー タ 行を指すポ イ ン タ だ と 考え て く だ
さ い。
カー ソ ルでは、 埋め込み SQL と ス ト ア ド ・ プ ロ シージ ャ に固有の SQL 文 を 使用
し て、 ス プール ・ フ ァ イ ル と 呼ばれ る デー タ 構造に保持 さ れた結果表を 1 度に 1 行
ずつ順次処理 し ます。
結果セ ッ ト ・ カ ー ソ ル
ス ト ア ド ・ プ ロ シージ ャ で、 最大 15 個の結果セ ッ ト を返す よ う に指定で き ます。
詳細は、 「ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト の返送」 (138 ページ ) お よ び
「DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )」 (56 ページ ) を参照 し て く だ
さ い。
カ ー ソ ルの タ イ プ
DECLARE CURSOR 文内で、 次に示すカー ソ ルの タ イ プを宣言で き ます。
• 動的
• マク ロ
• 要求
• 選択
•
ス ト ア ド ・ プ ロ シージ ャ
注 : ス ト ア ド ・ プ ロ シージ ャ でサポー ト す る のは、 ス ト ア ド ・ プ ロ シージ ャ ・
タ イ プのカー ソ ルのみです。
次に示す タ イ プ に よ っ て、 カ ー ソ ル を 使用 し て デー タ を 操作す る 方法 を 表わ し
ま す。
• 定位置 ( 更新可能 )
• 非定位置 ( 読み取 り 専用 )
ど ち ら の タ イ プ も 、 埋め込み SQL お よ びス ト ア ド ・ プ ロ シージ ャ でサポー ト さ れ
てい ます。
カ ー ソ ルの状態お よ び位置
カー ソ ルは、 開 く こ と も 、 閉 じ る こ と も で き ます。
オープン ・ カー ソ ルは、 そのカー ソ ルに関連付け ら れた SELECT に よ っ て返 さ れ る
結果表の行を指す こ と にな り ます。 こ の行を現在行 と いい ます。
リ レ ーシ ョ ナル ・ モデルでは、 非 リ レ ーシ ョ ナル ・ プ ロ グ ラ ミ ン グ言語で実行 さ
れ る よ う な、 順序付け さ れた行の概念、 結果セ ッ ト を一度に 1 行処理す る メ カ ニ
ズ ム を サポー ト し てい ませんが、 こ の状況に限 り 再定義を必要 と し ます。
24
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 2 章 : SQL カー ソ ル
カー ソ ルが増分 さ れ る 方法
オープン ・ カー ソ ルは、 以下の 3 つの位置のいずれかに配置で き ます。
• 行の前
カー ソ ルは、 そのカー ソ ルが OPEN さ れてい る が ど の行 も FETCH さ れていない
場合は、 先頭行の前に配置 さ れます。
• 行の上
カー ソ ルは、 行の FETCH に続 く 行に配置 さ れます。
カー ソ ルが行に配置 さ れてい る 場合、 その行はカー ソ ルの現在行 と 呼ばれます。
• 結果セ ッ ト の最終行の後
結果集合にそれ以上 FETCH さ れ る 行がない場合、 カー ソ ルは検索 さ れた集合の
最終行の直後に配置 さ れます。
結果セ ッ ト を呼び出 し 側ま たは ク ラ イ ア ン ト に返すために、 結果セ ッ ト ・ カー ソ ル
は開いた ま ま に し ます。 ス ト ア ド ・ プ ロ シージ ャ で結果セ ッ ト ・ カー ソ ルを閉 じ る
と 、 結果セ ッ ト は削除 さ れて、 返 さ れません。 結果セ ッ ト は、 開かれた順に返 さ れ
ます。
カ ー ソ ルが増分 さ れる 方法
FETCH 文は、 応答セ ッ ト の行を順次処理す る ためにカー ソ ルを増分 し ます。
ス ト ア ド ・ プ ロ シージ ャ ・ カー ソ ルには、 埋め込み SQL カー ソ ル ・ プ ロ セ ス よ り
も 柔軟に処理を行な う ためのい く つかの追加機能があ り ます。
• FETCH 文の FIRST お よ び NEXT オプシ ョ ン、 お よ び DECLARE CURSOR 文の
SCROLL お よ び NO SCROLL オプシ ョ ン を使用す る と 、 ス プール内の次の行へ
順方向に ス ク ロ ールす る か、 ま たは ス プール内の最初の行に直接ス ク ロ ールで
き ます。
• FOR ループ内で、 カー ソ ルはループの繰返 し ご と に次の行に移動 し てい き ます。
カ ー ソ ル と ス ト ア ド ・ プ ロ シ ージ ャ
一般規則
• 1 つの ス ト ア ド ・ プ ロ シージ ャ で同時に開け る カー ソ ルの最大数は 15 です。
• カー ソ ル名は、 次に リ ス ト し た有効な文字で作成 し ます。
• 英大文字
•
•
英小文字
$
•
@
•
#
•
数字
•
下線
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
25
第 2 章 : SQL カー ソ ル
カー ソ ル と ス ト ア ド ・ プ ロ シージ ャ
•
ス ト ア ド ・ プ ロ シージ ャ では、 以下の文でのオープン ・ カー ソ ルの使用はで き
ません。
• POSITION
•
REWIND
•
SQL ト ラ ンザ ク シ ョ ン文
DECLARE CURSOR 文および FOR 文のカ ー ソ ル
• 次の文で、 カー ソ ルを宣言で き ます。
• DECLARE CURSOR 文
•
FOR ループ制御文
• FOR 文ま たは DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 文で指定 し
た SELECT 文は、 カー ソ ル指定 と 呼ばれます。
•
ス ト ア ド ・ プ ロ シージ ャ では、 定位置カー ソ ル と 非定位置カー ソ ルの両方を使
用で き ます。
• FOR 文で宣言 さ れ る カー ソ ル と DECLARE CURSOR 文で宣言 さ れ る カー ソ ルに
は、 次の よ う な違いがあ り ます。
FOR ループ ・ カー ソ ル
DECLARE CURSOR カー ソ ル
カー ソ ルの有効範囲は、 それが定義 さ れ
てい る FOR 文に限定 さ れます。
カー ソ ルの有効範囲は、 そのカー ソ ルが
宣言 さ れた BEGIN…END 複合文内にな り
ます。
FOR ループ ・ カー ソ ル内の列名ま たはそ
の相関名の有効範囲は、 FOR 文の本体の
みに制限 さ れます。
FOR 文が入れ子にな っ てい る 場合、 外側
の FOR 文で指定 し た カー ソ ル名は、
内側の FOR 文内の文で参照で き ます。
複合文が入れ子にな っ てい る 場合、 外側
の複合文で指定 し た カー ソ ルの有効範囲
には、 内側の複合文がすべて含まれ ます。
定位置 DELETE 文か UPDATE 文でカー
ソ ルを参照す る と 、 カー ソ ルは更新可能
にな り ます。
FOR UPDATE オプシ ョ ン の使用に よ っ て、
カー ソ ルは更新可能にな り ます。
OPEN、 FETCH、 お よ び CLOSE は、
FOR ループ実行の一部 と し て暗黙的に行
われ ます。
OPEN、 FETCH、 ま たは CLOSE を明示的
に指定す る 必要があ り ます。
FOR 文では、 繰返し ご と に ( 存在すれば )
次の行を オープン ・ カー ソ ルのために取
り 出 し ます。
26
カー ソ ルの有効範囲は、 複合文 と その入
れ子の複合文 ( 存在す る 場合 ) です。
結果セ ッ ト ・ カー ソ ルに CLOSE を指定す
る と 、 結果セ ッ ト が返 さ れな く な り ます。
カー ソ ルが宣言 さ れてい る FOR 文には
ラ ベルを付け る こ と がで き ます。
DECLARE CURSOR 文には ラ ベルを付け
る こ と がで き ません。
FOR cursor_name 文は、 カー ソ ル指定 と
し て指定 し た SELECT 文のカー ソ ルを暗
黙的に開 き ます。
OPEN cursor_name 文は、 カー ソ ル指定 と
し て指定 し た SELECT 文のカー ソ ルを開
き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 2 章 : SQL カー ソ ル
カー ソ ル と ス ト ア ド ・ プ ロ シージ ャ
カ ー ソ ルのサポー ト
サポー ト は、 カー ソ ルが FOR ループ文に よ っ て開かれたのか、 DECLARE CURSOR
文で宣言 し た カー ソ ルに よ っ て開かれたのかに よ っ て多少異な り ます。
FOR ループ ・ カ ー ソ ルのサポー ト
FOR ループ文の場合、 次に示すダ ミ ーの繰返 し 文に よ っ て指定 し た カー ソ ル用に
カー ソ ルを開 き ます。
FOR for_loop_variable AS [cursor_name CURSOR FOR]
cursor_specification DO statement
END FOR;
こ こ で cursor_specification は 1 つの SELECT 文、 statement は 1 つ ま たは複数の
SQL 制御文ま たは DML 文です。
FOR 文は次の よ う に実行 さ れます。
1
結果セ ッ ト か ら 1 つのデー タ 行を取 り 出 し て、 各繰返 し の for_loop_variable
に置 く 。
2
( 存在す る 場合 ) 次の行デー タ を取 り 出 し て、 各繰返 し のカー ソ ルを増分す る 。
DELETE お よ び UPDATE の WHERE CURRENT OF フ ォームは次の よ う に機能 し
ます。
• DELETE…WHERE CURRENT OF cursor_name は、 現在取 り 出 さ れ て い る
行 を その実表か ら 削除 し ます。
• UPDATE…WHERE CURRENT OF cursor_name は、 現在取 り 出 さ れ て い る
行 を その実表で更新 し ます。
DECLARE CURSOR カ ー ソルのサポー ト
DECLARE CURSOR 文で定義 し た カー ソ ルの場合、 OPEN cursor_name お よ び
FETCH cursor_name の各文を明示的に実行す る 必要があ り ます。
結果セ ッ ト ・ カー ソ ルに CLOSE を指定す る と 、 結果セ ッ ト が返 さ れない よ う にな
る ので注意 し て く だ さ い。
関連 ト ピ ッ ク
ス ト ア ド ・ プ ロ シージ ャ 内のカー ソ ルの使用についての詳細は、 「DECLARE
CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )」 (56 ページ )、 「カー ソ ル」 (127 ページ )、
お よ び 「FOR」 (289 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
27
第 2 章 : SQL カー ソ ル
カー ソ ル と 埋め込み SQL
カ ー ソ ル と 埋め込み SQL
カ ー ソ ル規則
• 特定のアプ リ ケーシ ョ ンで同時にオープンで き る カー ソ ルの最大数は 16 です。
• カー ソ ルを定位置にで き る か ど う かは、 プ リ コ ンパ イ ラ 宣言 TRANSACT ま たは
-tr を ど の よ う に設定す る かに応 じ て異な り ます ( 次の表を参照 )。
設定
デフ ォ ル ト ・ タ イ プ
ANSI
定位置
BTET
定位置ではない
Teradata SQL では、 ANSI/ISO SQL 規格のカー ソ ル用の FOR READ ONLY 句お よ
び FOR UPDATE 句を サポー ト し てい ません。
• 16 のカー ソ ルを開いてい る アプ リ ケーシ ョ ンでは、 その次に発行で き る 文が以
下のいずれかに限 ら れます。
• CLOSE
• COMMIT (COMMIT モー ド の場合 )
• FETCH
•
•
LOGOFF
•
POSITION
•
REWIND
カー ソ ルお よ び動的文識別子は、 次に リ ス ト す る 有効な文字で作成 し ます。
• 英大文字
•
•
英小文字
$
•
@
•
#
•
数字
•
下線
•
カー ソ ルお よ び動的文識別子は、 先頭が国別文字でなければな ら ず、 18 文字を
超え る こ と はで き ません。
• カー ソ ルお よ び動的文識別子は、 SQL キーワ ー ド にす る こ と はで き ません。
• 識別子間の比較が目的の時は、 大文字で も 小文字で も か ま い ません。
プ リ プ ロ セ ッ サは、 大文字、 小文字、 ま たはそれ ら の混合のいずれの文 も 受け
入れます。
• マルチバ イ ト 文字セ ッ ト をサポー ト す る ために、 カー ソ ルお よ び動的文の名前
はマルチバ イ ト 文字にす る こ と がで き 、 それ ら は内部 16 進数表記で表現す る こ
と がで き ます。
28
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 2 章 : SQL カー ソ ル
カー ソ ル と 埋め込み SQL
Preprocessor2 のカ ー ソ ル ・ サポー ト 文
こ のセ ク シ ョ ンでは、 カー ソ ルをサポー ト す る さ ま ざ ま な SQL 文が、 埋め込み
SQL に ど の よ う に組み込まれて 1 つに ま と め ら れ る かを説明 し ます。
1
データ を返す文 DECLARE cursor_name CURSOR FOR を使用し て、 カー ソ ル名を
複数行のデー タ を返す文に関連付け ます。
単独 SELECT を処理す る ためにカー ソ ルを使用す る 必要はあ り ません。
2
宣言 し た カー ソ ルを操作す る には、 次に示す文を使用 し ます。
文
機能
OPEN cursor_name
DECLARE CURSOR 文で定義 し た要求 ( 複数可能 ) を実行 し
ます。
FETCH cursor_name INTO
開かれた カー ソ ルを使用 し て結果セ ッ ト か ら 連続す る 個別の
行を取得 し て ホ ス ト 変数に入れ、 ホ ス ト 言語文を使用 し て、
WHENEVER 文、 ま たは各 FETCH 後の SQLCODE ま たは
SQLSTATE に返 さ れた ス テー タ ス ・ コ ー ド の値の テ ス ト に
基づいて、 カー ソ ルを増分 し ます。
DELETE … WHERE
CURRENT OF
cursor_name
実表か ら 現在取 り 出 さ れてい る 行を削除 し ます。
UPDATE … WHERE
CURRENT OF
cursor_name
現在取 り 出 さ れてい る 行を更新 し ます。
POSITION cursor_name
指定し た文の最初の行に、 カー ソ ルを前進ま たは後退し ます。
REWIND cursor_name
要求の最初 ( ま たは唯一 ) の文の最初の行にカー ソ ルを移動
し ます。
CLOSE cursor_name
開いた cursor_name を閉 じ 、 DECLARE CURSOR 文で指定 し
たデー タ を返す文を終了 し ます。
カ ー ソ ルのア ク シ ョ ン と 結果
SQL 文
処置
結果
カー ソ ル と 関連付け ら れ る
文ま たは要求を定義す る 。
DECLARE CURSOR
カー ソ ル と 、 SQL デー タ を返す文
と の間の関連を定義す る 。
カー ソ ルを オープ ンす る
OPEN
DECLARE CURSOR で定義 さ れた、
SQL デー タ を返す文を実行す る 。
結果表の次の行を検索す る 。
FETCH
結果表か ら 行を検索す る 。
カー ソ ルを、 特定の SQL 文
の最初の行に移動 さ せ る 。
POSITION
カー ソ ルを、 指定 し た文の結果表
の最初の行に配置す る 。
行を更新す る 。
UPDATE … WHERE
CURRENT OF
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
REWIND
現在行の内容を更新す る 。
29
第 2 章 : SQL カー ソ ル
ト ラ ンザ ク シ ョ ン と カー ソ ル
SQL 文
処置
結果
行を削除す る 。
DELETE … WHERE
CURRENT OF
表か ら 現在行を削除す る 。
カー ソ ルを ク ロ ーズす る 。
CLOSE
検索プ ロ セ ス を終了す る 。
ト ラ ンザク シ ョ ン と カ ー ソル
SQL 終了文 と カ ー ソ ル
• COMMIT は、 オープ ン し たすべて の カー ソ ル を 終了 さ せ、 ト ラ ン ザ ク シ ョ ン
の進行中にカー ソ ルに よ っ て加え ら れた変更を コ ミ ッ ト し ます。 (ANSI セ ッ
シ ョ ン ・ モー ド のみ )。
• ROLLBACK (ANSI モー ド お よ び Teradata セ ッ シ ョ ン ・ モー ド ) ま たは ABORT
(Teradata セ ッ シ ョ ン ・ モー ド のみ ) は、 現在の ト ラ ンザ ク シ ョ ン内のすべての
オープン し た カー ソ ルを終了 さ せ、 ト ラ ンザ ク シ ョ ンの進行中にカー ソ ルに
よ っ て加え ら れたすべての変更を破棄 し ます。
• END TRANSACTION は、 現在の ト ラ ンザ ク シ ョ ン内のすべてのオープン し た
カー ソ ルを終了 さ せ、 ト ラ ンザ ク シ ョ ンの進行中にカー ソ ルに よ っ て加え ら れ
たすべての変更を コ ミ ッ ト し ます (Teradata セ ッ シ ョ ン ・ モー ド のみ )。
暗黙的 ト ラ ンザク シ ョ ンのカ ー ソ ルの意味
暗黙的 ト ラ ン ザ ク シ ョ ン の場合 (Teradata セ ッ シ ョ ン ・ モー ド で開かれた カー ソ ル
のみ ):
• FOR CURSOR ループは保持可能カー ソ ル と し て カー ソ ルを開 き 、 感度は準セ ン
シテ ィ ブにな り ます。
• ま た、 FOR CURSOR ループは ト ラ ンザ ク シ ョ ン制御文をサポー ト し ます。
• DECLARE、 OPEN、 ま たは FETCH CURSOR の場合、 カー ソ ルは保持可能で、
感度は準セ ン シテ ィ ブです。
明示的 ト ラ ンザク シ ョ ンのカ ー ソ ルの意味
明示的 ト ラ ンザ ク シ ョ ンの場合 (Teradata モー ド ま たは ANSI セ ッ シ ョ ン ・ モー ド で
開かれた カー ソ ル ):
• FOR CURSOR ループは保持な し カー ソ ル と し て カー ソ ルを開 き 、 感度は準セ ン
シテ ィ ブにな り ます。 つま り 、 ト ラ ンザ ク シ ョ ンが閉 じ る と 、 カー ソ ル も 閉 じ
ます。 カー ソ ルが準セ ン シテ ィ ブであれば、 SQL デー タ の意味のあ る 変更内容
の可視性は イ ンプ リ メ ン テーシ ョ ンに依存 し ます。
• FOR CURSOR ループの場合、 COMMIT、 ROLLBACK、 ま たは ABORT を FOR
ループ内で使用で き ません。 シ ス テムが コ ンパ イ ル時に COMMIT、 ROLLBACK、
ま たは ABORT を検出す る と 、 エ ラ ーが返 さ れて、 ス ト ア ド ・ プ ロ シージ ャ は作
成 さ れません。
30
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 2 章 : SQL カー ソ ル
定位置カー ソ ル
シ ス テ ムが コ ンパ イ ル時に COMMIT、 ROLLBACK、 ま たは ABORT を検出 し な
い と 、 実行時エ ラ ーが返 さ れます。 こ れは Teradata セ ッ シ ョ ン ・ モー ド の失敗
であ り 、 シ ス テ ムに よ っ て ト ラ ンザ ク シ ョ ン と カー ソ ルが閉 じ ら れます。
Teradata セ ッ シ ョ ン ・ モー ド のネ ス ト さ れた呼び出 し の中で ROLLBACK ま たは
ABORT が発生 し た場合、 シ ス テ ムに よ っ てネ ス ト さ れた呼び出 し が失敗 し た と
報告 さ れます。 さ ら に、 こ の失敗は後続の FETCH CURSOR に も 適用 さ れます。
• DECLARE、 OPEN、 ま たは FETCH CURSOR の場合、 カー ソ ルは保持な し で、
感度は準セ ン シテ ィ ブです。 ト ラ ンザ ク シ ョ ン制御文はシ ス テ ムに よ っ て正常
に実行 さ れますが、 次の FETCH ま たは CLOSE CURSOR でシ ス テ ムはエ ラ ーを
返 し ます。
カ ー ソ ルの保持可能性 と ト ラ ンザク シ ョ ンおよびセ ッ シ ョ ンの終了
• COMMIT で ト ラ ンザ ク シ ョ ンが終了 し て も 、 シ ス テ ムが保持可能カー ソ ルを閉
じ る こ と はあ り ません ( そのカー ソ ルが開いてい る 場合 )。
• ト ラ ンザ ク シ ョ ン終了時に閉 じ ら れてい る 保持可能カー ソ ルは、 閉 じ ら れた ま
ま です。
• ROLLBACK で ト ラ ンザ ク シ ョ ンが終了す る と 、 シ ス テ ムが保持可能カー ソ ルを
閉 じ ます。
• 保持可能カー ソ ルを作成 し たセ ッ シ ョ ンが終了 し た と き は、 シ ス テ ムがその
カー ソ ルを閉 じ て破棄 し ます。
• 保持な し カー ソ ルを作成 し た ト ラ ンザ ク シ ョ ンが終了 し た と き は、 シ ス テ ムが
そのカー ソ ルを閉 じ ます。
カ ー ソ ルの感度
カー ソ ルが開かれていて、 そのカー ソ ルを開いた ト ラ ンザ ク シ ョ ン でデー タ に意味
あ る 変更が加え ら れた場合、 カー ソ ルを閉 じ る 前に変更内容を そのカー ソ ルで表示
で き る よ う にす る か ど う かは、 以下の よ う にシ ス テ ムに よ っ て決定 さ れます。
•
カー ソ ルが準センシテ ィ ブの場合、 データ の意味のあ る変更内容の可視性は イ ン
プ リ メ ン テーシ ョ ンに依存 し ます。
•
カー ソ ルが非セ ン シテ ィ ブの場合、 デー タ の意味のあ る 変更内容は表示 さ れま
せん。
•
カー ソ ルがセ ン シ テ ィ ブの場合、 デー タ の意味のあ る 変更内容は表示 さ れます。
定位置 カ ー ソ ル
ANSI/ISO SQL 規格では、 更新可能 ( 定位置 ) カー ソ ルを定義 し てい ます。 こ れは、
アプ リ ケーシ ョ ンが問い合わせのためのカー ソ ルを定義す る こ と がで き 、 その同 じ
カー ソ ルを使用 し て結果行を更新で き る こ と を意味 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
31
第 2 章 : SQL カー ソ ル
定位置カー ソ ル
ス ト ア ド ・ プ ロ シージ ャ から 行を更新または削除する ための定位置カ ー ソ ルの使用
ス ト ア ド ・ プ ロ シージ ャ で FOR ループ ・ カー ソ ルを使用 し て行を更新ま たは削除
す る ための一般的な処理フ ロ ーは、 次の と お り です。
1
適切な カー ソ ル指定で FOR 文を指定す る 。
2
FOR 文の各繰返 し で 1 つの行を取 り 出す。
す る と 、 カー ソ ルは応答セ ッ ト 内の次の行を ポ イ ン ト し ます。
3
UPDATE 文、 ま たは DELETE 文 と と も に WHERE CURRENT OF 句を使用 し て、
取 り 出 し た行を更新ま たは削除す る 。
4
最終行が取 り 出 さ れ る ま で FOR の繰返 し ループ を続行す る 。
5
FOR 文を終了 し て カー ソ ルを ク ロ ーズす る 。
ス ト ア ド ・ プ ロ シージ ャ で DECLARE CURSOR カー ソ ルを使用 し て行を更新ま た
は削除す る ための一般的な処理フ ロ ーは、 次の と お り です。
1
適切な カー ソ ル指定で DECLARE CURSOR 文を指定す る 。
2
OPEN cursor_name 文でカー ソ ルを開 く 。
3
FETCH 文を実行 し て、 応答セ ッ ト か ら 1 度に 1 行ずつ取 り 出す。
次の カー ソ ル移動は、 指定す る ス ク ロ ール可能性オプ シ ョ ン に よ っ て異な り
ま す。
オプシ ョ ン
次のカー ソ ル移動
FIRST
結果セ ッ ト 内の最初の行
NEXT
結果セ ッ ト 内の次の行
4
UPDATE 文、 ま たは DELETE 文 と と も に WHERE CURRENT OF 句を使用 し て、
取 り 出 し た行を更新ま たは削除す る 。
5
CLOSE cursor_name 文を実行 し て カー ソ ルを閉 じ る 。
Preprocessor2 で行を更新する ためのカ ー ソ ルの使用
32
1
SELECT 文のカー ソ ルを宣言す る 。
2
OPEN 文を使用 し て カー ソ ルを オープンす る 。
3
FETCH 文を使用 し て行を取 り 出す。
4
UPDATE 文、 ま たは DELETE 文 と と も に WHERE CURRENT OF 句を使用 し て、
取 り 出 し た行を更新ま たは削除す る 。
5
CLOSE 文を使用 し て カー ソ ルを ク ロ ーズす る 。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 2 章 : SQL カー ソ ル
定位置カー ソ ル
Preprocessor2 の SELECT AND CONSUME 文用の定位置カ ー ソル
定位置カー ソ ルでの SELECT AND CONSUME 文は無効です。
SELECT AND CONSUME 文を使用 し て キ ュ ー表か ら 行を選択す る と き 、 シ ス テ ム
は自動的にその行を消費 し ま す。 し たが っ て、 い っ たん選択 さ れ消費 さ れた行は
削除ま たは更新で き ないため、 定位置カー ソ ルで SELECT AND CONSUME 文を実
行 し て も 意味があ り ません。 つま り 、 定位置カー ソ ルか ら 実行 さ れ る すべての
SELECT AND CONSUME 文は失敗 し ま す ( た と え行を削除 ま たは更新 し ない場合
で も )。
TRANSACT ま たは -tr プ リ プ ロ セ ッ サ宣言を ANSI に設定 し て コ ー ド を プ リ コ ンパ
イ ルす る と き 、 Preprocessor2 アプ リ ケーシ ョ ン で コ ー ド 作成 さ れ る すべてのカー ソ
ルはデフ ォ ル ト で定位置カー ソ ルにな り ます。 つま り 、 ANSI 形式の埋め込み SQL
アプ リ ケーシ ョ ンではカー ソ ルか ら SELECT AND CONSUME 文を実行で き ません。
定位置カ ー ソ ルをサポー ト する機能
ANSI/ISO SQL:2011 規格の定位置カー ソ ルの機能を有効にす る 機能がい く つか提供
さ れてい ます。 こ れには以下の も のが含まれます。
• DELETE お よ び UPDATE 文の WHERE CURRENT OF 句
• LOCKING 要求修飾子の FOR CHECKSUM 句 ( 埋め込み SQL のみ )
• SELECT 文の FOR UPDATE 句 ( ス ト ア ド ・ プ ロ シージ ャ のみ )
WHERE CURRENT OF 句
定位置カー ソ ルを宣言す る と 、 WHERE CURRENT OF 句で、 そのカー ソ ルが指す行
に対す る DELETE お よ び UPDATE 文が実行で き る よ う にな り ます。
た と えば、 以下の DELETE 文は、 現在の顧客行 を x01 と い う カ ー ソ ルか ら 削除
し ま す。
EXEC SQL
DELETE FROM customer
WHERE CURRENT OF x01;
FOR CHECKSUM 句
定位置カー ソ ルは、 リ ソ ース ・ ロ ッ ク ・ レベルを認識 し ません。 代わ り にそれは、
カー ソ ルが関係す る すべての ア ク シ ョ ン は単一 ト ラ ン ザ ク シ ョ ン内で行なわれ、
ト ラ ンザ ク シ ョ ンの終了がオープン さ れた カー ソ ルを ク ロ ーズす る と 仮定 し ます。
注 : ANSI/ISO SQL:2011 規格への Teradata 拡張機能であ る 、 LOCKING 要求修飾子
の FOR CHECKSUM 句が、 こ の機能に追加 さ れてい ます。
LOCKING 要求修飾子を指定 し ていない と 、 すべての SELECT 文で READ レベルの
ロ ッ ク が使用 さ れます。 定位置更新お よ び削除は両方 と も 、 デフ ォ ル ト の WRITE
重大度行ハ ッ シ ュ ・ ロ ッ ク にな り ます。
FOR CHECKSUM 句は、 ス ト ア ド ・ プ ロ シージ ャ ではサポー ト さ れません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
33
第 2 章 : SQL カー ソ ル
定位置カー ソ ル
CHECKSUM ロ ッ ク の動作方法
CHECKSUM ロ ッ ク は、 ACCESS ロ ッ ク と 似てい ま すが、 カー ソ ル を通 し て更新
が行なわれてい る と き に別のユーザーかセ ッ シ ョ ン に よ っ て カー ソ ル内の行が変
更 さ れてい る か ど う か を テ ス ト で き る よ う に、 結果表の行にチ ェ ッ ク サ ム を追加
し ま す。
アプ リ ケーシ ョ ンが ACCESS ロ ッ ク を指定 し て、 それか ら カー ソ ル UPDATE ま た
は DELETE を発行す る 場合、 変更対象の行は、 最初のアプ リ ケーシ ョ ンが行を読み
取 り 、 それがカー ソ ル UPDATE ま たは DELETE 文を発行す る ま での間に、 別のア
プ リ ケーシ ョ ンに よ っ て変更 さ れて し ま っ てい る 可能性があ り ます。
行が現在のアプ リ ケーシ ョ ンに よ っ て最後に読み取 ら れてか ら 、 別のアプ リ ケー
シ ョ ン がその行を更新 し たためにチ ェ ッ ク サム が変わ る 場合、 現在のアプ リ ケー
シ ョ ンはエ ラ ーを受け取 り ます。
次に示す CHECKSUM ロ ッ ク の要件がいずれ も 満た さ れていない場合、 シ ス テ ムは
必ずアプ リ ケーシ ョ ンにエ ラ ーを返 し ます。
•
ロ ッ ク さ れたオブジ ェ ク ト は表でなければな ら ない。
• LOCKING 要求修飾子の後に、 定位置カー ソ ル SELECT が続か な ければな ら
な い。
• LOCKING 要求修飾子で指定 し た表は、 それに続 く SELECT 文の FROM 句で参
照 さ れ る 表 と 同 じ でなければな ら ない。
CHECKSUM ロ ッ ク は、 定位置カー ソ ルに よ っ て開かれ る SELECT 文 と と も に使用
さ れ る 場合のみ有効です。
例 : CHECKSUM 付きの LOCKING
こ の例では、 t と 名付け ら れた表に CHECKSUM ロ ッ ク を使用 し てい ます。
LOCKING TABLE t
FOR CHECKSUM
SELECT i, text
FROM t;
定位置カ ー ソ ルの使用規則
• 定位置の UPDATE お よ び DELETE は、 それ ら が使用す る カー ソ ルを開いた
SELECT と 同 じ ト ラ ンザ ク シ ョ ン内にあ る こ と が必要です。
• 以下の項目は更新で き ません。
• 動的カー ソ ル
•
複文要求
• 以下の項目は、 定位置カー ソ ルに よ っ て制御 さ れ る SQL 文では許可 さ れてい ま
せん。
• ト リ ガーが定義 さ れてい る 表
•
•
34
複数の実表間の結合
DISTINCT キーワ ー ド
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 2 章 : SQL カー ソ ル
定位置カー ソ ル
•
•
•
•
•
•
GROUP BY 句
•
HAVING 句
•
WITH 句
•
ORDER BY 句
•
集約演算子
•
集合演算子
•
相関副問い合わせ
•
以下のいずれかがあ る 選択 リ ス ト :
• 重複列名
•
式
•
関数
ス ト ア ド ・ プ ロ シージ ャ では、 DECLARE CURSOR 文に FOR UPDATE 句を指定
す る と 、 定位置カー ソ ル を 定義で き ま す。 FOR UPDATE 句 を 指定 し な い と 、
シ ス テ ムはカー ソ ルが更新不可能であ る と い う 警告を返 し ます。
現在取 り 出 し てい る 行の複数の UPDATE、 ま たは現在取 り 出 し てい る 行の
DELETE が後続す る 複数の UPDATE は、 許可 さ れてい ます。
定位置の更新ま たは削除は、 カー ソ ルを定義 し た SELECT 文 と 同 じ ト ラ ンザ ク
シ ョ ン内になければな り ません。
アプ リ ケーシ ョ ンが、 無効な SELECT に よ っ て選択 さ れた行に対 し て、 定位置
の UPDATE ま たは DELETE を試行す る と 、 シ ス テ ムはエ ラ ーを返 し 、 影響を受
けた ト ラ ンザ ク シ ョ ン を ロ ールバ ッ ク し ます。
プ ロ グ ラ ムが、 WHERE CURRENT OF 句を使用 し て非定位置カー ソ ルに対す る
行の UPDATE ま たは DELETE を試行す る と 、 シ ス テ ムはカー ソ ルが更新可能で
ない こ と を通知す る エ ラ ーを返 し ます。
• 次の表では、 定位置カー ソ ルが有効か ど う か を、 それが作成 さ れたセ ッ シ ョ ン ・
モー ド を基準に説明 し てい ます。
セ ッ シ ョ ン ・ モー ド
有効性
ANSI
有効
Teradata
無効
定位置カ ー ソ ルのパフ ォ ーマ ン ス最適化の指針
行ハ ッ シ ュ ・ ロ ッ ク
小規模なデータ の集合には定位置更新および削除を使用する必要があ り ますが、 それ
は単に、 大規模なデータ の集合に対し てカー ソ ル更新を使用する必要があ る行ハ ッ
シ ュ ・ ロ ッ ク の数が理由です。 課せ ら れ る 行ハ ッ シ ュ ・ ロ ッ ク が多すぎ る 場合、
ト ラ ン ザ ク シ ョ ンは失敗し、 ロ ッ ク 表オーバーフ ロー ・ エ ラーでアボー ト し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
35
第 2 章 : SQL カー ソ ル
定位置カー ソ ル
定位置カー ソ ルを使用す る 場合には長時間 ト ラ ンザ ク シ ョ ン を避け る か、 ま たは
CHECKSUM ロ ッ ク を使用 し て、 自分のアプ リ ケーシ ョ ンが使用す る 表を他のアプ
リ ケーシ ョ ンが読み取 り ま たは更新不可にす る 可能性があ る ロ ッ ク 対立を避け ま
す。 CHECKSUM ロ ッ ク は、 ス ト ア ド ・ プ ロ シージ ャ ではサポー ト さ れていない こ
と に注意 し て く だ さ い。
行ハ ッ シ ュ ・ ロ ッ ク の数が多 く な り すぎ、 ロ ッ ク 表オーバーフ ロ ー ・ エ ラ ーが起
き る 場合、 Teradata Database はエ ラ ーを受け取 る SQL アプ リ ケーシ ョ ン に対 し て
ト ラ ンザ ク シ ョ ン ・ レベル ・ アボー ト を発行 し ます。
カ ー ソ ル対立
カー ソ ル対立は、 単一 ト ラ ンザ ク シ ョ ン内で も 起 き る 可能性があ り ます。 こ の よ う
な対立は、 シ ス テ ムが次の よ う にカー ソ ルを開いた と き に発生 し ます。
•
シ ス テ ムが、 あ る ト ラ ンザ ク シ ョ ン内で同時に同 じ 表に対す る カー ソ ルを開 き 、
そのカー ソ ルの 1 つが、 も う 1 つのカー ソ ルに よ っ て定位置更新ま たは削除要
求の対象に現在な っ てい る 表内の行に対 し て、 定位置更新ま たは削除を試行す
る 場合。
•
シ ス テ ムがあ る 表に対す る カー ソ ルを開 き 、 その表に対 し て検索更新ま たは検
索削除を実行 し てか ら 、 カー ソ ルがその表に対 し て定位置更新ま たは削除の実
行を試行す る 場合。
•
シ ス テ ムがあ る 表に対す る カー ソ ルを開 き 、 そのカー ソ ルを介 し た更新ま たは
削除を実行 し てか ら 、 同 じ 表に対 し て検索更新ま たは検索削除の実行を試行す
る 場合。
こ れ ら 3 つの状況で、 シ ス テ ムはカー ソ ル対立の警告を返 し ますが、 要求 さ れた削
除ま たは更新は実行 さ れます。
関連 ト ピ ッ ク
• SELECT AND CONSUME については、 <SQL デー タ 定義言語 > お よ び <SQL
デー タ 操作言語 > を参照 し て く だ さ い。
• カー ソ ルお よ び Preprocessor2 ( プ リ プ ロ セ ッ サ 2) については、 「カー ソ ル規則」
(28 ページ ) および <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を
参照 し て く だ さ い。
• 埋め込み SQL ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンに定位置カー ソ ルを実装す る 例
については、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照
し て く だ さ い。
• ス ト ア ド ・ プ ロ シージ ャ に定位置カー ソ ルを実装す る 例については、 「FOR」
(289 ページ ) を参照 し て く だ さ い。
36
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第3章:
SQL カ ー ソル制御および DML 文
こ の章では、 SQL カー ソ ル制御文、 お よ びカー ソ ルを使用す る い く つかの SQL
DML 文について説明 し ます。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL アプ リ ケーシ ョ ンで使用す る 他の
DML 文については、 <SQL デー タ 操作言語 > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
37
第 3 章 : SQL カー ソ ル制御お よ び DML 文
ALLOCATE
ALLOCATE
目的
呼び出 し 側の ス ト ア ド ・ プ ロ シージ ャ か ら 、 呼び出 し 先の ス ト ア ド ・ プ ロ シージ ャ
が返 し た結果セ ッ ト を取 り 出せ る よ う に し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ 。
構文
ALLOCATE
cursor_name
CURSOR FOR PROCEDURE
procedure_name
;
1101A757
説明
構文要素
指定内容
cursor_name
事前に開かれてい る 参照先カー ソ ルの名前。
procedure_name
呼び出 し 先の SQL ス ト ア ド ・ プ ロ シージ ャ の名前。
ANSI 準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
規則
• 最初に NO SCROLL でカー ソ ルが開かれてい る と 、 そのカー ソ ルは結果セ ッ ト
の 「最初の行」 に配置 さ れます。
た と えば、 最初の カー ソ ルが 10 行の行を返 し 、 その う ちの 3 行を ス ト ア ド ・
プ ロ シージ ャ が読み取 っ た と す る と 、 残 り の 7 行が返 さ れ ま す。 結果セ ッ ト
は 4 番目の行か ら 始ま り ますが、 その行が最初の行の よ う に見え ます。
38
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
ALLOCATE
• 最初に SCROLL でカー ソ ルが開かれてい る と 、 そのカー ソ ルは直前に取 り 出 さ
れた行の直後の行に配置 さ れます。
た と えば、 カー ソ ルが全部で 10 行を返 し た と す る と 、 初期位置は 4 番目の行に
な り ます。
• カー ソ ルが SCROLL で開かれていれば、 呼び出 し 側が直前に取 り 出 さ れた行 よ
り 前の行にカー ソ ルを再配置で き ます。
• カー ソ ルが NO SCROLL ま たは SCROLL の ど ち ら で開かれていて も 、 結果セ ッ
ト が複数あ る 場合には、 それぞれの結果セ ッ ト を連続的に取 り 出 し ます。
• プ ロ シージ ャ が結果セ ッ ト を作成 し ない場合や、 すべての結果セ ッ ト が取 り 出
さ れて し ま っ てい る 場合には、 SQLSTATE 完了条件 '02001' ( 返 さ れ る 追加の動
的結果セ ッ ト が存在 し ない ) が返 さ れます。
• 最初の結果セ ッ ト の末尾に達 し た時点で、 その FETCH 文には SQLSTATE '02000'
( デー タ が存在 し ない ) が設定 さ れます。 次に続 く 結果セ ッ ト があ る と き には、
その結果セ ッ ト を 取得す る ために、 開い て い る カー ソ ル を 閉 じ る 必要が あ り
ま す。
• 追加の結果セ ッ ト がない と き にカー ソ ルを閉 じ る と 、 その CLOSE 文には
SQLSTATE 完了条件 '02001' ( 返 さ れ る 追加の動的結果セ ッ ト が存在 し な い )
が返 さ れ る こ と にな り ます。
• 追加の結果セ ッ ト が存在す る 場合、 次の警告が返 さ れます。 '0100D' ( 返 さ れ る
追加の動的結果セ ッ ト が存在す る )。
例
REPLACE PROCEDURE alloc007()
DYNAMIC RESULT SETS 1
BEGIN
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
EmpNo0 SMALLINT;
ProjId0 CHAR(8);
WkEnd0 DATE;
Hours0 DECIMAL(4,1);
ee0 CHAR(8);
ff0 VARCHAR(25);
gg0 DATE;
hh0 DATE;
ii0 DATE;
CALL drs_temp5();
ALLOCATE my_fetch CURSOR FOR PROCEDURE drs_temp5;
FETCH FIRST FROM my_fetch INTO empno0,projid0,wkend0,hours0;
INSERT INTO charges_temp2(empno0,projid0,wkend0,hours0);
WHILE (SQLCODE = 0)
DO
FETCH NEXT FROM my_fetch INTO empno0,projid0,wkend0,hours0;
IF (SQLCODE = 0)
THEN
INSERT INTO charges_temp2(empno0,projid0,wkend0,hours0);
END IF;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
39
第 3 章 : SQL カー ソ ル制御お よ び DML 文
ALLOCATE
END WHILE;
-- close the current result set cursor
CLOSE my_fetch;
-- see if there are result sets
WHILE (SQLSTATE = '0100D')
DO
-- allocate the next one.
ALLOCATE sp2 CURSOR FOR PROCEDURE drs_temp5;
WHILE (SQLCODE = 0)
DO
FETCH NEXT FROM sp2 into ee0,ff0,gg0,hh0,ii0;
IF (SQLCODE = 0)
THEN
INSERT INTO project_temp1(ee0,ff0,gg0,hh0,ii0);
END IF;
END WHILE;
CLOSE sp2;
END WHILE;
END;
40
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
CLOSE
CLOSE
目的
オープン ・ カー ソ ルを ク ロ ーズ し 、 カー ソ ルがオープン し ていた間に保持 し ていた
資源を リ リ ース し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL。
構文
CLOSE
cursor_name
GW01A003
説明
構文要素
指定内容
cursor_name
閉 じ る 対象であ る 、 開いてい る カー ソ ルの名前。
ANSI 準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
規則
• 結果セ ッ ト ・ カー ソ ルは、 CLOSE し てはいけ ません。 ス ト ア ド ・ プ ロ シージ ャ
で結果セ ッ ト ・ カー ソ ルを閉 じ る と 、 その結果セ ッ ト は削除 さ れ、 返 さ れな く
な り ます。
• cursor_name で識別 さ れ る カー ソ ルは、 事前に宣言 し てお く 必要があ り ます。
• cursor_name で識別 さ れ る カー ソ ルが開いていなければな り ません。
ス ト ア ド ・ プ ロ シージ ャ 内で CLOSE が実行依頼 さ れ る 時点で cursor_name が
オープン し ていない場合、 次の実行時例外が発生 し ます。
• SQLCODE は 7631 に設定 さ れ る
•
SQLSTATE は '24501' に設定 さ れ る
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
41
第 3 章 : SQL カー ソ ル制御お よ び DML 文
CLOSE
• 複合ス ト ア ド ・ プ ロ シージ ャ 文か ら 制御が渡 さ れ る と 、 その複合文の本体の中
で宣言 さ れてい る すべてのオープン ・ カー ソ ルは、 ス ト ア ド ・ プ ロ シージ ャ に
よ っ て暗黙的に閉 じ ら れます。
• CLOSE を動的 SQL 文 と し て実行す る こ と はで き ません。
例1
次に示す CLOSE の例では、 カー ソ ル名 projcursor で識別 さ れ る カー ソ ルを
OPEN し てか ら CLOSE し てい る ため有効です。
CREATE PROCEDURE sp1 (OUT par1 INTEGER, OUT Par2 CHAR(30))
BEGIN
DECLARE projcursor CURSOR FOR
SELECT *
FROM project
ORDER BY projid;
OPEN projcursor;
Label1:
LOOP:
FETCH projcursor INTO par1, par2;
IF (SQLSTATE = '02000') THEN
LEAVE label1;
END IF;
END LOOP label1;
CLOSE projcursor;
END;
例2
次に示す例の CLOSE では、 明示的に projcursor を閉 じ てい ます。 empcursor
カー ソ ルには、 OPEN はあ り ますが明示的な CLOSE はあ り ません。 こ の場合の
empcursor は、 ス ト ア ド ・ プ ロ シージ ャ が終了す る と き に暗黙的に閉 じ ら れます。
CREATE PROCEDURE sp1 (IN par1 CHAR(5))
BEGIN
DECLARE projcursor CURSOR FOR
SELECT *
FROM project
ORDER BY projid;
DECLARE empcursor CURSOR FOR
SELECT *
FROM employee
WHERE dept_code = par1;
OPEN projcursor;
OPEN empcursor;
CLOSE projcursor;
END;
関連 ト ピ ッ ク
詳細は、 以下の文を参照 し て く だ さ い。
• 「OPEN ( 埋め込み SQL 形式 )」 (79 ページ )
• 「OPEN ( ス ト ア ド ・ プ ロ シージ ャ 形式 )」 (82 ページ )
COMMIT 文 と ROLLBACK 文 も 、 オープン ・ カー ソ ルを閉 じ ます。 <SQL デー タ 操
作言語 > を参照 し て く だ さ い。
42
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DEALLOCATE PREPARE
DEALLOCATE PREPARE
目的
前準備 さ れた文を解放 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ 。
構文
DEALLOCATE PREPARE
statement_name
;
1101A758
説明
構文要素
指定内容
statement_name
PREPARE 文の statement name と 同 じ 識別子を指定 し ます。
ANSI 準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
例
DECLARE sql_stmt1 VARCHAR(100);
DECLARE item INTEGER;
DECLARE price DECIMAL(8,2);
SET sql_stmt1 = 'INSERT INTO T1 (?,?);';
PREPARE stmt1 FROM sql_stmt1;
SET item = 1052;
SET price = 3.95;
EXECUTE stmt1 USING item, price;
SET item = 3967;
SET price = 10.85;
EXECUTE stmt1 USING item, price;
DEALLOCATE PREPARE stmt1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
43
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR
DECLARE CURSOR
目的
カー ソ ルに名前を定義 し て、 割 り 当て ます。
呼び出 し
実行不可宣言。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL。
動的 SQL 形式の DECLARE CURSOR
動的 SQL 形式 の DECLARE CURSOR ( 「DECLARE CURSOR ( 動的 SQL 形式 )」
(46 ページ ) を参照 ) では、 カー ソ ル と 動的 SQL 文を関連付け ます。
動的 SQL 文は、 以下のいずれかにな り ます。
• デー タ を返す文
• Teradata SQL マ ク ロ
• マ ク ロ お よ びデー タ を返す文を含む、 サポー ト さ れてい る 文の組み合わせの
入っ た任意の要求
• Teradata Database ス ト ア ド ・ プ ロ シージ ャ
マ ク ロ形式の DECLARE CURSOR
マ ク ロ 形式の DECLARE CURSOR ( 「DECLARE CURSOR ( マ ク ロ 形式 )」
(48 ページ ) を参照 ) では、 カー ソ ル と Teradata SQL マ ク ロ を関連付け ます。
要求形式の DECLARE CURSOR
要求形式の DECLARE CURSOR ( 「DECLARE CURSOR ( 要求形式 )」 (50 ページ ) を
参照 ) では、 カー ソ ル と 、 SQL 文字列定数内で指定す る 複文要求な ど の任意の
Teradata SQL 要求を関連付け ます。
選択形式の DECLARE CURSOR
選択形式の DECLARE CURSOR ( 「DECLARE CURSOR ( 選択形式 )」 (53 ページ ) を
参照 ) では、 カー ソ ル と 、 SELECT 文な ど のデー タ を返す文を関連付け ます。
ス ト ア ド ・ プ ロ シージ ャ 形式の DECLARE CURSOR
ス ト ア ド ・ プ ロ シージ ャ 形式の DECLARE CURSOR ( 「DECLARE CURSOR ( ス ト ア
ド ・ プ ロ シージ ャ 形式 )」 (56 ページ ) を参照 ) では、 カー ソ ル と 、 SELECT 文な ど
の ス ト ア ド ・ プ ロ シージ ャ の FOR 文の本体内でデー タ を返す文を関連付け ます。
44
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR
規則 ( すべての形式 )
• 各カー ソ ル宣言では、 それぞれ別のカー ソ ル名を指定 し なければな り ません。
• カー ソ ル名は、 18 文字以内でなければな り ません。
• 特定の カー ソ ル名の カー ソ ル宣言は、 他の埋め込み SQL 文 ま たは ス ト ア ド ・
プ ロ シージ ャ 内のそのカー ソ ル名に対す る 参照 よ り も 前に配置 し なければな り
ません。
• COBOL の場合、 DECLARE CURSOR 文は、 DATA DIVISION 内ま たは
PROCEDURE DIVISION 内のいずれかに指定で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
45
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 動的 SQL 形式 )
DECLARE CURSOR ( 動的 SQL 形式 )
目的
準備 さ れた動的 SQL 文にカー ソ ルを定義 し て名前を割 り 当て ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
DECLARE
cursor_name
CURSOR FOR
statement_name
SCROLL
1101A307
説明
構文要素
指定内容
cursor_name
任意の有効な SQL 識別子。
SCROLL
宣言 さ れた カー ソ ルが、 FETCH 指向の宣言に基づいて応答セ ッ ト 内の
行を取 り 出せ る こ と を示す。
「FETCH ( 埋め込み SQL 形式 )」 (69 ページ ) を参照 し て く だ さ い。
SCROLL を指定 し ない場合、 カー ソ ルは応答セ ッ ト 内の次の行にのみ
ス ク ロ ールで き る 。
動的 SQL が SELECT 文であ る 場合に限っ て SCROLL を使用 し て く だ
さ い。
statement_name
以前に準備 さ れた文に関連付け ら れた名前。
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
46
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 動的 SQL 形式 )
有効に準備 さ れた動的 SQL 文
• 単一の、 デー タ を返 さ ない非マ ク ロ 文
• 単一の SELECT 文 (INTO 句な し で指定す る こ と )
• 単一の EXEC macro_name 文
• 上記の ど の文で も 組み込む こ と がで き る 複文要求
規則
• statement_name で指定 し た文を PREPARE し てか ら 、 その ト ラ ンザ ク シ ョ ン内で
動的カー ソ ルを OPEN し なければな り ません。
• 与え ら れた statement_name に対 し て宣言で き る 動的カー ソ ルは 1 つだけです。
• SELECT AND CONSUME カー ソ ルに対す る DELETE ま たは UPDATE 埋め込み
SQL 文は指定で き ません。
キ ュ ー表の カー ソ ルは、 PP2 ANSI モー ド では常に読み取 り 専用にな り ま す。
こ のため、 PP2 ANSI モー ド のキ ュ ー表カー ソ ルに対 し ては、 位置指定 さ れた
DELETE ま たは UPDATE ( つま り 、 最後に取 り 出 さ れた カー ソ ル行の削除ま た
は更新 ) を指定で き ません。
• PP2 ANSI モー ド の複文要求では、 ス ク ロ ール可能カー ソ ルを使用で き ません。
例
動的 DECLARE CURSOR 文の形式は次の と お り です。
DECLARE Ex CURSOR FOR DynStmt7
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
47
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( マ ク ロ 形式 )
DECLARE CURSOR ( マ ク ロ 形式 )
目的
マ ク ロ ・ カー ソ ルを定義 し て名前を割 り 当て ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
DECLARE
cursor_name
A
CURSOR FOR EXEC
database_name.
macroname
A
( parameter_list )
1101B011
説明
構文要素
指定内容
cursor_name
任意の有効な SQL 識別子。
database_name
こ の文で使用す る デー タ ベース。
macro_name
実行す る Teradata SQL マ ク ロ の名前。
parameter_list
Teradata SQL マ ク ロ ・ パ ラ メ ー タ 。
ANSI への準拠
ANSI/ISO SQL ではマ ク ロ が定義 さ れてい ません。 ANSI/ISO SQL:2011 規格に対す
る Teradata の拡張機能です。
許可
な し。
規則
•
シ ス テ ムは、 カー ソ ルが開いた と き にマ ク ロ を実行 し ます。 その後、 アプ リ
ケーシ ョ ン ・ プ ロ グ ラ ムは要求 カー ソ ルの結果 と し ての結果にア ク セ ス し ます。
• 指定 さ れ る マ ク ロ の中の ど の文 も 、 プ リ プ ロ セ ッ サ命令ま たは ス ト ア ド ・ プ ロ
シージ ャ 命令にす る こ と はで き ません。
48
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( マ ク ロ 形式 )
• マ ク ロ には、 以下の SQL 文はどれ も 組み込め ません。
・ CHECKPOINT
・ CLOSE
・ FETCH
・ LOGON
・ COMMIT
・ CONNECT
・ OPEN
・ POSITION
・ DATABASE
・ DESCRIBE
・ PREPARE
・ REWIND
・ ECHO
・ EXECUTE
・ SET BUFFERSIZE
・ SET CHARSET
・ EXECUTE IMMEDIATE
・ SET SESSION
例
マ ク ロ DECLARE CURSOR 文の構造は次の と お り です。
DECLARE Ex CURSOR FOR EXEC NewEmp
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
49
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 要求形式 )
DECLARE CURSOR ( 要求形式 )
目的
要求カー ソ ルを定義 し て名前を割 り 当て ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
DECLARE
cursor_name
CURSOR FOR
'request_specification'
1101B301
説明
構文要素
指定内容
cursor_name
宣言す る カー ソ ルの名前を指定 し ます。
request_specification
単一引用符で囲んだ リ テ ラ ル文字列。 セ ミ コ ロ ン で区切っ た任意数
の SQL 文か ら 成 り ます。
デフ ォ ル ト では、 文字列は単一引用符 (' ') で囲まれます。
QUOTESQL プ リ プ ロ セ ッ サ ・ パ ラ メ ー タ を使用 し て、 こ のデフ ォ
ル ト を オーバー ラ イ ド で き ます。 単一引用符は、 要求カー ソ ルの宣
言を、 カー ソ ルの他のカ テ ゴ リ か ら 構文上区別 し ます。
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
50
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 要求形式 )
規則
• request_specification 内の文には、 次に示すど の SQL 文 も 組み込む こ と がで き ま
せん。
・ CHECKPOINT
・ CLOSE
・ FETCH
・ LOGON
・ COMMIT
・ CONNECT
・ OPEN
・ POSITION
・ DATABASE
・ DESCRIBE
・ PREPARE
・ REWIND
・ ECHO
・ EXECUTE
・ SET BUFFERSIZE
・ SET CHARSET
・ EXECUTE IMMEDIATE
・ SET SESSION
•
ク ラ イ ア ン ト 言語の文字列 リ テ ラ ルの連結の構文に従っ て、 request_specification を
複数行にわた っ て続け る こ と がで き ます ( 埋め込み SQL のみ )。
• request_specification 内の文は、 Preprocessor2 宣言であ っ てはな り ません ( 埋め込
み SQL のみ )。
• シ ス テ ムではカー ソ ルを開いた と き に、 以下のいずれかの成功を反映 さ せ る よ
う に SQLCA を更新 し ます (SQLCA の SQLCODE は 0、 SQLSTATE は '00000'
に設定 さ れます )。
• 要求の最初の文
•
失敗が暗黙的な ト ラ ン ザ ク シ ョ ン の ロ ールバ ッ ク と 定義 さ れてい る 要求の
失敗
失敗条件があ る と き は、 常に成功報告を オーバー ラ イ ド し ます。 成功の場合は、
SQLCA 内の 3 番目の SQLERRD 要素にア ク テ ィ ビ テ ィ ・ カ ウ ン ト が示 さ れます。
要求の他の文の実行の結果を得 る には、 POSITION 文を使用 し ます ( 埋め込み
SQL のみ )。
• request_specification 内のいずれかの文がデー タ を返す文の場合、 ア プ リ ケー
シ ョ ン ・ プ ロ グ ラ ムは応答デー タ セ ッ ト を取得す る ために、 POSITION 文を使
用 し て該当の結果セ ッ ト に位置合わせ し なければな り ません。
OPEN はその位置を要求の最初の文に自動的に設定す る ので、 その場合は
POSITION 文は必要あ り ません。
FETCH 文に適切な ホ ス ト 変数 リ ス ト (INTO 句 ) を指定す る か、 ま たは出力
SQLDA (USING DESCRIPTOR 句 ) を使用 し ます ( 埋め込み SQL のみ )。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
51
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 要求形式 )
例
以下の例では、 複数行にわた る リ テ ラ ル文字列の連結の詳細は省いてい ます。 その
規則は ク ラ イ ア ン ト 言語に よ っ て決め ら れます。
DECLARE Ex CURSOR FOR
’UPDATE employee SET salary = salary * 1.08
WHERE deptno = 500;
SELECT deptname, name, salary
FROM employee, department
WHERE employee.deptno = department.deptno
ORDER BY deptname, name’
52
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 選択形式 )
DECLARE CURSOR ( 選択形式 )
目的
選択カー ソ ルに対 し て名前を定義 し 、 割 り 当て ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
DECLARE
cursor_name
A
CURSOR FOR
SCROLL
A
COMMENT
EXPLAIN
HELP
SHOW
SELECT
SELECT AND CONSUME
1101A306
説明
構文要素
指定内容
cursor_name
こ のカー ソ ルに割 り 当て る 名前。
こ の名前は、 任意の有効な SQL 識別子に し ます。
SCROLL
宣言 さ れた カー ソ ルが、 FETCH 指向の宣言に基づいて応答セ ッ ト 内の
行を取 り 出せ る こ と を示す。
「FETCH ( 埋め込み SQL 形式 )」 (69 ページ ) を参照 し て く だ さ い。
SCROLL を指定 し ない場合、 カー ソ ルは応答セ ッ ト 内の次の行にのみス
ク ロ ールで き る 。 こ れは、 デフ ォ ル ト です。
SQL 文が SELECT 文であ る 場合に限っ て SCROLL を使用 し て く だ さ い。
COMMENT
コ メ ン ト を返す有効な SQL COMMENT 文。
<SQL デー タ 定義言語 > の 「COMMENT」 を参照 し て く だ さ い。
EXPLAIN
有効な SQL EXPLAIN 要求修飾子。
<SQL デー タ 操作言語 > の 「EXPLAIN 修飾子」 を参照 し て く だ さ い。
HELP
有効な SQL HELP 文。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
53
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 選択形式 )
構文要素
指定内容
SHOW
有効な SQL SHOW 文。
<SQL デー タ 定義言語 > の 「SHOW」 を参照 し て く だ さ い。
SELECT
有効な埋め込み SQL SELECT 文。
「規則」 で列挙 さ れてい る 制約事項に注意 し て く だ さ い。
SELECT AND
CONSUME
有効な埋め込み SQL SELECT AND CONSUME 文。
「規則」 で列挙 さ れてい る 制約事項に注意 し て く だ さ い。
ANSI への準拠
ANSI/ISO SQL:2011 準拠 (Teradata 拡張機能を追加 )。
許可
な し。
規則
• SQL WITH…BY 句を指定す る こ と はで き ません。
•
カー ソ ル宣言に指定 さ れた全ての表、 ま たはそれ ら の表を収容す る デー タ ベー
ス に対す る SELECT 権限が必要です。
• カー ソ ル指定で参照 さ れ る 各ホ ス ト 変数は、 DECLARE CURSOR 文 よ り 先に定
義 し なければな り ません。
• FROM 句で特定す る 表はグループ ・ ビ ュ ー (GROUP BY 句を使用 し て定義 さ れ
た ビ ュ ー ) であ り 、 table_expression 内では以下の句を使 う こ と はで き ません。
• WHERE
•
GROUP BY
•
HAVING
• UNION 演算子を指定す る 場合、 合併内の各結果表の記述は、 列名を除いて同一
でなければな り ません。 結果表の合併に よ っ て形成 さ れ る ス プール表のすべて
の列には名前があ り ません。
結果は UNION 内の各問い合わせの個々の結果表の合併にな り 、 重複行は除去 さ
れます。
• ORDER BY 句を指定す る と 、 それぞれの列指定では、 ス プール表の列を名前で
指定す る 必要があ り ます。
ORDER BY 句の符号無 し 整数列参照には、 ス プール表の列を相対番号で指定す
る 必要があ り ます。
名前付 き 列は、 列指定ま たは符号無 し 整数のいずれかに よ っ て参照で き ます。
名前のない列は、 符号無 し 整数に よ っ て参照 し なければな り ません。
54
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( 選択形式 )
• SELECT AND CONSUME カー ソ ルに対す る DELETE ま たは UPDATE 埋め込み
SQL 文は指定で き ません。
キ ュ ー表の カー ソ ルは、 PP2 ANSI モー ド では常に読み取 り 専用にな り ま す。
こ のため、 PP2 ANSI モー ド のキ ュ ー表カー ソ ルに対 し ては、 位置指定 さ れた
DELETE ま たは UPDATE ( つま り 、 最後に取 り 出 さ れた カー ソ ル行の削除ま た
は更新 ) を指定で き ません。
• PP2 ANSI モー ド の複文要求では、 ス ク ロ ール可能カー ソ ルを使用で き ません。
例1
DECLARE ex1 CURSOR FOR
SELECT *
FROM project
ORDER BY proj_id
例2
DECLARE ex3 CURSOR FOR
SELECT a, b, ’X’
FROM tablex
WHERE a > b
UNION
(SELECT a, b, ’Y’
FROM tabley
WHERE a > b
INTERSECT
SELECT a, b, ’Y’
FROM tablez
WHERE a > b)
ORDER BY 1,2
例3
DECLARE ex2 CURSOR FOR
EXPLAIN SELECT deptname, name
FROM employee, department
WHERE employee.deptno = department.deptno
ORDER BY deptname, name
例4
DECLARE ex4 CURSOR FOR
HELP TABLE employee
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
55
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シ ージ ャ 形式 )
目的
カー ソ ルに名前を定義 し て、 割 り 当て ます。
呼び出 し
実行不可プ ロ グ ラ ム。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
DECLARE
CURSOR
cursor_name
A
SCROLL
NO SCROLL
B
A
WITHOUT RETURN
WITH RETURN
ONLY
TO
CALLER
CLIENT
B
FOR
;
cursor_specification
FOR
READ ONLY
UPDATE
statement_name
1101B496
56
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
説明
構文要素
指定内容
cursor_name
宣言す る カー ソ ルの名前を指定 し ます。
SCROLL
宣言 し た カー ソ ルで、 結果セ ッ ト 内の次の行を取 り 出せ る よ う
にす る こ と も 、 結果セ ッ ト 内の任意の場所か ら そのセ ッ ト の最
初の行を取 り 出せ る よ う にす る こ と も で き ます。
NO SCROLL
• SCROLL は、 結果セ ッ ト の次の行に順方向ス ク ロ ールす る こ
と も 、 結果セ ッ ト の最初の行に直接ス ク ロ ールす る こ と も で
き ます。
• デフ ォ ル ト の NO SCROLL は、 結果セ ッ ト の次の行への順方
向ス ク ロ ール し かで き ません。
「FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 )」 (74 ページ ) を参照
し て く だ さ い。
WITHOUT RETURN
プ ロ シージ ャ は、 結果セ ッ ト を返 し ません。
WITHOUT RETURN は、 デフ ォ ル ト です。
WITH RETURN
ま たは
WITH RETURN TO
CALLER
WITH RETURN ONLY
ま たは
WITH RETURN ONLY
TO CALLER
• こ のカー ソ ルは結果セ ッ ト ・ カー ソ ルです。
• 結果セ ッ ト を現在の ス ト ア ド ・ プ ロ シージ ャ ( カー ソ ル を
開いたプ ロ シージ ャ ) と 呼び出 し 側のプ ロ シージ ャ に返 し
ま す。
「結果セ ッ ト を返す場合の規則」 (59 ページ ) を 参照 し て く だ
さ い。
• こ のカー ソ ルは結果セ ッ ト ・ カー ソ ルです。
• 結果セ ッ ト を ス ト ア ド ・ プ ロ シージ ャ の呼び出 し 側にのみ返
し ます。
「結果セ ッ ト を返す場合の規則」 (59 ページ ) を 参照 し て く だ
さ い。
WITH RETURN TO
CLIENT
• こ のカー ソ ルは結果セ ッ ト ・ カー ソ ルです。
• 結果セ ッ ト を ク ラ イ ア ン ト (BTEQ な ど のアプ リ ケーシ ョ ン )
と 現在の ス ト ア ド ・ プ ロ シージ ャ ( カー ソ ルを開いたプ ロ
シージ ャ ) に返 し ます。
「結果セ ッ ト を返す場合の規則」 (59 ページ ) を 参照 し て く だ
さ い。
WITH RETURN ONLY
TO CLIENT
• こ のカー ソ ルは結果セ ッ ト ・ カー ソ ルです。
• 結果セ ッ ト を ク ラ イ ア ン ト (BTEQ な ど のアプ リ ケーシ ョ ン )
に返 し ます。
「結果セ ッ ト を返す場合の規則」 (59 ページ ) を 参照 し て く だ
さ い。
cursor_specification
カー ソ ルが読み取 る ま たは更新す る 行を検索す る SELECT 文。
READ ONLY
結果セ ッ ト 内の行を読み取 る ためだけにカー ソ ルを使用で き る
よ う に指定 し ます。
こ れは、 デフ ォ ル ト です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
57
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
構文要素
指定内容
UPDATE
結果セ ッ ト 内の行を更新ま たは削除す る ためにカー ソ ルを使用
で き る よ う に指定 し ます。
UPDATE が指定 さ れ る と 、 次のいずれか も 指定す る 必要があ り
ます。
• WITH RETURN ONLY
• WITH RETURN ONLY TO CALLER
• WITH RETURN TO CLIENT
• WITH RETURN ONLY TO CLIENT
statement_name
動的形式の DECLARE CURSOR 文を特定 し ます。
ANSI への準拠
ONLY キー ワー ド と 、 TO CALLER お よ び TO CLIENT オプシ ョ ンは、 ANSI/ISO
SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
DECLARE CURSOR 文 と FOR 文
FOR 文で も 、 カー ソ ルが定義 さ れます。
DECLARE CURSOR 文 と FOR 文の違いについては、 「DECLARE CURSOR 文お よ び
FOR 文のカー ソ ル」 (26 ページ ) を参照 し て く だ さ い。
一般規則
•
カー ソ ル宣言は以下の よ う に指定す る 必要があ り ます。
• ロ ーカル宣言の後
•
ハン ド ラ ー宣言の前
•
カー ソ ル名は、 同 じ 複合文の宣言内で固有でなければな り ません。
• ス ク ロ ール能力のあ る 句を明示的に指定 し ない場合は、 NO SCROLL がデフ ォ ル
ト と な り 、 カー ソ ルは順方向ス ク ロ ールのみが可能 と な り ます。
• 更新能力のあ る 句を明示的に指定 し ない場合は、 FOR READ ONLY がデフ ォ ル
ト と な り ます。
• 定位置カー ソ ルを作成す る には、 FOR UPDATE 句を明示的に指定 し ます。 こ れ
に よ り 、 カー ソ ルを使用 し てその結果行に対 し て削除操作 と 更新操作がで き る
よ う にな り ます。
58
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
結果セ ッ ト を返す場合の規則
• CREATE/REPLACE PROCEDURE 文の DYNAMIC RESULT SETS 句で、 結果セ ッ
ト の数を指定 し ます。 詳細は、 <SQL デー タ 定義言語 > の 「CREATE/REPLACE
PROCEDURE」 を参照 し て く だ さ い。
• WITH RETURN 句を指定す る と 、 ス ト ア ド ・ プ ロ シージ ャ は結果セ ッ ト を現在
のプ ロ シージ ャ 、 ク ラ イ ア ン ト 、 ま たは宣言 し た各結果セ ッ ト ・ カー ソ ルの呼
び出 し 側に返 し ます。
• WITH RETURN を指定す る と い う こ と は、 WITH RETURN TO CALLER を指定す
る こ と と 同 じ です。
• WITH RETURN ONLY を指定す る と い う こ と は、 WITH RETURN ONLY TO
CALLER を指定す る こ と と 同 じ です。
• WITH RETURN ONLY を指定す る と 、 カー ソ ルを開 く ス ト ア ド ・ プ ロ シージ ャ
はカー ソ ルを使用 し て結果セ ッ ト か ら 行を取 り 出す こ と がで き ません。
• WITH RETURN ま たは WITH RETURN TO CALLER を指定する と 、 FOR UPDATE を
指定で き ません。
• TO CLIENT を指定す る と 、 た と えネ ス ト さ れた ス ト ア ド ・ プ ロ シージ ャ か ら 呼
び出 さ れた場合で も 、 結果セ ッ ト は ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンに返 さ れ
ます。
• WITH RETURN ONLY TO CLIENT 句を指定す る と 、 ス ト ア ド ・ プ ロ シージ ャ は
結果セ ッ ト ( 複数可 ) を、 対象のプ ロ シージ ャ を呼び出 し た ス ト ア ド ・ プ ロ シー
ジ ャ ま たは外部ス ト ア ド ・ プ ロ シージ ャ ではな く 、 ク ラ イ ア ン ト に返 し ます。
• 複数の ス ト ア ド ・ プ ロ シージ ャ が WITH RETURN を指定す る と 、 シ ス テ ムは開
いた順に結果セ ッ ト を返 し ます。
• 結果セ ッ ト を現在の ス ト ア ド ・ プ ロ シージ ャ 、 呼び出 し 側ま たは ク ラ イ ア ン ト
に返すために、 結果セ ッ ト ・ カー ソ ルは開いた ま ま に し ます。 結果セ ッ ト ・
カー ソ ルが閉 じ ら れてい る と 、 シ ス テ ムは結果セ ッ ト を返 し ません。
• 結果セ ッ ト は、 次の よ う に返 さ れます。
•
結果セ ッ ト を作成 し た ス ト ア ド ・ プ ロ シージ ャ ではな く 、 呼び出 し 側の応答
属性 ( 応答モー ド 、 応答保持、 LOB 応答モー ド ) を継承 し ます。 た と えば、
BTEQ で CALL を実行す る と 、 シ ス テ ムは結果セ ッ ト を Indicator モー ド で ス
ト ア ド ・ プ ロ シージ ャ に送信 し 、 Field モー ド で BTEQ に送信 し ます。
•
呼び出 し 側ま たはセ ッ シ ョ ンの照合ではな く 、 ス ト ア ド ・ プ ロ シージ ャ の照
合に基づ き ます。
例1
次の例は、 ス ト ア ド ・ プ ロ シージ ャ におけ る カー ソ ルの正 し い使い方を説明 し てい
ます。 6 行目 と 10 行目で宣言が行なわれてい ます。
CREATE PROCEDURE spsample1()
BEGIN
L1: BEGIN
DECLARE vname CHARACTER(30);
DECLARE vamt INTEGER;
DECLARE empcursor CURSOR FOR
SELECT empname, salary
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
59
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
FROM empdetails
ORDER BY deptcode;
DECLARE deptcursor CURSOR FOR
SELECT deptname
FROM department;
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
BEGIN
OPEN empcursor;
...
END;
...
...
END L1;
END;
例2
次の例は、 暗黙的な FOR READ ONLY カー ソ ルを説明 し てい ます。 こ の ス ト ア ド ・
プ ロ シージ ャ では、 empcursor の宣言で FOR UPDATE 句を指定 し ていないため、
デフ ォ ル ト の FOR READ ONLY にな り ます。
CREATE PROCEDURE sp1()
BEGIN
DECLARE empcursor CURSOR FOR
SELECT *
FROM employee
WHERE deptcode = 101
ORDER BY empid;
...
END;
例3
次の例は、 明示的に宣言 さ れた FOR READ ONLY カー ソ ルを説明 し てい ます。
CREATE PROCEDURE sp1()
BEGIN
DECLARE empcursor CURSOR FOR
SELECT *
FROM employee
WHERE deptcode = 101
FOR READ ONLY;
...
END;
例4
次の例は、 FOR UPDATE カー ソ ルを説明 し てい ます。
CREATE PROCEDURE sp1()
BEGIN
DECLARE empcursor CURSOR FOR
SELECT *
FROM employee
WHERE deptcode = 101
FOR UPDATE;
...
END;
60
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
例5
次の例では、 WITH RETURN ONLY TO CLIENT の使用方法を説明 し てい ます。
DECLARE results1 CURSOR WITH RETURN ONLY TO CLIENT FOR
SELECT store, item, on_hand
FROM inventory
ORDER BY store, item;
OPEN results1;
例6
次の例では、 WITH RETURN 句な し で定義 さ れた動的 SQL 文を ス ト ア ド ・ プ ロ
シージ ャ 内で使用 し てい ます。
CREATE PROCEDURE GetEmployeeSalary
(IN EmpName VARCHAR(100), OUT Salary DEC(10,2))
BEGIN
DECLARE SqlStr VARCHAR(1000);
DECLARE C1 CURSOR FOR S1;
SET SqlStr = 'SELECT Salary FROM EmployeeTable WHERE EmpName = ?';
PREPARE S1 FROM SqlStr;
OPEN C1 USING EmpName;
FETCH C1 INTO Salary;
CLOSE C1;
END;
例7
次の例では、 動的形式の DECLARE CURSOR 文を説明 し てい ます。 カー ソ ル文で
は、 動的 SELECT に よ っ て結果カー ソ ルを指定 し てい ます。
DECLARE statement1_str VARCHAR(500);
DECLARE result_set CURSOR WITH RETURN ONLY FOR stmt1;
SET statement1_str = 'SELECT store, item, on_hand FROM inventory
ORDER BY store, item;'
PREPARE stmt1 FROM statement1_str;
OPEN result_set;
例8
次の例では、 動的パ ラ メ ー タ ・ マーカーの使用方法を説明 し てい ます。 動的パ ラ
メ ー タ ・ マーカーのデー タ は、 OPEN 文に渡 さ れます。
DECLARE Store_num INTEGER;
DECLARE statement1_str VARCHAR(500);
DECLARE result_set CURSOR WITH RETURN ONLY FOR stmt1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
61
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
SET statement1_str = 'SELECT store, item, on_hand'
' FROM inventory WHERE store = ?ORDER BY store, item;'
PREPARE stmt1 FROM statement1_str;
SET Store_num = 76;
OPEN result_set USING Store_num;
関連 ト ピ ッ ク
定位置カー ソ ルについての詳細は、 「定位置カー ソ ル」 (31 ページ ) を参照 し て く だ
さ い。
動的結果セ ッ ト については、 「ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト の返送」
(138 ページ ) を参照 し て く だ さ い。
62
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DELETE ( 定位置形式 )
DELETE ( 定位置形式 )
目的
更新可能カー ソ ル呼び出 し か ら 、 最後に取 り 出 さ れた行を削除 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL。
構文
DELETE
FROM table_name
WHERE CURRENT OF
cursor_name
DEL
GW01A046
説明
構文要素
指定内容
table_name
削除す る 行が見つか っ た表の名前。
cursor_name
削除す る 行の位置を示すために使用 さ れ る カー ソ ルの名前。
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
こ の形式は Teradata セ ッ シ ョ ン ・ モー ド では無効です。
許可
その表に対す る DELETE 権限を持っ ていなければな り ません。
ビ ュ ーでデー タ を削除す る ための権限を付与す る 場合には、 注意が必要です。
ビ ュ ーで行を削除す る と き 、 ユーザーに見え ない フ ィ ール ド 内のデー タ も ま た削除
さ れます。
WHERE CURRENT OF 使用上の制限
• cursor_name は、 有効な更新可能カー ソ ルでなければな り ません。
• カー ソ ルの現在行の複数更新や、 カー ソ ルの現在行の更新に続 く 削除は許 さ れ
てい ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
63
第 3 章 : SQL カー ソ ル制御お よ び DML 文
DELETE ( 定位置形式 )
• table_name は、 更新可能カー ソ ル要求で SELECT し た表 と 同 じ でなければな り
ません。
• 参照 さ れ る カー ソ ルは、 FETCH 文 を 介 し て有効な行に配置 し な ければな り ま
せん。
規則
• プ リ プ ロ セ ッ サ TRANSACT ま たは -tr オプシ ョ ンが ANSI に設定 さ れてい る 必
要があ り ます。
• DELETE 文で WHERE CURRENT OF 句を指定す る と 、 WHERE CURRENT OF
cursor_name で指定 さ れた カー ソ ルが現在指 し てい る 行を操作で き ます。
例
こ の例では、 表か ら 削除す る ために使用 さ れ る カー ソ ルの名前は X01 です。
EXEC SQL
DELETE FROM customer
WHERE CURRENT OF x01;
関連 ト ピ ッ ク
<SQL デー タ 操作言語 > の 「DELETE」 を参照 し て く だ さ い。
64
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
EXECUTE
EXECUTE
目的
準備 さ れた文を ス ト ア ド ・ プ ロ シージ ャ 内で実行 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
EXECUTE
statement_name
,
USING
SQL_identifier
SQL_parameter
1101A760
説明
構文要素
指定内容
statement_name
前準備 さ れた文に関連付けた名前。
SQL_identifier
有効な SQL 識別子。
SQL_parameter
SQL パ ラ メ ー タ 。
ANSI 準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
規則
• EXECUTE は、 次に示す文や要求 と 同時に使用す る こ と はで き ません。
• 動的デー タ を返す文
•
動的複文要求
• DESCRIBE その も のを動的 SQL 文 と し て実行す る こ と はで き ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
65
第 3 章 : SQL カー ソ ル制御お よ び DML 文
EXECUTE
USING 句には、 次に示す規則が適用 さ れます。
• USING 句は、 statement_name に よ っ て指定 さ れ る SQL 文への入力 と し て使用 さ
れ る 変数を識別 し ます。
• 指定 し た statement-name は、 有効な も のであ り 、 EXECUTE 文の前に宣言 さ れて
い る 必要があ り ます。
• 指定す る 変数の数は、 識別 さ れ る 文におけ る パ ラ メ ー タ ・ マーカー ( 疑問符、 ?)
の数 と 同 じ でなければな り ません。 n 番目の変数 と 、 n 番目のパ ラ メ ー タ ・ マー
カーが対応 し てい る 必要があ り ます。
• 引数は タ ーゲ ッ ト に適合 し てい る 必要があ り ます。 必要な適合変換は実行 さ れ
ます。
例1
CREATE PROCEDURE sales_update(store_table VARCHAR(10),
item INTEGER,
price DECIMAL(8,2) )
BEGIN
DECLARE sql_stmt VARCHAR(100);
SET sql_stmt = 'UPDATE ' | store_table | ' SET
store_price=' | price | '
WHERE store_item =' | item;
PREPARE stmt1 FROM SQL_stmt;
EXECUTE stmt1;
END;
例2
CREATE PROCEDURE sales_update(store_table VARCHAR(10),
item INTEGER,
price DECIMAL(8,2) )
BEGIN
DECLARE price_read DECIMAL(8,2);
DECLARE sql_stmt VARCHAR(100);
SET sql_stmt = 'UPDATE ' | store_table | ' SET
store_price=?
WHERE store_item = ?;';
PREPARE stmt1 FROM sql_stmt;
EXECUTE stmt1 USING price, item;
END;
66
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
EXECUTE IMMEDIATE
EXECUTE IMMEDIATE
目的
ス ト ア ド ・ プ ロ シージ ャ 内で文を準備 し て実行 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
EXECUTE IMMEDIATE
statement_name
1101A761
説明
構文要素
指定内容
statement_name
以下の う ちの 1 つ。
• リ テラル
• SQL ス ト リ ン グ変数の参照
• パラ メ ータ
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
67
第 3 章 : SQL カー ソ ル制御お よ び DML 文
EXECUTE IMMEDIATE
例
CREATE PROCEDURE sales_update(store_table VARCHAR(10),
item INTEGER,
price DECIMAL(8,2) )
BEGIN
DECLARE sql_stmt VARCHAR(100);
SET
SET sql_stmt = 'UPDATE ' | store_table | ' SET
store_price=' | price |
' WHERE store_item =' | item;
EXECUTE IMMEDIATE sql_stmt;
END;
68
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( 埋め込み SQL 形式 )
FETCH ( 埋め込み SQL 形式 )
目的
カー ソ ルを応答セ ッ ト の次の行 ( デフ ォ ル ト ) ま たは任意指定の行に置 き 、 その行
の値を ホ ス ト 変数に割 り 当て ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
FETCH
cursor_name
A
NEXT
PRIOR
FIRST
LAST
ABSOLUTE n
RELATIVE n
A
,
INTO
host_variable_name
:
: host_indicator_name
INDICATOR
USING DESCRIPTOR
descriptor_area
:
1101A297
説明
構文要素
指定内容
NEXT
現在のカー ソ ル位置か ら 見て次の行を応答セ ッ ト か ら 取 り 出す。
NEXT がデフ ォ ル ト です。
PRIOR
現在のカー ソ ル位置か ら 見て前の行を応答セ ッ ト か ら 取 り 出す。
FIRST
応答セ ッ ト の最初の行を取 り 出す。
LAST
応答セ ッ ト の最後の行を取 り 出す。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
69
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( 埋め込み SQL 形式 )
構文要素
指定内容
ABSOLUTE n
以下を基準 と し て、 応答セ ッ ト の n 番目の行を取 り 出す。
• n が正の数であれば、 セ ッ ト の最初の行か ら 数え る 。
• n が負の数であれば、 セ ッ ト の最後の行か ら 数え る 。
n には host_variable_name ま たは integer_constant を指定で き る 。
ホ ス ト 変数のデー タ ・ タ イ プは、 任意の 8 バ イ ト 数値デー タ ・
タ イ プ ( 位取 り ゼ ロ )。
integer_constant は最大 31 桁。
RELATIVE n
以下の よ う に し て、 応答セ ッ ト の n 番目の行を取 り 出す。
• n が正の数であれば、 n の値だけ前方に移動す る 。
• n が負の数であれば、 n の値だけ後方に移動す る 。
現在のカー ソ ル位置を基準 と す る 。
n には host_variable_name ま たは integer_constant を指定で き る 。
ホ ス ト 変数のデー タ ・ タ イ プは、 任意の 8 バ イ ト 数値デー タ ・
タ イ プ ( 位取 り ゼ ロ )。
integer_constant は最大 31 桁。
cursor_name
1 つ以上の行が取 り 出 さ れ る オープ ン し て い る 選択 カ ー ソ ルの
名前。
host_variable_name
現在行の列値が割 り 当て ら れ る 変数。
名前の前に コ ロ ン記号を付け る か ど う かは任意指定です。
host_indicator_
variable
標識変数。
descriptor_area
SQL 記述領域 (SQLDA)
名前の前の コ ロ ン文字は必須です。
SQLDA 構造がポ イ ン タ と し て宣言されている場合、 descriptor_
area を名前ま たはポ イ ン タ 参照 (*sqldaname) と し て C プ ロ グ ラ ム
に指定で き ます。
詳細は <Teradata PreProcessor2 埋 め 込み SQL プ ロ グ ラ マ ・
ガ イ ド > を 参照 し て く だ さ い。
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
70
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( 埋め込み SQL 形式 )
ス ク ロール可能カ ー ソ ル
NEXT 以外の FETCH 指向を使用す る には、 ス ク ロ ール可能カー ソ ルを あ ら か じ め
宣言 し てお く 必要があ り ます。 「DECLARE CURSOR ( 選択形式 )」 (53 ページ ) を参
照 し て く だ さ い。
ス ク ロ ール可能カー ソ ルを開 く と 、 カー ソ ルは応答セ ッ ト の最初の行の前に置かれ
ます。 いずれかの FETCH 指向キー ワー ド を使っ て取 り 出す こ と がで き ます。
ア ク セ ス のパフ ォーマ ン ス を向上す る ために、 マルチセ ッ シ ョ ン接続で ス ク ロ ール
可能カー ソ ルを開 く こ と がで き ます。 アプ リ ケーシ ョ ンが順序どお り に行にア ク セ
ス し ない場合、 応答バ ッ フ ァ ・ サ イ ズ を行の取 り 出 し サ イ ズ と 等 し く 設定す る と 、
パフ ォーマン ス が向上す る こ と があ り ます。 最適なパフ ォーマン ス を得 る ために、
プ ロ グ ラ マは さ ま ざ ま な応答バ ッ フ ァ のサ イ ズ を 試行す る こ と が で き ま す。
「SET BUFFERSIZE」 (386 ページ ) を参照 し て く だ さ い。
規則
• SQLDA を定義す る 必要があ り ます。
• FETCH を動的 SQL 文 と し て実行す る こ と はで き ません。
•
ス ク ロ ール可能カー ソ ル FETCH では、 複文要求を使用で き ません。
• PP2 COMMITTED モー ド では ス ク ロ ール可能カー ソ ル FETCH を使用で き
ません。
• cursor_name で特定 さ れ る カー ソ ルは、 事前に宣言 し てお く 必要があ り ます。
• INTO 句は、 静的ま たは動的 SQL 文で宣言 し た カー ソ ル と 一緒に使用 し ます。
USING DESCRIPTOR 句は、 動的 SQL 文で宣言 し た選択カー ソ ル と 一緒に使用
す る こ と を意図 し た も のです。
• 要求に よ っ て返 さ れ る 列の数は、 ホ ス ト 変数指定の数、 あ る いは SQLDA の
SQLVAR 配列の要素数 と 一致 し ていなければな り ません。 つま り 、 結果セ ッ ト
に返 さ れ る 列の数は、 SQLD フ ィ ール ド の値 と 等 し く なければな り ません。
• ホ ス ト 変数指定に よ っ て、 あ る いは SQLDA の SQLVAR 配列で指定 し た主な ホ
ス ト 変数 と 、 返 さ れ る デー タ の対応す る 列は、 同 じ デー タ ・ タ イ プのグループ
に属 し ていなければな り ません。
ただ し 、 唯一の有効な例外 と し て、 主な ホ ス ト 変数が近似数値デー タ ・ タ イ プ
の場合、 ス プール表の列は、 近似数値デー タ ・ タ イ プか絶対数値デー タ ・ タ イ
プの ど ち ら かにす る こ と がで き ます。
• USING DESCRIPTOR 句を指定し た場合は、 SQLDA の SQLDATA および SQLIND
ポ イ ン タ ・ フ ィ ール ド が、 適切な ホ ス ト 変数を ポ イ ン ト す る よ う に設定 さ れて
い る こ と を検証 し なければな り ません。
COBOL 言語にはポ イ ン タ値を設定する ためのサポー ト が用意 さ れていないので、
Teradata Database では こ の タ ス ク を 行な う た め に呼び出せ る サー ビ ス ・ ルー
チ ン を 提供 し てい ます。
IBM の VS COBOL II には、 ポ イ ン タ 値を設定す る ために変更 さ れた SET 文が用
意 さ れてい ます。 COBOL で コ ーデ ィ ン グ し てい る プ ロ グ ラ マの方は、 適宜 こ の
機能を使用す る こ と を考慮 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
71
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( 埋め込み SQL 形式 )
• cursor_name で識別 さ れ る カー ソ ルが開いていなければな り ません。
• cursor_name で識別 さ れ る カー ソ ルは次行に置かれ、 次の規則に従っ て ホ ス ト
変数に値が割 り 当て ら れます。
カー ソ ルの状態
その場合
配置 さ れたばか り
FETCH は以下を戻 し ます。
• 要求 さ れたデー タ ( 正常にデー タ を戻す文の場合 )。
• SQLCODE +100 お よ び SQLSTATE '02xxx' ( デー タ がない
場合 )。
• エ ラ ー ( ロ ールバ ッ ク を引 き 起 こ さ ない SQL < O and
SQLSTATE > '02xxx' の場合 )。
• 最終行ま たはそれ以降
に置かれてい る
ま たは
• カー ソ ルは最終行 よ り 後に置かれ ます。
• シ ス テ ムは、 SQLCODE に +100 を割 り 当て ます。
• シ ス テ ムは、 SQLSTATE に '02xxx' を割 り 当て ます。
• デー タ を返 さ ない
• ホ ス ト 変数は未変更の ま ま にな り ます。
行 よ り 前に置かれてい る
• カー ソ ルはその行上に置かれます。
• シ ス テ ムは、 INTO 句ま たは出力 SQLDA で指定 し た ホ ス
ト 変数に、 行にあ る 値を割 り 当て ます。
最終行以外の行上に置か
れてい る
• カー ソ ルは、 その行の直後の行上に置かれ ます。
• シ ス テ ムは、 INTO 句ま たは出力 SQLDA で指定 し た ホ ス
ト 変数に、 新 し い現在行にあ る 値を割 り 当て ます。
•
シ ス テ ムは、 INTO 句ま たは SQLDA の SQLVAR 配列で指定 し た ホ ス ト 変数に、
ホ ス ト 変数を指定 し た順に値を割 り 当て ます。 シ ス テ ムは、 最後に SQLSTATE
と SQLCODE に値を割 り 当て ます。
•
ホ ス ト 変数に値を割 り 当て る と き にエ ラ ーが発生 し た場合、 シ ス テ ムはホ ス ト
変数への値の割 り 当て を停止 し 、 以下の値を結果 コ ー ド 変数に割 り 当て ます。
SQLCODE
SQLSTATE
-303
'22509'
-304
'22003'
-413
'22003'
• 以下の表では、 返 さ れるデータ のフ ィ ール ド が NULL の場合、 対応する ホ ス ト 変
数を指定し たかど う かに応じ て、 シ ス テ ムが何を割 り 当て る かを示し ています。
72
対応す る ホ ス ト 変数
シ ス テ ムの実行内容
指定 し た場合
ホ ス ト 標識変数に -1 が割 り 当て ら れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( 埋め込み SQL 形式 )
対応す る ホ ス ト 変数
シ ス テ ムの実行内容
指定 し ない場合
• SQLCODE に -305 が割 り 当て ら れます。
• SQLSTATE に '22002' が割 り 当て ら れます。
ど ち ら の場合 も 、 ホ ス ト 変数は未変更の ま ま にな り ます。
• 以下の表では、 一時表の行の列値が NOT NULL で、 対応す る 標識ホ ス ト 変数を
指定 し ていた場合に、 シ ス テ ムが設定す る ホ ス ト 標識変数を示 し てい ます。
状況
•
シ ス テ ムが設定す る ホ ス ト 標
識変数の内容
列お よ び主な ホ ス ト 変数に CHARACTER と 入力 し た
場合に、 列値がその主ホ ス ト 変数 よ り 長い
列値の長 さ
その他
0
シ ス テ ムは、 ホ ス ト 変数の規則に従っ て、 対応す る 主な ホ ス ト 変数に列値を設
定 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
73
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
FETCH ( ス ト ア ド ・ プ ロ シ ージ ャ 形式 )
目的
カー ソ ルを応答セ ッ ト の次の行 ( デフ ォ ル ト ) ま たは任意指定の行に置 き 、 その行
の値を ロ ーカル変数やパ ラ メ ー タ に割 り 当て ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
FETCH
cursor_name
INTO
A
FROM
NEXT
FIRST
,
A
local_variable_name
;
parameter_reference
1101A074
説明
構文要素
指定内容
NEXT
応答セ ッ ト か ら 次の行 ( 存在す る 場合 ) を取 り 出す。
NEXT がデフ ォ ル ト です。
FIRST
応答セ ッ ト か ら 最初の行を取 り 出す。
cursor_name
オープ ン し てい る 選択カー ソ ル ( 割 り 当て ら れた カー ソ ルを含む )
の名前。 こ こ か ら 行が取 り 出 さ れ ます。
local_variable_name
取 り 出 し た行を割 り 当て る ロ ーカル変数の名前。
事前定義デー タ 型 と UDT (VARIANT_TYPE UDT を除 く ) の ど ち ら
も サポー ト さ れ ます。
parameter_reference
74
取 り 出 し た行を割 り 当て る INOUT ま たは OUT パ ラ メ ー タ の名前。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
応答セ ッ ト に行がない場合
FETCH を実行 し た と き に応答セ ッ ト 内に行がない場合、 シ ス テ ムは次の実行時例
外を返 し ます。
• SQLCODE は 7362 に設定 さ れ る
• SQLSTATE は '02000' に設定 さ れ る
シ ス テ ムは、 こ の実行時警告条件を プ ロ シージ ャ 内で処理 し ます。 こ れが処理 さ れ
ない と 、 プ ロ シージ ャ は、 失敗 し た取 り 出 し 操作の次の文か ら 続行 し ます。
取 り 出 し た行の割 り 当て順序
シ ス テ ムは行の値を ロ ーカル変数ま たは出力パ ラ メ ー タ に割 り 当て ます。 割 り 当て
順序は、 その変数お よ びパ ラ メ ー タ を INTO リ ス ト 内で宣言 し た順にな り ます。
一般規則
• 指定 し た カー ソ ルは、 FETCH の実行時に開いてい る 必要があ り ます。
カー ソ ルを開いていない と 、 シ ス テ ムは次の実行時例外を返 し ます。
• SQLCODE は 7631 に設定 さ れ る
•
SQLSTATE は '24501' に設定 さ れ る
• ALLOCATE 文で参照 さ れ る カー ソ ルについては、 「ALLOCATE」 (38 ページ ) を
参照 し て く だ さ い。
• FETCH に よ っ て返 さ れ る 値の数は、 INTO リ ス ト 内で宣言 し た ロ ーカル変数お
よ び出力パ ラ メ ー タ の数 と 一致 し てい る 必要があ り ます。
不一致が確認 さ れ る タ イ ミ ン グ
Teradata Database が返す内容
コ ンパ イ ル時
コ ンパ イ ル ・ エ ラ ー SPL1027。
実行時
実行時例外 :
• SQLCODE は 7608 に設定 さ れ る
• SQLSTATE は 'T7608' に設定 さ れ る
• 取 り 出 さ れ る 列のデー タ ・ タ イ プは、 その割 り 当て先の ロ ーカル変数ま たは
OUT パ ラ メ ー タ に指定 し たデー タ ・ タ イ プ と 一致 し なければな り ません。
こ れは特に UDT タ イ プに当ては ま り ます。 なぜな ら 、 シ ス テ ムは タ イ プに定義
さ れてい る ど のキ ャ ス ト も 暗黙的に適用 し ないか ら です。
こ の制限は、 以下のいずれか を行な う こ と に よ り 対処で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
75
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
•
カー ソ ル選択 リ ス ト のデー タ ・ タ イ プ を事前定義 タ イ プか ら UDT へ、 ま た
は UDT か ら 事前定義 タ イ プへ明示的に CAST す る (AS ASSIGNMENT オプ
シ ョ ン を指定す る タ ーゲ ッ ト ・ タ イ プへのキ ャ ス ト も 定義 し てい る 場合 )。
キ ャ ス ト の作成 と AS ASSIGNMENT オプシ ョ ンの使用について、 詳細は
<SQL デー タ 定義言語 > を参照 し て く だ さ い。
•
タ ーゲ ッ ト ・ タ イ プを戻す メ ソ ッ ド を呼び出す。
• INTO リ ス ト 内の表列に名前を付け る 単純 タ ーゲ ッ ト 指定を指す こ と はで き ま
せん。 無効な INTO リ ス ト を指定す る と 、 シ ス テ ムは コ ンパ イ ル時にエ ラ ー
SPL1028 を返 し ます。
代わ り に、 出力パ ラ メ ー タ (INOUT お よ び OUT) ま たは ロ ーカル変数を指定す る
必要があ り ます。
FIRST および NEXT の規則
• NEXT ま たは FIRST を指定 し ない場合、 あ る いは NEXT を指定 し て、 カー ソ ル
が応答セ ッ ト 内の最後の行ま たは行の後に置かれ る 場合、 あ る いはデー タ が存
在 し ない場合、 ス ト ア ド ・ プ ロ シージ ャ はカー ソ ルを最後の行の後に配置 し 、
シ ス テ ムは次の完了条件を返 し ます。
• SQLCODE は 7632 に設定 さ れ る
•
SQLSTATE は '02000' に設定 さ れ る
こ の場合、 こ の値の INTO リ ス ト 内で指定 し た出力パ ラ メ ー タ ま たは ロ ーカル変
数は変更 さ れません。
• FIRST を指定す る 場合は、 参照カー ソ ルの宣言に SCROLL を指定 し なければな
り ません。
SCROLL を指定 し ておかない と 、 シ ス テ ムは コ ンパ イ ル時にエ ラ ー SPL1132 を
返 し ます。
• FIRST を指定し ていてい も 、 データ が存在し ない と 、 シ ス テムは次の完了条件を
返 し ます。
• SQLCODE は 7632 に設定 さ れ る
•
SQLSTATE は '02000' に設定 さ れ る
こ の場合、 こ の値の INTO リ ス ト 内で指定 し た出力パ ラ メ ー タ ま たは ロ ーカル変
数は変更 さ れません。
例1
次の例では、 FETCH 文に よ っ て参照 さ れる カー ソ ルが、 一致し たデータ ・ タ イ プを
持つ ロ ーカル変数に正 し く 割 り 当て ら れてい る 列を戻す有効な カー ソ ル指定 と な っ
てい ます。
CREATE PROCEDURE sp1()
BEGIN
DECLARE var1 INTEGER;
DECLARE var2 CHARACTER(30)
DECLARE projcursor CURSOR FOR
SELECT projid, projectdesc
FROM project
76
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
ORDER BY projid;
OPEN projcursor;
WHILE (SQLCODE=0)
FETCH projcursor INTO var1, var2;
END WHILE;
CLOSE projcursor;
END;
例2
次の例では、 カー ソ ルがすでに応答セ ッ ト 内の最後の行の後ろに置かれてい る ため
に、 WHILE ループの後の FETCH 文で完了条件 SQLCODE 7632 お よ び SQLSTATE
'02000' が生 じ てお り 、 「no rows found 」 と い う メ ッ セージ を返 し てい ます。
CREATE PROCEDURE sp1 (OUT par1 CHARACTER(50))
BEGIN
DECLARE var1 INTEGER;
DECLARE projcursor CURSOR FOR
SELECT projid, projectdesc
FROM project;
OPEN projcursor;
WHILE (SQLCODE = 0)
FETCH projcursor INTO var1, par1;
END WHILE;
FETCH projcursor INTO var1, par1;
CLOSE projcursor;
END;
例3
次の例は、 FETCH 文の中の取 り 出 し 方向の使用法を説明 し てい ます。 project 表に
は sp1 の実行開始時に 10 行が含まれてい る と し ます。
最初の FETCH 文は最初の行を返 し 、 projcursor がオープン し てか ら 他に行が取 り 出
さ れなか っ た場合、 2 番目の FETCH が 2 番目の行を返 し ます。
CREATE PROCEDURE sp1 (OUT par1 INTEGER)
BEGIN
DECLARE var1 CHARACTER(5);
DECLARE var2 INTEGER;
DECLARE projcursor SCROLL CURSOR FOR
SELECT projectstatus
FROM project;
OPEN projcursor;
FETCH FIRST projcursor INTO var1;
...
FETCH NEXT projcursor INTO var1;
...
CLOSE projcursor;
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
77
第 3 章 : SQL カー ソ ル制御お よ び DML 文
FETCH ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
例4
次に、 FETCH FIRST の使用法の例を示 し ます。 project 表は sp1 の実行開始時に空
白であ る と し ます。
表に行が含まれていないため、 FETCH 文で コ ンパ イ ル ・ ス テータ ス SQLCODE 7632
お よ び SQLSTATE '02000' が発生 し 、 「no rows found 」 と い う メ ッ セージ を返 し
てい ます。
CREATE PROCEDURE sp1 (OUT par1 INTEGER)
BEGIN
DECLARE var1 CHARACTER(5);
DECLARE var2 INTEGER;
DECLARE projcursor SCROLL CURSOR FOR
SELECT projectstatus
FROM project;
OPEN projcursor;
FETCH FIRST projcursor INTO var1;
...
CLOSE projcursor;
END;
78
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
OPEN ( 埋め込み SQL 形式 )
OPEN ( 埋め込み SQL 形式 )
目的
埋め込み SQL アプ リ ケーシ ョ ンに対 し て宣言 さ れた カー ソ ルを開 き 、 その宣言で
指定 さ れてい る SQL 文を実行 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
OPEN
A
cursor_name
A
,
USING
host_variable_name
:
:host_indicator_name
INDICATOR
USING DESCRIPTOR
descriptor_area
:
GW01A027
説明
構文要素
指定内容
cursor_name
開 く カー ソ ルの名前を指定 し ます。
host_variable_name
カー ソ ル要求の入力デー タ と し て使用す る 変数。
名前の前に コ ロ ン文字を付け る か ど う かは任意指定です。
host_indicator_variable
標識変数の値。
名前の前の コ ロ ン文字は必須です。
descriptor_area
SQLDA。
SQLDA 構造がポ イ ン タ と し て宣言 さ れてい る 場合、
descriptor_area を名前ま たはポ イ ン タ 参照 (*sqldaname) と し て
C プ ロ グ ラ ムに指定で き ます。
詳細は <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ
ド > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
79
第 3 章 : SQL カー ソ ル制御お よ び DML 文
OPEN ( 埋め込み SQL 形式 )
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
一般規則
• SQLDA を定義す る 必要があ り ます。
• cursor_name で特定 さ れ る カー ソ ルは、 事前に宣言 し てお く 必要があ り ます。
• cursor_name で識別 さ れ る カー ソ ルが閉 じ ていなければな り ません。
• い っ たんカー ソ ルが開 く と 、 シ ス テ ムは関連す る 静的ま たは動的 SQL 文を実行
し ます。 その後で、 シ ス テ ムは結果の ス プール ・ フ ァ イ ルを作成 し 、 カー ソ ル
が ス プール ・ フ ァ イ ルの最初の行の前に置かれます。
• 失敗 ( 暗黙的な ロ ールバ ッ ク ) が生 じ ない限 り 、 OPEN 処理では SQLCA の
SQLCODE フ ィ ール ド に 0 を返 し 、 SQLSTATE に '00000' を返 し ます。
SQLCODE が 0 の場合、 シ ス テ ムは SQLCA 構造の 3 番目の SQLERRD 要素にア
ク テ ィ ビ テ ィ ・ カ ウ ン ト を設定 し ます。
• カー ソ ルが更新可能な場合、 あ る いは C ま たは COBOL ア プ リ ケーシ ョ ン ・
プ ロ グ ラ ム内にカー ソ ルの REWIND ま たは POSITION TO STATEMENT 要求が
含まれてい る 場合は、 OPEN 文に KEEPRESP を指定 し て実行 し ます。 それ以外
の場合は、 NOKEEPRESP を指定 し て実行 し ます。 PL/I アプ リ ケーシ ョ ンの場
合、 KEEPRESP がデフ ォ ル ト です。
• OPEN を動的 SQL 文 と し て実行す る こ と はで き ません。
• 一度に 16 を超え る カー ソ ルを開 く こ と はで き ません。 カー ソ ルが関係 し ない文
の処理は、 さ ら に多 く のカー ソ ルが開 く と それだけ悪い影響を受け る か ら です。
アプ リ ケーシ ョ ンが、 開いてい る 16 個のカー ソ ルを持っ てい る 場合、 1 つ以上
のカー ソ ルを閉 じ ない と 、 要求を それ以上発行す る こ と はで き ません。
USING 句の規則
• USING 句は cursor_name に よ っ て SQL 文への入力 と し て使用 さ れ る 変数を識別
し ます。
• OPEN 文の前に宣言 し た host_variable_name を有効な ク ラ イ ア ン ト 言語の変数に
し ない と 、 入力変数 と し て使用で き ません。
ク ラ イ ア ン ト 構造を入力変数の識別に使用で き ます。
指定す る 変数の数は、 識別 さ れ る 文におけ る パ ラ メ ー タ ・ マーカー ( 疑問符、 ?)
の数 と 同 じ でなければな り ません。
n 番目の変数は n 番目のマーカーに対応 し ます。
host_variable_name の接頭辞の コ ロ ン文字は、 任意指定です。
80
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
OPEN ( 埋め込み SQL 形式 )
• descriptor_area は、 アプ リ ケーシ ョ ンに よ っ て事前に定義 さ れた入力 SQLDA 構
造を識別 し ます。 こ の構造には、 入力変数セ ッ ト に関す る 必要な情報が入っ て
い ます。
SQLDA の SQLD フ ィ ール ド で指定 さ れ る 変数の数は、 識別 さ れ る 文のパ ラ メ ー
タ ・ マーカー ( 疑問符、 ?) と 同 じ でなければな り ません。
SQLDS に よ っ て記述 さ れ る n 番目の変数は n 番目 のマーカーに対応 し ます。
関連 ト ピ ッ ク
「CLOSE」 (41 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
81
第 3 章 : SQL カー ソ ル制御お よ び DML 文
OPEN ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
OPEN ( ス ト ア ド ・ プ ロ シ ージ ャ 形式 )
目的
ス ト ア ド ・ プ ロ シージ ャ 内で宣言 さ れた カー ソ ルを開 き 、 その宣言で指定 さ れた
SQL 文を実行 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
OPEN
;
cursor_name
,
USING
SQL_identifier
SQL_parameter
1101B073
説明
構文要素
指定内容
cursor_name
開 く カー ソ ルの名前を指定 し ます。
USING
OPEN 文の前で宣言 さ れ る こ と があ る cursor_name で指定 し た
SQL 文への入力 と し て使用す る 変数。
SQL_identifier
有効な SQL 識別子。
SQL_parameter
SQL パ ラ メ ー タ 。
ANSI への準拠
ANSI/ISO SQL:2011 準拠。
許可
な し。
82
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
OPEN ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
結果セ ッ ト の返送
OPEN 文は、 結果セ ッ ト ・ カー ソ ルを開 き 、 結果セ ッ ト を生成す る 静的ま たは動的
SELECT 文を実行 し ます。 その後で、 シ ス テ ムは結果の ス プール ・ フ ァ イ ルを作成
し 、 カー ソ ルが ス プール ・ フ ァ イ ルの最初の行の前に置かれます。
結果セ ッ ト の返送についての詳細は、 「ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト
の返送」 (138 ページ ) を参照 し て く だ さ い。
一般規則
• cursor_name で特定 さ れ る カー ソ ルは、 事前に宣言 し てお く 必要があ り ます。
• cursor_name で識別 さ れ る カー ソ ルが、 事前に開かれていてはいけ ません。
USING 句の規則
• 指定す る 変数の数は、 識別 さ れ る 文におけ る パ ラ メ ー タ ・ マーカー ( 疑問符、 ?)
の数 と 同 じ で な ければな り ま せん。 n 番目の変数は n 番目のマーカーに対応 し
ま す。
• OPEN を動的 SQL 文 と し て実行す る こ と はで き ません。
• OPEN カー ソ ル内の USING 句は、 カー ソ ルが動的 SQL の場合にのみ使用で き
ま す。
• 一度に 15 を超え る カー ソ ル を開 く こ と はで き ま せん。 ア プ リ ケーシ ョ ン が、
開いてい る 15 個のカー ソ ルを持っ てい る 場合、 1 つ以上のカー ソ ルを閉 じ ない
と 、 要求を それ以上発行す る こ と はで き ません。
例1
次の例は、 OPEN 文が同 じ 有効範囲内の有効な カー ソ ル宣言文に続いてい る ので、
有効です。
CREATE PROCEDURE sp1()
BEGIN
DECLARE empcursor CURSOR FOR
SELECT *
FROM employee
ORDER BY empid;
OPEN empcursor;
...
END;
例2
こ の例では、 OPEN カ ー ソ ル文は、 USING 句が使用で き る よ う に拡張 さ れ て い
ま す。
CREATE PROCEDURE abc (IN data1v VARCHAR(10), IN data2v VARCHAR(10) )
DYNAMIC RESULT SETS 1
BEGIN
DECLARE sql_stmt1 VARCHAR(100);
DECLARE sales DECIMAL(8,2);
DECLARE item INTEGER;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
83
第 3 章 : SQL カー ソ ル制御お よ び DML 文
OPEN ( ス ト ア ド ・ プ ロ シージ ャ 形式 )
DECLARE cstmt CURSOR WITH RETURN ONLY FOR stmt1;
SET sql_stmt1 = 'SELECT T1.item, T1.sales FROM T1 WHERE ?'
'= store_name AND ?= region;';
PREPARE stmt1 FROM sql_stmt1;
OPEN cstmt USING data1v, data2v;
END;
関連 ト ピ ッ ク
「CLOSE」 (41 ページ ) を参照 し て く だ さ い。
84
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
POSITION
POSITION
目的
カー ソ ルを次の文の最初、 ま たは指定 さ れた文の結果に置 き ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
POSITION
cursor_name
TO NEXT
TO
statement_number
STATEMENT
numeric_variable
:
1101A312
説明
構文要素
指定内容
cursor_name
挿入カー ソ ル以外の、 開いてい る カー ソ ルの名前。
statement_number
配置先 と し て希望す る 文の番号を表わす整数。
numeric_variable
配置先 と し て希望す る 文番号を表わす、 タ イ プ INTEGER に適合す る
ホ ス ト 変数。 コ ロ ン文字の使用は任意指定です。
ANSI への準拠
POSITION は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
規則
•
カー ソ ルは、 指定 さ れた文の最初の結果行 ( も し あれば ) の前に再配置 さ れ、
SQLSTATE、 SQLCODE、 お よ び他の SQLCA 値が設定 さ れます。
• POSITION TO NEXT を指定 し た場合、 カー ソ ルは次の文に置かれます。
POSITION TO STATEMENT を 指定 し た場合、 カ ー ソ ルは指定 し た文に置かれ
ま す。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
85
第 3 章 : SQL カー ソ ル制御お よ び DML 文
POSITION
• 指定 し た文番号が存在 し ない場合 ( た と えば、 TO STATEMENT 3 と コ ーデ ィ ン
グ し たのに、 カー ソ ルが制御す る 文が 2 つだけの場合 )、 以下の実行時間例外が
発生 し 、 カー ソ ルの位置は未定義の ま ま と な り ます。
• SQLCODE は -501 に設定 さ れ る
•
SQLSTATE は '24501' に設定 さ れ る
•
カー ソ ルはカー ソ ル文の前方向に も 後方向に も 置 く こ と がで き 、 アプ リ ケー
シ ョ ンが要求す る 限 り 何回で も 特定の文に再配置で き ます。
複数の コ ンパ イ ル ・ ユニ ッ ト を持つ COBOL プ ロ グ ラ ムでは、 カー ソ ルの宣言
お よ びカー ソ ルを開 く の と 同 じ コ ンパ イ ル ・ ユニ ッ ト に REWIND ま たは
POSITION TO STATEMENT が現れ る 場合、 カー ソ ルは後方向に置 く こ と し かで
き ません。
• POSITION は挿入カー ソ ルを除 く あ ら ゆ る カー ソ ルで有効です。 詳細は、
「 DECLARE CURSOR 」 (44 ページ ) 、 「 DECLARE CURSOR ( マ ク ロ 形式 ) 」
(48 ページ ) 、 「DECLARE CURSOR ( 要求形式 )」 (50 ページ )、 お よ び
「DECLARE CURSOR ( 選択形式 )」 (53 ページ ) を参照 し て く だ さ い。
• カー ソ ルに よ っ て検出 さ れた文は再実行 さ れず、 ス プール ・ フ ァ イ ル内での
カー ソ ル位置が調整 さ れます。
• POSITION を動的 SQL 文 と し て実行す る こ と はで き ません。
関連 ト ピ ッ ク
「REWIND」 (89 ページ ) を参照 し て く だ さ い。
86
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
PREPARE
PREPARE
目的
動的 DECLARE CURSOR 文の準備を し て、 異な る 結果セ ッ ト を作成で き る よ う に
し ます。 動的パ ラ メ ー タ ・ マーカーを許可 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
PREPARE
statement_name
FROM
'statement_string'
;
statement_string_variable
1101A450
説明
構文要素
指定内容
statement_name
DECLARE CURSOR 文の statement_name と 同 じ 識別子を指定 し
ます。
statement_string
動的に実行 さ れ る SQL テ キ ス ト を指定 し ます。
statement_string は、 単一引用符で囲む必要があ り ます。
statement_string_variable
SQL ロ ーカル変数の名前、 ま たは動的に実行 さ れ る SQL テ キ
ス ト 文字列を含む SQL パ ラ メ ー タ や文字列変数を指定 し ます。
こ の構成要素は、 32000 文字未満の CHAR/VARCHAR 変数に し
なければな り ません。
ANSI への準拠
PREPARE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
87
第 3 章 : SQL カー ソ ル制御お よ び DML 文
PREPARE
規則
• 構文解析プ ロ グ ラ ムは、 PREPARE 文の構文を検査 し ます。 構文エ ラ ーがあ る と 、
シ ス テ ムは構文例外を返 し ます。
• PREPARE を動的 SQL 文 と し て実行す る こ と はで き ません。
•
こ の文は、 動的カー ソ ル SELECT 文にす る 必要が あ り ま す。 そ う し ていない
場合、シ ス テ ムは '07005' dynamic SQL error, prepared statement not a
cursor specification を返 し ます。
• 動的 SQL 文のテ キ ス ト は最大で 64 キ ロ バ イ ト ま での長 さ にす る こ と がで き ま
す (SQL テ キ ス ト 、 USING デー タ 、 お よ びパーセルのオーバーヘ ッ ド を含む )。
• 複文要求を指定す る こ と はで き ません。
• 動的 SQL 文には、 パ ラ メ ー タ ・ マーカー ま たはプ レ ー ス ホ ルダー ・ ト ー ク ン
( 疑問符 ) を使用す る こ と がで き 、 こ こ では選択 リ ス ト 以外の任意の定数 ( 特に
SQL 変数 ) 参照が有効です。
• OPEN 文の USING 句は、 その文に変数を提供 し ます。
例1
CREATE PROCEDURE abc (IN data1v VARCHAR(10), IN data2v VARCHAR(10) )
DYNAMIC RESULT SETS 1
BEGIN
DECLARE sql_stmt1 VARCHAR(100);
DECLARE sales DECIMAL(8,2);
DECLARE item INTEGER;
DECLARE cstmt CURSOR WITH RETURN ONLY FOR stmt1;
SET sql_stmt1 = 'SELECT T1.item, T1.sales FROM T1 WHERE' data1v
| '= store_name AND '
| data2v | '= region;';
PREPARE stmt1 FROM sql_stmt1;
OPEN cstmt;
END;
例2
こ の例では、 パ ラ メ ー タ ・ マーカーを使用す る PREPARE 文が記述 さ れてい ます。
SET sql_stmt1 = 'SELECT T1.item, T1.sales FROM T1 WHERE ?'
'= store_name AND ?= region;';
PREPARE stmt1 FROM sql_stmt1;
OPEN cstmt USING data1v, data2v;
関連 ト ピ ッ ク
埋め込み SQL での PREPARE 文の使用方法については、 「PREPARE」 (362 ページ ) を
参照 し て く だ さ い。
88
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
REWIND
REWIND
目的
最初の文ま たは唯一の文の結果の冒頭に、 カー ソ ルを配置ま たは再配置 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
REWIND
cursor_name
GW01A030
説明
構文要素
指定内容
cursor_name
挿入カー ソ ル以外の、 開いてい る カー ソ ルの名前。
ANSI への準拠
REWIND は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
使用上の注意
文 REWIND cursor_name は、 文 POSITION cursor_name TO STATEMENT 1 と 同等
です。
関連 ト ピ ッ ク
「POSITION」 (85 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
89
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT AND CONSUME … INTO
SELECT AND CONSUME … INTO
目的
指定 さ れた キ ュ ー表内の最 も 古い挿入 タ イ ム ス タ ンプを持つ行のデー タ を選択 し 、
その行を キ ュ ー表か ら 削除 し て、 その行の値を埋め込み SQL アプ リ ケーシ ョ ンの
ホ ス ト 変数 と し て、 ま たは ス ト ア ド ・ プ ロ シージ ャ の ロ ーカル変数やパ ラ メ ー タ と
し て割 り 当て ます。
呼出 し
実行可能プ ロ グ ラ ム。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL。
構文 1: ス ト ア ド ・ プ ロ シージ ャのみ
SELECT
AND CONSUME TOP 1
select_list
A
INTO
SEL
,
A
local_variable_name
FROM
queue_table_name
:
parameter_name
:
1101A310
構文 2: 埋め込み SQL のみ
SELECT
AND CONSUME TOP 1
select_list
A
INTO
SEL
,
A
B
host_variable_name
:
:host_indicator_name
INDICATOR
B
FROM
queue_table_name
1101A304
90
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT AND CONSUME … INTO
説明
構文要素
指定内容
select_list
ASTERISK 文字 (*)、 ま たは コ ン マで区切っ た複数の有効な SQL 式
からなる リ ス ト 。
select_list に * を指定 し た場合、 FROM 句で指定 さ れた キ ュ ー表の
すべての列が戻 さ れ る 。
選択 リ ス ト には、 集約関数や順序付 き 分析関数を含め る こ と はで
き ません。
local_variable_name
選択 し たデー タ を配置す る ス ト ア ド ・ プ ロ シージ ャ で宣言 さ れ る
ホ ス ト 変数の名前。
こ こ では、 ス ト ア ド ・ プ ロ シージ ャ の ス テー タ ス変数を使用す る
こ と はで き ません。
queue_table_name
CREATE TABLE 文の QUEUE オプシ ョ ン に よ っ て作成 さ れた
キ ュ ー表の名前。 <SQL デー タ 定義言語 > の 「CREATE TABLE
( キ ュ ー表形式 )」 を参照 し て く だ さ い。
parameter_name
選択 し たデー タ を配置す る ス ト ア ド ・ プ ロ シージ ャ のパ ラ メ ー タ
の名前。
指定で き る のは、 出力パ ラ メ ー タ (INOUT お よ び OUT タ イ プ ) だ
けです。
host_variable_name
選択 し たデー タ を配置す る ホ ス ト 変数の名前。
host_indicator_name
ホ ス ト 標識変数の名前。
ANSI への準拠
SELECT AND CONSUME…INTO は、 ANSI/ISO SQL:2011 規格に対す る Teradata の
拡張機能です。
許可
キ ュ ー表か ら SELECT AND CONSUME…INTO を実行す る には、 その表に対す る
SELECT 権限お よ び DELETE 権限が必要です。
キ ュ ー表の属性
キ ュ ー表は通常の実表 と 似てい ますが、 それに加え て、 非同期の先入れ先出 し
(FIFO) キ ュ ーの よ う な特殊な動作をす る と い う 特徴があ り ます。
キ ュ ー表の最初の列には、 キ ュ ー挿入 タ イ ム ス タ ンプ (QITS) 値が含まれます。
CREATE TABLE 文では、 以下のデー タ ・ タ イ プ と 属性を使っ て最初の列を定義す
る 必要があ り ます。
TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
91
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT AND CONSUME … INTO
行の QITS 値は、 その行がキ ュ ー表に挿入 さ れた時間を示 し ます ( ユーザー提供に
よ っ て別の値が挿入 さ れない限 り )。
使用上の注意、 ト ラ ンザ ク シ ョ ン処理、 ロ ッ ク 、 および制限については、 <SQL デー
タ操作言語 > の 「SELECT AND CONSUME」 を参照 し て く だ さ い。
埋め込み SQL でのコ ロ ン文字の使用
埋め込み SQL では、 コ ロ ン文字の前後にブ ラ ン ク を入れ る か ど う かは任意です。
host_variable_name の前には、 任意で コ ロ ン文字を使用で き ます。 コ ロ ン文字は、
host_indicator_name の前で使用 し なければな り ません。
埋め込み SQL の規則
SELECT AND CONSUME…INTO には、 SELECT…INTO と 同 じ 規則が適用 さ れます。
「埋め込み SQL の規則」 (98 ページ ) を参照 し て く だ さ い。
92
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
SELECT … INTO
目的
表か ら 最大 1 行を選択 し 、 その行の値を埋め込み SQL アプ リ ケーシ ョ ンのホ ス ト
変数に対 し てか、 ま たは ロ ーカル変数ま たは ス ト ア ド ・ プ ロ シージ ャ のパ ラ メ ー タ
に対 し て割 り 当て ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL。
構文 1: ス ト ア ド ・ プ ロ シージ ャのみ
SELECT
with_[recursive]_modifier
select_list
INTO
A
ALL
SEL
DISTINCT
,
A
local_variable_name
from_clause
parameter_name
where_clause
1101B296
構文 2: 埋め込み SQL のみ
SELECT
with_[recursive]_modifier
select_list
INTO
A
SEL
,
A
B
host_variable_name
:
:host_indicator_name
INDICATOR
B
from_clause
where_clause
1101B305
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
93
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
説明
構文要素
指定内容
with_[recursive]_
再帰的問い合わせ。 WITH RECURSIVE が使用 さ れて い る 場合、
対話式の自己結合お よ び設定操作を使っ た表検索の手法を提供 し
ま す。
modifier
非再帰的な WITH 要求修飾子は、 派生表 と 同 じ です。
詳細は、 <SQL デー タ 操作言語 > の 「WITH [RECURSIVE] 要求修飾
子」 を参照 し て く だ さ い。
select_list
ア ス タ リ ス ク (*)、 ま たは コ ン マで区切っ た複数の有効な SQL 式か
らなる リ ス ト 。
選択 リ ス ト には、 DEFAULT 関数の イ ン ス タ ン ス を含め る こ と がで
き ますが、 集約関数や順序付き分析関数を含め る こ と はで き ません。
「SELECT 文での DEFAULT 関数の使用ルール」 (99 ページ ) を参照
し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ のみ :
Teradata Database では、 DateTime デー タ ・ タ イ プについて暗黙の変
換を行ない ます。 その他すべてのデー タ ・ タ イ プについては、 選択
リ ス ト のデー タ ・ タ イ プは、 INTO 句の タ ーゲ ッ ト ・ リ ス ト のデー
タ ・ タ イ プ と 一致 し ていなければな り ません。
選択 リ ス ト のデー タ ・ タ イ プが INTO 句の タ ーゲ ッ ト ・ リ ス ト の
デー タ ・ タ イ プ と 一致 し な い 場合、 明示的 CAST を タ ーゲ ッ ト ・
タ イ プに指定する こ と に よ り 、 操作を正常に行な う こ と がで き ます。
暗黙のデー タ ・ タ イ プ変換 と CAST 関数については、 <SQL 関数、
演算子、 式お よ び述語 > の 「デー タ ・ タ イ プの変換」 を参照 し て く
だ さ い。
選択 リ ス ト お よ び INTO リ ス ト で指定 さ れた列は UDT デー タ ・ タ イ
プにす る こ と がで き ます。 ただ し 、 VARIANT_TYPE UDT デー タ ・
タ イ プは除 き ます。 シ ス テ ムは、 UDT に対 し て定義 さ れてい る 暗
黙的な変換が存在す る 場合、 それを自動的に適用 し ます。
タ ーゲ ッ ト ・ タ イ プへの CAST が存在 し 、 それが AS
ASSIGNMENT オプシ ョ ン を指定 し て作成 さ れた場合にのみ、 シ ス
テ ムは選択 リ ス ト のデー タ ・ タ イ プの暗黙的キ ャ ス テ ィ ン グ を
UDT か ら 事前定義デー タ ・ タ イ プへ、 ま たは事前定義 タ イ プか ら
UDT へ適用 し ます。
キ ャ ス ト の作成 と AS ASSIGNMENT オプシ ョ ン の使用についての
詳細は、 <SQL デー タ 定義言語 > の 「CREATE CAST」 を参照 し て
く だ さ い。
host_variable_name
選択 し たデー タ を配置す る ホ ス ト 変数の名前。
host_indicator_name
ホ ス ト 標識変数の名前。
from_clause
SELECT が参照す る 表ま たはビ ュ ーを リ ス ト す る 句。
<SQL デー タ 操作言語 > の 「FROM 句」 を参照 し て く だ さ い。
94
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
構文要素
指定内容
where_clause
条件式に よ っ て 指定 さ れ る 条件 を 満 たす行に SELECT を 制限す
る 句。
WHERE 句には、 その述部の構成要素 と し て DEFAULT 関数を含め
る こ と がで き ます。 「SELECT 文での DEFAULT 関数の使用ルール」
(99 ページ ) お よ び <SQL デー タ 操作言語 > の 「WHERE 句」 の説
明を参照 し て く だ さ い。
local_variable_name
選択 し たデー タ を配置す る ス ト ア ド ・ プ ロ シージ ャ で宣言 さ れ る ホ
ス ト 変数の名前。
こ こ では、 ス ト ア ド ・ プ ロ シージ ャ の ス テー タ ス変数を使用す る こ
と はで き ません。
ス ト ア ド ・ プ ロ シージ ャ のみ。 ロ ーカル変数には UDT タ イ プ を持
たせ る こ と がで き ますが、 VARIANT_TYPE UDT デー タ ・ タ イ プは
除 き ます。
ロ ーカル変数 と し て使用 さ れ る UDT に対す る UDTUSAGE 権限が
必要です。
parameter_name
選択 し たデー タ を配置す る ス ト ア ド ・ プ ロ シージ ャ のパ ラ メ ー タ の
名前。
指定で き る のは、 出力パ ラ メ ー タ (INOUT お よ び OUT タ イ プ ) だ
けです。
ス ト ア ド ・ プ ロ シージ ャ のみ。 パ ラ メ ー タ には UDT タ イ プ を持た
せ る こ と がで き ますが、 VARIANT_TYPE UDT デー タ ・ タ イ プは除
き ます。
パ ラ メ ー タ と し て使用 さ れ る UDT に対す る UDTUSAGE 権限が必
要です。
ANSI への準拠
SELECT…INTO は ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
表か ら デー タ を選択す る には、 その表に対す る SELECT 権限を持っ ていなければな
り ません。
ビ ュ ーを通 じ てデー タ を選択す る には、 その ビ ュ ーに対す る SELECT 権限を持っ て
いなければな り ません。 さ ら に、 その ビ ュ ーの直接所有者 ( すなわち、 その ビ ュ ー
が存在す る デー タ ベース の所有者 ) は、 その ビ ュ ー内で参照 さ れ る すべての表ま た
はビ ュ ーに対 し て、 SELECT WITH GRANT OPTION 権限を持っ ていなければな り ま
せん。
ス ト ア ド ・ プ ロ シージ ャ の場合、 選択 リ ス ト お よ び INTO リ ス ト の ロ ーカル変数お
よ びパ ラ メ ー タ は UDT にす る こ と がで き ます。 ただ し 、 VARIANT_TYPE UDT は
除 き ます。
UDT デー タ ・ タ イ プ を持つ ロ ーカル変数ま たはパ ラ メ ー タ に対す る UDTUSAGE
権限が必要です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
95
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
再帰的問い合わせの例
次の例は、 ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン内部で使用 さ れ る 再帰的問い合わせを
示 し てい ます。
EXEC SQL
WITH RECURSIVE Reachable_From (Source, Destin, mycount)AS
(
SELECT Root.Source, Root.Destin, 0 as mycount
FROM Flights Root
WHERE Root.Source = ‘Paris’
UNION ALL
SELECT in1.Source, out1.Destin, in1.mycount + 1
FROM Reachable_From in1, Flights out1
WHERE in1.Destin = out1.Source
AND in1.mycount <= 100
)
SELECT Source, Destin
INTO :intosource INDICATOR :indvar1
:intodestin INDICATOR:indvar2
FROM Reachable_From;
END-EXEC
こ の例では、 再帰的問い合わせの最後の SELECT で、 ホ ス ト 変数 (intosource と
intodestin) お よ び標識変数 (indvar1 と indvar2) が使用 さ れてい ます。 こ れ ら の変数
は再帰的問い合わせ定義の中では使用で き ません。
コ ロ ン文字の使用の規則
埋め込み SQL での コ ロ ン文字の使用に関す る 規則は次の と お り です。
•
コ ロ ン文字の前後の埋め込み文字は任意選択です。
• host_variable_name の先頭に追加 さ れ る コ ロ ン文字は任意選択です。
• host_indicator_name の先頭に追加 さ れ る コ ロ ン文字は必須です。
ス ト ア ド ・ プ ロ シージ ャ での コ ロ ン文字の使用に関す る 規則は次の と お り です。
• local_variable_name の先頭に追加 さ れ る コ ロ ン文字は任意選択です。
• param_name の先頭に追加 さ れ る コ ロ ン文字は任意選択です。
ス ト ア ド ・ プ ロ シージ ャ の規則
•
ス ト ア ド ・ プ ロ シージ ャ の SELECT…INTO では、 さ ま ざ ま な句を指定す る 順番
に重要な意味があ り ます。 次の順番で指定す る 必要があ り ます。
• WITH [RECURSIVE] 要求修飾子
•
SELECT 句
•
INTO リ ス ト
FROM 句
•
他の要素が INTO リ ス ト と FROM 句の間に入 る と 、 結果はエ ラ ーにな り ます。
他のすべての句は、 任意の順番で文の中で指定で き ます。
• SELECT では、 列の リ ス ト を明示的に指定す る 必要があ り ます。 ス ト ア ド ・ プ
ロ シージ ャ では、 SELECT * 構文は使用で き ません。
96
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
• SELECT 権限は、 FROM 句や問い合わせの指定に含まれ る 副問い合わせで指定
さ れたすべての表に対 し て必要です。 ま た、 その表を収容す る デー タ ベース に
対 し て も 必要です。 必要な許可について、 詳細は <SQL デー タ 操作言語 > の
「CALL 文」 を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ の場合、 選択 リ ス ト お よ び INTO リ ス ト の列のデー タ ・
タ イ プ と し て使用 さ れ る UDT に対す る UDTUSAGE 権限 も 必要です。
• UNION 句、 INTERSECT 句、 お よ び MINUS 句は、 SELECT…INTO 文ではサ
ポー ト さ れません。
• 選択 リ ス ト で指定す る 列の数は、 ロ ーカル変数やパ ラ メ ー タ の仕様の数 と 一致
す る 必要があ り ます。
• ロ ーカル変数ま たはパ ラ メ ー タ 、 お よ び戻 さ れ る デー タ の対応す る 列のデー タ ・
タ イ プは互換性のあ る デー タ ・ タ イ プでなければな り ません。 Teradata Database
は、 ロ ーカル変数ま たはパ ラ メ ー タ と 対応す る 列のデー タ ・ タ イ プが異な る 場
合には、 DateTime デー タ ・ タ イ プについては暗黙的な変換を実行 し ます。 詳細
は、 <SQL 関数、 演算子、 式お よ び述語 > の 「デー タ ・ タ イ プの変換」 を参照 し
て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ の場合、 ロ ーカル変数ま たはパ ラ メ ー タ と し て使用 さ
れ る UDT に対す る UDTUSAGE 権限が必要です。
• 文でエ ラ ーま たは失敗が生 じ る と 、 通常の例外条件の処理が行なわれます。
• SELECT…INTO 文か ら 返 さ れて く る 予定の行は、 通常は多 く て も 1 つです。
文の実行後に、 以下のいずれかの処理が行なわれます。
SELECT…INTO
が戻す行数
複数の行
ス ト ア ド ・ プ ロ シージ ャ の
ス テー タ ス変数に表示 さ れ
る値
SQLCODE = 7627
SQLSTATE = ‘21000’
ACTIVITY_COUNT =
見つか っ た行数。
意味
例外条件 (Teradata セ ッ シ ョ ン ・
モー ド では失敗、 ANSI セ ッ シ ョ ン ・
モー ド ではエ ラ ー )。
特定の条件ハン ド ラ ーま たは一般的
なハン ド ラ ーは、 こ の条件を処理す
る ために指定す る こ と がで き ます。
ロ ーカル変数やパ ラ メ ー タ の値は変
更 さ れ ません。
SQLCODE = 7632
SQLSTATE = ‘02000’
ACTIVITY_COUNT = 0
正常な完了以外の完了条件。
なし
行な し 、 実行警告
SQLCODE = 警告 コ ー ド 。
正常な完了以外の完了条件。
SQLSTATE = 警告に対応す
る SQLSTATE 値。
こ の完了条件を処理す る ために、
特定の条件ハン ド ラ ーを指定す る こ
と がで き ます。 ロ ーカル変数やパ ラ
メ ー タ の値は変更 さ れ ません。
行な し 、 実行警告
あり
ACTIVITY_COUNT = 0
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
こ の完了条件を処理す る ために、 特
定の条件ハン ド ラ ーを指定す る こ と
がで き ます。 ロ ーカル変数やパ ラ
メ ー タ の値は変更 さ れ ません。
97
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
SELECT…INTO
が戻す行数
正確に 1 行、
実行警告 な し
正確に 1 行、
実行警告 あ り
ス ト ア ド ・ プ ロ シージ ャ の
ス テー タ ス変数に表示 さ れ
る値
意味
SQLCODE = 0
SQLSTATE = ‘00000’
ACTIVITY_COUNT = 1
取 り 出 さ れた値は、 ロ ーカル変数 と
パ ラ メ ー タ に割 り 当て ら れます。
SQLCODE = 警告 コ ー ド 。
取 り 出 さ れた値は、 ロ ーカル変数 と
パ ラ メ ー タ に割 り 当て ら れます。
SQLSTATE = 警告に対応す
る SQLSTATE 値。
ACTIVITY_COUNT = 1
こ れは正常な完了です。 こ れを処理
す る ために、 特定のハン ド ラ ーを指
定す る こ と はで き ません。
こ れは、 正常な完了以外の完了条件
です。 こ れを処理す る ために、 特定
のハン ド ラ ーを指定す る こ と はで き
ません。
埋め込み SQL の規則
• UDT は明示的にはサポー ト さ れてい ません。
ただ し 、 tosql 変換お よ び fromsql 変換が定義 さ れてい る UDT へは、 その変換
タ ーゲ ッ ト のデー タ ・ タ イ プでの外部参照が可能であ る こ と に注意 し て く だ さ
い。 結果 と し て、 必要に応 じ て UDT で tosql 変換ま たは fromsql 変換が定義 さ れ
ていれば、 埋め込み SQL アプ リ ケーシ ョ ンは UDT を参照す る SQL 文を使用で
き ます。
さ ら に、 アプ リ ケーシ ョ ンは UDT デー タ を その外部 (UDT ではない ) デー タ ・
タ イ プの形式で送受信 し なければな り ません。
• SELECT 権限は、 FROM 句や問い合わせの指定に含まれ る 副問い合わせで指定
さ れたすべての表に対 し て必要です。 ま た、 その表を収容す る デー タ ベース の
セ ッ ト に対 し て も 必要です。
• select_list を使っ て指定 し た列の数は、 ホ ス ト 変数で指定 し た列の数 と 同 じ でな
ければな り ません。
• こ の値は、 ホ ス ト 変数が指定 さ れた順序で、 INTO 句で指定 さ れた ホ ス ト 変数に
割 り 当て ら れます。 最後に SQLCODE に値が割 り 当て ら れます。
• 主要な ホ ス ト 変数 と 、 返 さ れたデー タ で対応す る 列は、 同 じ デー タ ・ タ イ プ ・
グループでなければな り ません。 ただ し 、 主要な ホ ス ト 変数のデー タ ・ タ イ プ
が近似値であ る 場合は除 き ます。 こ の場合、 一時表の列のデー タ ・ タ イ プは近
似値か正確な数値のいずれかにす る こ と がで き ます。
• 一時表にゼ ロ 行が入っ てい る 場合 ( つま り 空白の場合 )、 +100 と い う 値が
SQLCODE に割 り 当て ら れ、 INTO 句で指定 さ れた ホ ス ト 変数には値が割 り 当て
ら れません。
• デー タ の行が正確に 1 行戻 さ れ る 場合、 その行か ら の値は INTO 句で指定 さ れ る
対応す る ホ ス ト 変数に割 り 当て ら れます。
• デー タ の行が正確に 1 行戻 さ れ る 場合、 -810 と い う 値が SQLCODE に割 り 当て
ら れ、 INTO 句で指定 さ れた ホ ス ト 変数には値が割 り 当て ら れません。
98
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
•
ホ ス ト 変数に値 を 割 り 当て る と き にエ ラ ーが発生 し た場合、 SQLCODE に値
-303、 -304、 ま たは -413 の う ちの 1 つが割 り 当て ら れ、 ホ ス ト 変数への値の割
り 当てはそれ以上行なわれません。
• 返 さ れ る デー タ の列の値が NULL で、 対応す る 標識ホ ス ト 変数が指定 さ れた場
合、 -1 と い う 値がその標識変数に割 り 当て ら れます。 主要な ホ ス ト 変数に値が
割 り 当て ら れ る こ と はあ り ません。 対応す る 標識ホ ス ト 変数が指定 さ れない場
合、 -305 と い う 値が SQLCODE に割 り 当て ら れます。 ホ ス ト 変数に こ れ以上値
が割 り 当て ら れ る こ と はあ り ません。
• 返 さ れ る デー タ の列の値が NOT NULL で、 対応す る 標識ホ ス ト 変数が指定 さ れ
た場合、 標識ホ ス ト 変数は以下の よ う に設定 さ れます。
• 列 と 主要な ホ ス ト 変数が文字デー タ ・ タ イ プで、 列の値が主要な ホ ス ト 変数
よ り も 長い場合、 標識ホ ス ト 変数は列の値の長 さ に設定 さ れます。
• こ れ以外の場合はすべて、 標識変数はゼ ロ に設定 さ れます。
• SQLCODE に他の値が割 り 当て ら れない場合、 SQLCODE にはゼ ロ 値が割 り 当て
ら れます。
• 列値は、 ホ ス ト 変数の場合の規則に従っ て、 対応す る 主な ホ ス ト 変数に設定 さ
れます。
• SELECT...INTO を動的 SQL 文 と し て実行す る こ と はで き ません。
• SELECT…INTO では、 キ ュ ー表に対す る ブ ラ ウ ズ ・ モー ド の SELECT 操作を サ
ポー ト し ます。 <SQL データ定義言語 > の 「CREATE TABLE ( キ ュー表形式 )」 を
参照 し て く だ さ い。
SELECT 文での DEFAULT 関数の使用ルール
ルールは以下の と お り です。
• DEFAULT 関数は、 リ レ ーシ ョ ン列を名前で識別す る 単一の引数を取 り ま す。
こ の関数は、 列の現行デフ ォ ル ト 値に等 し い値 と 評価 さ れます。 列のデフ ォ ル
ト 値が現行の ビル ト イ ン ・ シ ス テ ム関数 と し て指定 さ れ る 場合、 DEFAULT 関数
は、 要求の実行時にシ ス テ ム変数の現行値 と 評価 さ れます。
こ の結果 と し て、 DEFAULT 関数のデー タ ・ タ イ プは、 デフ ォ ル ト が ヌ ルでない
場合、 デフ ォ ル ト と し て指定 さ れ る 定数ま たはビル ト イ ン関数のデー タ ・ タ イ
プにな り ます。 デフ ォ ル ト が ヌ ルの場合、 結果のデー タ ・ タ イ プは、 デフ ォ ル
ト の要求対象であ る 列ま たは式のデー タ ・ タ イ プにな り ます。
• DEFAULT 関数には 2 つの形式があ り ます。 DEFAULT 関数は DEFAULT ま たは
DEFAULT (column_name) と し て指定す る こ と がで き ます。 列名が指定 さ れてい
ない場合、 シ ス テ ムは、 コ ン テ キ ス ト に基づいて列を派生 さ せます。 列の コ ン
テ キ ス ト を派生 さ せ る こ と がで き ない場合、 要求はアボー ト し 、 エ ラ ーが要求
側に戻 さ れます。
• SELECT 文の選択 リ ス ト に、 列名を指定 し た DEFAULT 関数を指定す る こ と がで
き ます。 DEFAULT 関数は、 指定 さ れた列のデフ ォ ル ト 値 と 評価 さ れます。
• 式 リ ス ト に、 列名 を 含め な い DEFAULT 関数 を 指定す る こ と はで き ま せん。
シ ス テ ムは要求を アボー ト し 、 エ ラ ーを要求側に戻 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
99
第 3 章 : SQL カー ソ ル制御お よ び DML 文
SELECT … INTO
• FROM 句を指定 し ない SELECT 文を指定す る 場合、 シ ス テ ムは、 表に含まれ る
行の数にかかわ ら ず、 列のデフ ォ ル ト 値か ら 成 る 単一行を常に戻 し ます。
こ れは、 既存の TYPE 関数に似てい ます。
• 入力引数 と し て DEFAULT 関数に渡 さ れた列に、 関連付け ら れた明示的なデ
フ ォ ル ト 値がない場合、 DEFAULT 関数は ヌ ル と 評価 さ れます。
詳細情報
DEFAULT 関数について、 詳細は <SQL 関数、 演算子、 式お よ び述語 > を参照 し て
く だ さ い。
100
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
UPDATE ( 定位置形式 )
UPDATE ( 定位置形式 )
目的
も っ と も 最近に取 り 出 さ れた カー ソ ル行を更新 し ます。
呼出 し
実行可能プ ロ グ ラ ム。
ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL。
構文
,
UPDATE
A
SET
table_name
UPD
A
column_name = expression
alias_name
WHERE CURRENT OF
cursor_name
;
GW01A047
説明
構文要素
指定内容
table_name
更新 さ れ る 表の名前。
correlation_name
表名の別名。
相関名は範囲変数 と も いい ます。
column_name =
expression
列名、 お よ び更新後の値。
cursor_name
更新す る 行を指示す る 、 更新可能な カー ソ ルの名前。
ホ ス ト 変数を SET 句で使用す る と き は、 その直前に コ ロ ン文
字が常に必要です。
ANSI への準拠
定位置形式の UPDATE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
更新す る 表ま たは列に対す る UPDATE 権限が必要です。
UPDATE を実行す る 場合に、 オブジ ェ ク ト への READ ア ク セ ス も 必要で あれば、
ア ク セ スす る オブジ ェ ク ト に対す る SELECT 権限を持っ ていなければな り ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
101
第 3 章 : SQL カー ソ ル制御お よ び DML 文
UPDATE ( 定位置形式 )
た と えば、 以下の文では、 WHERE 条件のために READ ア ク セ ス が必要です。
UPDATE table_1
SET field_1=1
WHERE field_1<0;
同様に、 以下の文では、 field_1 の新 し い値を計算す る ために field_1 の値を table_1
か ら 読み取 る 必要があ る ため、 READ ア ク セ ス が必要です。
UPDATE table_1
SET field_1 = field_1 + 1;
UPDATE 操作は、 更新 さ れてい る 表ま たは行に対す る WRITE ロ ッ ク を設定 し ます。
UPDATE 文に対す る 成功応答内のア ク テ ィ ビ テ ィ ・ カ ウ ン ト には、 更新 さ れた行の
総数が反映 さ れます。 更新 さ れ る 行がなければ、 ア ク テ ィ ビ テ ィ ・ カ ウ ン ト はゼ ロ
です。
相関 SUBQUERY を使っ た UPDATE
UPDATE 文での相関 subquery の使用につい て は、 <SQL デー タ 操作言語 > の
「相関副問い合わせお よ び UPDATE 文」 を参照 し て く だ さ い。
ラ ージ ・ オブ ジ ェ ク ト および UPDATE
切 り 捨て ら れた LOB 更新の動作は、 ANSI と Teradata セ ッ シ ョ ン ・ モー ド と では異
な り ます。 以下の表は、 切 り 捨て動作での相違点を説明 し てい ます。
適用 さ れ る セ ッ
シ ョ ン ・ モー ド
挿入時に非埋め込みバ イ ト が切 り 捨て ら れた場合の動作
ANSI
例外条件が発生 し ます。
UPDATE が失敗 し ます。
Teradata
例外条件は発生 し ません。
UPDATE は成功 し ます。 切 り 捨て ら れた LOB が保管 さ れます。
GENERATED ALWAYS 識別列および PARTITION の更新
以下に示す、 シ ス テ ムに よ っ て生成 さ れた列のセ ッ ト は更新で き ません。
• GENERATED ALWAYS 識別列
• PARTITION
GENERATED BY DEFAULT 識別列は更新で き ます。 指定 し た値は、 識別列パ ラ
メ ー タ の制約は受け ませんが、 列に CHECK 制約が定義 さ れてい る 場合その制約を
受け ます。
102
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 3 章 : SQL カー ソ ル制御お よ び DML 文
UPDATE ( 定位置形式 )
ミ ュ テー タ ー SET 句のサポー ト
埋め込み SQL では UDT がサポー ト さ れないため、 位置指定 さ れた形式の UPDATE
では ミ ュ テー タ ー SET 句はサポー ト さ れません。 ミ ュ テー タ ー SET 句についての
詳細は、 <SQL デー タ 操作言語 > の 「UPDATE」 を参照 し て く だ さ い。
ANSI セ ッ シ ョ ン ・ モー ド の UPDATE の規則
• WHERE CURRENT OF 句を使用す る と 、 UPDATE 文は、 WHERE CURRENT OF
cursor_name と い う カー ソ ルに よ っ て現在指示 さ れてい るデータ行に対し て処理を
行な う こ と がで き る。 こ の よ う なカー ソ ルの こ と を更新可能であ る と い う 。
• cursor_name を 宣言す る 際、 行 を 更新 ま た は削除す る 意図 を 指定す る 必要は
な い。
• cursor_name の現在取 り 出 さ れてい る 行に対 し て複数の更新を実行す る こ と 、
お よ び cursor_name の現在取 り 出 さ れてい る 行を削除 し た後に更新を実行す る こ
と は、 いずれ も 有効であ る 。
PPI 表のパーテ ィ シ ョ ン列を更新する際の規則
パーテ ィ シ ョ ン基本索引のパーテ ィ シ ョ ン列を更新す る 場合、 パーテ ィ シ ョ ン列の
更新はパーテ ィ シ ョ ン式が ( 値が INTEGER でなければ INTEGER にキ ャ ス ト し た
後に ) 1 ~ 65535 の範囲の非ヌ ル値を生成で き る 範囲でなければな り ません。
DEFAULT 関数の使用上の規則
• DEFAULT 関数は、 リ レ ーシ ョ ン 列 を 名前で識別す る 単一の引数 を 取 り ま す。
こ の関数は、 列の現行デフ ォ ル ト 値に等 し い値 と 評価 さ れます。 列のデフ ォ ル
ト 値が現行の ビル ト イ ン ・ シ ス テ ム関数 と し て指定 さ れ る 場合、 DEFAULT 関数
は、 文の実行時にシ ス テ ム変数の現行値 と 評価 さ れます。
こ の結果 と し て、 DEFAULT 関数のデー タ ・ タ イ プは、 デフ ォ ル ト が ヌ ルでない
場合、 デフ ォ ル ト と し て指定 さ れ る 定数ま たはビル ト イ ン関数のデー タ ・ タ イ
プにな り ます。 デフ ォ ル ト が ヌ ルの場合、 DEFAULT 関数のデー タ ・ タ イ プは、
デフ ォ ル ト の要求対象であ る 列ま たは式のデー タ ・ タ イ プ と 同 じ にな り ます。
• DEFAULT 関数には 2 つの形式があ り ます。 DEFAULT 関数は DEFAULT ま たは
DEFAULT (column_name) と し て指定す る こ と がで き ます。 列名が指定 さ れてい
ない場合、 シ ス テ ムは、 コ ン テ キ ス ト に基づいて列を派生 さ せます。 列の コ ン
テ キ ス ト を派生 さ せ る こ と がで き ない場合、 要求はアボー ト し 、 エ ラ ーが要求
側に戻 さ れます。
• SET 句の式 と し て、 列名の引数を指定 し ない DEFAULT 関数を指定す る こ と が
で き ます。 DEFAULT 関数の列名は、 column_name と し て指定 さ れた列です。
DEFAULT 関数は、 column_name と し て指定 さ れた列のデフ ォ ル ト 値 と 評価 さ れ
ます。
• 式の一部 と し て、 列名の引数を指定 し ない DEFAULT 関数を指定す る こ と はで
き ません。 代わ り に、 それ自身を指定す る 必要があ り ます。 こ のルールは、
ANSI/ISO SQL:2011 仕様で定義 さ れてい ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
103
第 3 章 : SQL カー ソ ル制御お よ び DML 文
UPDATE ( 定位置形式 )
•
ソ ース式に、 列名の引数を指定 し ない DEFAULT 関数を指定す る こ と がで き ま
す。 DEFAULT 関数は、 DEFAULT 関数への入力引数 と し て指定 さ れた列のデ
フ ォ ル ト 値 と 評価 さ れます。
た と えば、 DEFAULT (col2) は col2 のデフ ォ ル ト 値 と 評価 さ れます。 こ れは、
ANSI/ISO SQL:2011 仕様に対す る Teradata の拡張機能です。
• UPDATE 式の任意の場所に、 列名の引数を指定 し た DEFAULT 関数を指定で き
ます。 こ れは、 ANSI/ISO SQL:2011 仕様に対す る Teradata の拡張機能です。
• 列に対 し て明示的なデフ ォ ル ト 値が定義 さ れていない場合、 列がその引数 と し
て指定 さ れてい る と 、 DEFAULT 関数は ヌ ル と 評価 さ れます。
DEFAULT 関数について、 全般的な情報は <SQL 関数、 演算子、 式お よ び述語 > を
参照 し て く だ さ い。
例
こ の例では、 表の更新に使用 さ れ る カー ソ ルの名前は cursor_01 です。
EXEC SQL
UPDATE table_1
SET text = :text, K = :I + 1000
WHERE CURRENT OF cursor_01;
104
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第4章:
結果 コ ー ド 変数
こ の章では、 ス ト ア ド ・ プ ロ シージ ャ と 埋め込み SQL アプ リ ケーシ ョ ンで共有 さ
れ る 一連の結果 コ ー ド 変数 ( ス テー タ ス ・ パ ラ メ ー タ ) を説明 し ます。
注 : 初期値や制限 な ど 、 ス ト ア ド ・ プ ロ シー ジ ャ の結果 コ ー ド 変数の情報は、
「ス ト ア ド ・ プ ロ シージ ャ での結果 コ ー ド 変数」 (113 ページ ) に記載 さ れてい ます。
SQLSTATE
SQLSTATE は、 SQL 文の ス テー タ ス情報を受け取 る 変数です ( 埋め込み SQL アプ
リ ケーシ ョ ンではホ ス ト 変数 と し て明示的に宣言 さ れ、 ス ト ア ド ・ プ ロ シージ ャ で
は ス テー タ ス変数 と し て暗黙的に宣言 さ れます )。 こ の情報は、 エ ラ ー ・ コ ー ド や
警告 コ ー ド 、 お よ び制御文を含めた SQL 文の状態です。
ANSI への準拠
SQLSTATE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。 開発す る すべての新規アプ
リ ケーシ ョ ンで、 SQLCODE の代わ り に使用す る 必要があ り ます。
ス ト ア ド ・ プ ロ シージ ャ ・ プ ロ グ ラ ムに よ っ て使用 さ れ る SQLSTATE ス テー タ ス変
数は、 ANSI/ISO SQL:2011 規格ではあ り ません。
SQLSTATE ま たは SQLCODE のいずれかが、 ANSI セ ッ シ ョ ン ・ モー ド で作成 さ れ
たすべての埋め込み SQL アプ リ ケーシ ョ ンに対 し て宣言 さ れ る 必要があ り ます。
Teradata セ ッ シ ョ ン ・ モー ド で実行 し てい る 埋め込み SQL アプ リ ケーシ ョ ンには、
SQLSTATE は有効ではあ り ません。
SQLSTATE がエ ラ ー ・ コ ー ド を受け取る場所
• CLI/TDP
• Teradata Database
• Preprocessor2 実行時管理プ ロ グ ラ ム
SQLSTATE の構造
SQLSTATE は、 5 文字の文字列値で、 論理的には 2 文字の ク ラ ス と 3 文字のサブ ク
ラ ス に分け ら れます。 「SQLSTATE ク ラ ス定義」 (449 ページ ) に、 ANSI/ISO
SQL:2011 で定義 さ れてい る SQLSTATE ク ラ ス が リ ス ト さ れてい ます。
サブ ク ラ ス値は、 任意の数値ま たは単一の大文字の Latin 文字列にす る こ と がで き
ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
105
第 4 章 : 結果 コ ー ド 変数
SQLSTATE
埋め込み SQL の SQLSTATE 型定義
Preprocessor2 では、 示 さ れてい る ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン言語で、 次の
SQLSTATE デー タ ・ タ イ プ定義が必要です。
ク ラ イ ア ン ト 言語
• COBOL
デー タ ・ タ イ プ定義
CHARACTER (5)
• PL/I
C
CHARACTER (6)
6 番目の文字は、 必ず ヌ ル終了記号にな り ます。
SQLSTATE の宣言
SQLSTATE 宣言は、 埋め込み SQL と ス ト ア ド ・ プ ロ シージ ャ ・ アプ リ ケーシ ョ ン
と で次の よ う に異な り ます。
• 埋め込み SQL アプ リ ケーシ ョ ンの場合、 SQLSTATE は SQL DECLARE SECTION
内で明示的に宣言す る 必要があ り ます。
• ス ト ア ド ・ プ ロ シージ ャ ・ アプ リ ケーシ ョ ン内では、 SQLSTATE は暗黙的に宣
言 さ れます。
SQLSTATE および SQLCODE 両方の使用
同 じ 埋め込み SQL コ ンパ イ ル単位内で、 SQLSTATE と SQLCODE の両方を定義で
き ます。
ま た、 同 じ ス ト ア ド ・ プ ロ シージ ャ 内で、 SQLSTATE お よ び SQLCODE 変数の両方
の値を テ ス ト で き ます。
いずれの場合 も 、 両方の構造に有効な結果 コ ー ド が含まれます。
Teradata Database エ ラ ー ・ コ ー ド を SQLSTATE にマ ッ ピ ングする仕組み
特に指定 さ れていない限 り 、 CLI/TDP、 プ リ プ ロ セ ッ サ ・ ラ ン タ イ ム、 お よ び
Teradata Database のエ ラ ー ・ コ ー ド は、 実装定義 ク ラ ス の ANSI 定義オプシ ョ ン を
使用 し た SQLSTATE 値にマ ッ ピ ン グ さ れます。
• マ ッ ピ ン グ さ れない CLI/TDP エ ラ ーは、 ク ラ ス T0 です。
そのサブ ク ラ ス には、 3 桁の CLI エ ラ ー ・ コ ー ド が含まれます。
た と えば、 CLI エ ラ ー 157 ( 無効な Use_Presence_Bits オプシ ョ ン ) は、 ク ラ ス
T0 と サブ ク ラ ス 157 を生成 し ます。
• マ ッ ピ ン グ さ れない Teradata Database エ ラ ーは、 ク ラ ス T1 ~ ク ラ ス T9 です。
ク ラ ス 番号の数字は、 Teradata Database エ ラ ー ・ コ ー ド の最初の数字に対応 し
ま す。
サブ ク ラ ス には、 残 り の 3 桁の Teradata Database エ ラ ー ・ コ ー ド が含まれます。
106
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 4 章 : 結果 コ ー ド 変数
SQLSTATE
た と えば、 エ ラ ー 3776 ( 終了 し な い コ メ ン ト ) は、 ク ラ ス T3 と サブ ク ラ ス
776 を 生成 し ます。
埋め込み SQL アプ リ ケーシ ョ ン と ス ト ア ド ・ プ ロ シージ ャ ・ アプ リ ケーシ ョ ン
での SQLSTATE ク ラ ス定義お よ びマ ッ ピ ン グの完全なセ ッ ト は、 付録 D:
「SQLSTATE のマ ッ ピ ン グ」 に記載 さ れてい ます。
Teradata Database エ ラ ー ・ コ ー ド の完全な情報は、 < メ ッ セージ > を参照 し て く
だ さ い。
SQLCODE から SQLSTATE への例外マ ッ ピ ング
SQLCODE 値の中には、 CLI、 TDP、 ま たは Teradata SQL 内に起因 し ないエ ラ ーに
よ っ て生成 さ れ る も のがあ り ます。
こ れ ら の コ ー ド の例外マ ッ ピ ン グは、 付録 C: 「SQL コ ミ ュ ニ ケーシ ョ ン領域
(SQLCA)」 に記載 さ れてい ます。
ス ト ア ド ・ プ ロ シージ ャ での SQLSTATE 使用上の制約
ス ト ア ド ・ プ ロ シージ ャ 内では、 次の よ う な SQLSTATE の使用が可能です。
• SET 文のオペ ラ ン ド と し ての使用
た と えば、 次の よ う な文が可能です。
SET hErrorMessage = 'SQLSTATE' || sqlstate;
SET hSQLSTATE = SQLSTATE;
•
ス ト ア ド ・ プ ロ シージ ャ 内の SQL 文の式 と し ての使用
た と えば、 次の よ う な文が可能です。
INSERT INTO table_1 (column_1)
VALUES (:SQLSTATE);
UPDATE table_1
SET column_1 = column_1 + :ACTIVITY_COUNT;
ス ト ア ド ・ プ ロ シージ ャ 内では、 次の よ う な SQLSTATE の使用は無効です。
• SQLSTATE は明示的に宣言で き ない。
• SQLSTATE は値ま たは式に SET で き ない。
た と えば、 次の文は無効です。
SET SQLSTATE = h1 + h2;
• SQLSTATE は、 SELECT 文の INTO 句には指定で き ない。
た と えば、 次の文は無効です。
SELECT column_1 INTO :SQLSTATE FROM table_1;
• SQLSTATE は、 CALL 文の INOUT お よ び OUT パ ラ メ ー タ の代わ り には指定で
き ない。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
107
第 4 章 : 結果 コ ー ド 変数
SQLCODE
SQLCODE
ANSI セ ッ シ ョ ン ・ モー ド では、 SQLCODE は、 SQL 文の ス テー タ ス情報を受け取
る ホ ス ト 変数 ( 埋め込み SQL) ま たは ス テー タ ス変数 ( ス ト ア ド ・ プ ロ シージ ャ ) で
す。 こ の情報は、 エ ラ ー ・ コ ー ド や警告 コ ー ド 、 お よ び制御文を含めた SQL 文の
状態です。 ス テー タ ス ・ コ ー ド では、 アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムは、 実行可能
な埋め込み SQL 文が正常に完了 し たか ど う かテ ス ト で き ます。
Teradata セ ッ シ ョ ン ・ モー ド ( 埋め込み SQL 用 ) では、 SQLCODE は SQLCA ( 付録 C:
「SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)」 を参照 ) 内の 1 つの フ ィ ール ド です。
ANSI への準拠
SQLCODE は、 ANSI/ISO SQL:2011 に準拠 し てい ません。 SQLCODE は、 ANSI/ISO
SQL-92 規格で非推奨にな り 、 SQL:2011 規格では定義 さ れてい ません。 ANSI/ISO
SQL 委員会では、 SQLCODE の代わ り に SQLSTATE を使用 し て新 し いアプ リ ケー
シ ョ ン を作成す る こ と を推奨 し てい ます ( 「SQLSTATE」 (105 ページ ) を参照 )。
SQLCODE は、 SQLSTATE ホ ス ト 変数を指定 し ない、 ANSI セ ッ シ ョ ン ・ モー ド で
作成 さ れたすべての埋め込み SQL アプ リ ケーシ ョ ンに必要です。 つま り 、 作成す
る すべての埋め込み SQL アプ リ ケーシ ョ ンに ど ち ら か ( ま たは両方 ) を指定す る 必
要があ り 、 SQLSTATE を選択す る ほ う が望ま し い と い う こ と です。
ス ト ア ド ・ プ ロ シージ ャ ・ ア プ リ ケーシ ョ ン では、 SQLCODE ま たは SQLSTATE
( ま たはその両方 ) の ス テー タ ス を テ ス ト で き ます。
ANSI/ISO SQL-99 規格、 SQL:2011 規格のいずれにおいて も 、 SQLCA 内の
SQLCODE フ ィ ール ド は定義 さ れてお ら ず、 SQLCA も 定義 さ れてい ません。
ス ト ア ド ・ プ ロ シージ ャ では、 SQLCA を使用 し ません。
ANSI セ ッ シ ョ ン ・ モー ド の SQLCODE
SQLCODE は、 32 ビ ッ ト の符号付 き 整数 と し て定義 さ れてい ます。
埋め込み SQL アプ リ ケーシ ョ ンの SQL DECLARE SECTION 内で SQLCODE が定義
さ れていない場合、 Preprocessor2 はプ ロ グ ラ ム内で有効な SQLCODE が定義 さ れて
い る も の と 見な し ます。
ス ト ア ド ・ プ ロ シージ ャ では、 SQLCODE ま たは SQLSTATE のいずれかの ス テー タ
ス値を テ ス ト で き ます。
Teradata セ ッ シ ョ ン ・ モー ド での SQLCODE
SQLCA 内の SQLCODE フ ィ ール ド は、 SQL 文を実行 し た結果を埋め込み SQL アプ
リ ケーシ ョ ン ・ プ ロ グ ラ ムに送 り ます。 ス ト ア ド ・ プ ロ シージ ャ では、 SQLCA を
使用 し ません。
108
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 4 章 : 結果 コ ー ド 変数
SQLCODE
Preprocessor2 オプシ ョ ン SQLFLAGGER ま たは -sf が NONE にセ ッ ト さ れ る 場合、
SQLCODE は SQLCA に よ っ て埋め込み SQL アプ リ ケーシ ョ ン ・ プ ロ グ ラ ム内で定
義 さ れます。 それ以外の場合、 アプ リ ケーシ ョ ン内で SQLCODE を明示的に定義す
る 必要があ り ます。
ス ト ア ド ・ プ ロ シージ ャ では、 SQLCODE ま たは SQLSTATE のいずれかの ス テー タ
ス値を テ ス ト で き ます。
SQLCODE 値のカ テ ゴ リ
埋め込み SQL ま たは ス ト ア ド ・ プ ロ シージ ャ の文が実行 さ れた後でアプ リ ケー
シ ョ ンに戻 さ れ る SQLCODE 値は、 次の表で説明す る よ う に、 必ず 3 つのカ テ ゴ リ
のいずれかにな り ます。
SQLCODE 値
意味
負
処理時にエ ラ ーが発生 し た。
エ ラ ーの性質は、 コ ー ド の数値で示 さ れます。
0
処理は正常に行なわれた。
正
通常どお り に終了 し た。
0 お よ び +100 以外の正の値は、 シ ス テ ム に よ る 警告を示 し てい ます。
た と えば、 +100 の SQLCODE 値は、 次の結果のいずれか を示 し ます。
• 行が選択 さ れなか っ た。
• 選択 さ れたすべての行が処理 さ れた。
SQLCODE の更新
SQLCODE は、 各実行可能文が処理 さ れた後の実行時に更新 さ れます。 SQLCODE
変数に書き込まれる ス テータ ス コー ド を テ ス ト する ため、 独自のアプ リ ケーシ ョ ン ・
コ ー ド を作成す る 必要があ り ます。
• 埋め込み SQL アプ リ ケーシ ョ ンの場合の条件処理については、 「WHENEVER」
(349 ページ ) を参照 し て く だ さ い。
• ス ト ア ド ・ プ ロ シージ ャ ・ ア プ リ ケ ーシ ョ ン の場合の条件処理につい て は、
「完了条件、 例外条件、 お よ びユーザー定義条件のハン ド ラ ー」 (138 ページ ) を
参照 し て く だ さ い。
SQLCODE のテ ス ト
SQL 文の実行後には、 SQLCODE を毎回テ ス ト し 、 文が正常に完了 し た こ と 、 ま た
は失敗 し た文が適切に処理 さ れ る こ と を確実に し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
109
第 4 章 : 結果 コ ー ド 変数
SQLCODE
やは り 、 受け入れ ら れない SQLCODE 値を解決す る ために、 コ ー ド を作成す る 必要
があ り ます。
• 埋め込み SQL アプ リ ケーシ ョ ンの場合の条件処理については、 「WHENEVER」
(349 ページ ) を参照 し て く だ さ い。
• ス ト ア ド ・ プ ロ シージ ャ ・ ア プ リ ケーシ ョ ン の場合の条件処理につい ては、
「完了条件、 例外条件、 お よ びユーザー定義条件のハン ド ラ ー」 (138 ページ ) を
参照 し て く だ さ い。
SQLCODE テ ス ト の例
一時表を作成 し た後、 INSERT…SELECT 文を使用 し てその表に値を入れ る アプ リ
ケーシ ョ ンについて考え てみま し ょ う 。
その場合、 CREATE TABLE 文の実行直後に SQLCODE の検査を実行す る コ ー ド を
記述 し て く だ さ い。
こ の文が表の正常な作成に失敗す る と 、 その文に続 く INSERT…SELECT 文を実行
す る 意味がな く な り ます。 そ こ で、 WHENEVER 文の コ ー ド を記述 し て、
INSERT…SELECT の実行を防止 し た り 、 予定どお り で問題がなければ処理を続け
た り す る よ う な適切な ア ク シ ョ ン を実行す る よ う に し ます。
ま た、 INSERT…SELECT 文 も 検査 し て、 それに続 く 一時表の参照が有効であ る こ
と を確認す る と 良いで し ょ う 。
た と えば、 SQLCODE 値が 0 であれば、 1 つ以上の行が正常に選択 さ れて挿入 さ れ
た こ と を示 し ます。
値が +100 で あれば、 選択 ま たは挿入 さ れた行はな く 、 表が空で あ る こ と を 示 し
ま す。 その よ う な場合、 空の一時表を後で参照 し て も 不正確で あ る ため、 こ れ以
降に空の一時表への参照が行なわれない よ う に、 い く ら かの処置を取 る 必要があ
り ます。
Teradata Database エ ラ ー ・ メ ッ セージが SQLCODE 値にマ ッ ピ ングする仕組み
SQLCODE 値の Teradata Database エ ラ ー ・ メ ッ セージ番号へのマ ッ ピ ン グ につい
ては、 付録 C: 「SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)」 を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ での SQLCODE 使用上の制約
ス ト ア ド ・ プ ロ シージ ャ 内では、 次の よ う な SQLCODE の使用は可能です。
• SET 文のオペ ラ ン ド と し て指定す る 場合。
た と えば、 次の文は可能です。
SET h1 = - SQLCODE;
IF SQLCODE = h1 THEN
...
...
END IF;
110
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 4 章 : 結果 コ ー ド 変数
ACTIVITY_COUNT
•
ス ト ア ド ・ プ ロ シージ ャ 内の SQL 文の式 と し て指定す る 場合。
た と えば、 次の よ う な文が可能です。
INSERT INTO table_1 (column_1)
VALUES (:SQLCODE);
UPDATE table_1
SET column_1 = column_1 + :SQLCODE;
ス ト ア ド ・ プ ロ シージ ャ 内では、 次の よ う な SQLCODE の使用は無効です。
• SQLCODE は明示的に宣言で き ない。
• SQLCODE は値ま たは式に SET で き ない。
た と えば、 次の文は無効です。
SET SQLCODE = h1 + h2;
• SQLCODE は、 SELECT 文の INTO 句には指定で き ない。
た と えば、 次の文は無効です。
SELECT column_1 INTO :SQLCODE FROM table_1;
• SQLCODE は、 CALL 文の INOUT お よ び OUT パ ラ メ ー タ の代わ り には指定で
き ない。
ACTIVITY_COUNT
ACTIVITY_COUNT ス テー タ ス変数は、 埋め込み SQL ま たは ス ト ア ド ・ プ ロ シー
ジ ャ ・ アプ リ ケーシ ョ ンの SQL DML 文の影響を受けた行数を戻 し ます。
こ れは、 埋め込み SQL アプ リ ケーシ ョ ンの SQLCA の SQLERRD 配列におけ る
Activity Count 語 と 同 じ 機能を実現 し ます ( 付録 C: 「SQL コ ミ ュ ニ ケーシ ョ ン領域
(SQLCA)」 を参照 )。
ANSI への準拠
ACTIVITY_COUNT は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
ACTIVITY_COUNT の設定
ACTIVITY_COUNT は、 ス ト ア ド ・ プ ロ シージ ャ ま たは埋め込み SQL アプ リ ケー
シ ョ ンが実行を開始す る と き には 0 に初期設定 さ れてお り 、 各実行可能 SQL 文の
処理後の実行時に更新 さ れます。 受け取 る カ ウ ン ト を テ ス ト す る ための独自の コ ー
ド を作成す る 必要があ り ます。
ク ラ イ ア ン ト ・ ア プ リ ケーシ ョ ン と サーバーの機能に応 じ て、 ア ク テ ィ ビ テ ィ ・
カ ウ ン ト には 2 つの異な る 制限があ り ます。
• 4 バ イ ト 制限 (2^32-1 行 )
• 8 バ イ ト 制限 (2^64-1 行 )
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
111
第 4 章 : 結果 コ ー ド 変数
ACTIVITY_COUNT
8 バ イ ト のア ク テ ィ ビ テ ィ ・ カ ウ ン ト を要求す る よ う に ク ラ イ ア ン ト ・ アプ リ ケー
シ ョ ン を コ ーデ ィ ン グ し 、 サーバーが 8 バ イ ト のア ク テ ィ ビ テ ィ ・ カ ウ ン ト を返す
こ と がで き る 場合、 数値オーバーフ ロ ーの警告は表示 さ れな く な り ます。 つま り 、
ア ク テ ィ ビ テ ィ ・ カ ウ ン ト は、 常に実際の ア ク テ ィ ビ テ ィ ・ カ ウ ン ト に な り ま す
( ア ク テ ィ ビ テ ィ ・ カ ウ ン ト のモジ ュ ロ 2^32 にはな り ません )。 ただ し 、 8 バ イ ト
のア ク テ ィ ビ テ ィ ・ カ ウ ン ト を要求す る よ う に ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン を
コ ーデ ィ ン グ し ない場合、 ま たはサーバーが 8 バ イ ト の ア ク テ ィ ビ テ ィ ・ カ ウ ン
ト を返す こ と がで き ない場合、 やは り 数値オーバーフ ロ ーの警告が表示 さ れます。
• 埋め込み SQL アプ リ ケーシ ョ ンの場合の条件処理については、 「WHENEVER」
(349 ページ ) を参照 し て く だ さ い。
• ス ト ア ド ・ プ ロ シ ージ ャ ・ ア プ リ ケ ー シ ョ ン の場合の条件処理につい て は、
「完了条件、 例外条件、 お よ びユーザー定義条件のハン ド ラ ー」 (138 ページ ) を
参照 し て く だ さ い。
ACTIVITY_COUNT のテ ス ト
影響 さ れた行数 を 知 る 必要の あ る SQL 文の各実行後に ACTIVITY_COUNT を 検
査 し 、 適切なエ ラ ー処理を確認 し ます。
ACTIVITY_COUNT 値に基づいてエ ラ ー処理を扱 う 自分の コ ー ド を作成す る 必要が
あ り ます。
• 埋め込み SQL アプ リ ケーシ ョ ンの場合の条件処理については、 「WHENEVER」
(349 ページ ) を参照 し て く だ さ い。
• ス ト ア ド ・ プ ロ シージ ャ ・ ア プ リ ケ ーシ ョ ン の場合の条件処理につい て は、
「完了条件、 例外条件、 お よ びユーザー定義条件のハン ド ラ ー」 (138 ページ ) を
参照 し て く だ さ い。
ACTIVITY_COUNT の使用上の制約
ス ト ア ド ・ プ ロ シージ ャ ま たは埋め込み SQL アプ リ ケーシ ョ ン内では、 次の よ う
な ACTIVITY_COUNT の使用は可能です。
• ACTIVITY_COUNT を SET 文のオペ ラ ン ド と し て指定す る 。
た と えば、 次の文は可能です。
SET h1 = h1 + ACTIVITY_COUNT;
• ACTIVITY_COUNT を SQL 文の式 と し て指定す る 。
た と えば、 次の よ う な文が可能です。
INSERT INTO table_1 (column_1)
VALUES (:ACTIVITY_COUNT);
UPDATE table_1
SET column_1 = column_1 + :ACTIVITY_COUNT;
次の よ う な ACTIVITY_COUNT の使用は無効です。
• ACTIVITY_COUNT は ス ト ア ド ・ プ ロ シージ ャ 内で明示的に宣言で き ない。
• ACTIVITY_COUNT は値ま たは式に SET で き ない。
た と えば、 次の文は無効です。
SET ACTIVITY_COUNT = h1 + h2;
112
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 4 章 : 結果 コ ー ド 変数
ス ト ア ド ・ プ ロ シージ ャ での結果 コ ー ド 変数
• ACTIVITY_COUNT は、 SELECT 文の INTO 句には指定で き ない。
た と えば、 次の文は無効です。
SELECT column_1 INTO :ACTIVITY_COUNT FROM table_1;
• ACTIVITY_COUNT は、 ス ト ア ド ・ プ ロ シージ ャ 内で CALL 文の INOUT お よ び
OUT パ ラ メ ー タ の代わ り には指定で き ない。
• 問い合わせのア ク テ ィ ビ テ ィ ・ カ ウ ン ト が限界の 232-1 行を超え る 場合、 シ ス テ
ムは実際のア ク テ ィ ビ テ ィ ・ カ ウ ン ト のモジ ュ ロ 232 を、 次の警告 メ ッ セージ と
と も に戻 し ます。
Numeric overflow has occurred internally.The number of rows returned
is actual number of rows returned, modulo 2^32.
こ の状況におけ る 実際のア ク テ ィ ビ テ ィ ・ カ ウ ン ト を判別す る には、 次の よ う
に し て、 232 に、 戻 さ れ る モジ ュ ロ 232 の値を加え る 必要があ り ます。
True activity count = returned_value + 2
32
こ れは SQL ス ト ア ド ・ プ ロ シージ ャ と 埋め込み SQL アプ リ ケーシ ョ ンの両方に
当ては ま り ます。
注 : ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン と サーバーの機能に応 じ て、 ア ク テ ィ ビ
テ ィ ・ カ ウ ン ト には 2 つの異な る 制限があ り ます。
•
•
4 バ イ ト 制限 (2^32-1 行 )
8 バ イ ト 制限 (2^64-1 行 )
ス ト ア ド ・ プ ロ シ ージ ャ での結果 コ ー ド 変数
ス ト ア ド ・ プ ロ シージ ャ で使用す る 場合、 制御文以外の SQL 文内の結果 コ ー ド 変
数には、 接頭部 と し て コ ロ ン文字 (:) を付け る 必要があ り ます。
結果 コ ー ド 変数の初期値
結果 コ ー ド 変数は、 Teradata Database エ ラ ー ・ コ ー ド にマ ッ プ さ れ、 制御文を含む
ス ト ア ド ・ プ ロ シージ ャ SQL 文の実行の ス テー タ ス を反映 し ます。
最後の列に示 さ れてい る 初期値は、 ス ト ア ド ・ プ ロ シージ ャ や埋め込み SQL アプ
リ ケーシ ョ ンの実行を開始す る と き に設定 さ れ る 値です。
結果 コ ー ド 変数
デー タ ・ タ イ プ
SQLCODE
SMALLINT
SQLSTATE
CHARACTER (5)
初期値
0
'00000'
CHARACTER SET は、 数字か大文字の ラ テ ン文
字 ( ロ ーマ字 )、 あ る いはその両方の混合です。
ACTIVITY_COUNT
DECIMAL (18,0)
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
0
113
第 4 章 : 結果 コ ー ド 変数
ス ト ア ド ・ プ ロ シージ ャ での結果 コ ー ド 変数
文の実行の終了時に設定 さ れた値は、 例外の条件ま たは完了の条件 ( いずれかが発
生 し た場合 ) を反映 し ます。 正常な完了の場合を除 き 、 こ れ ら の条件は、 特定の
SQLSTATE 値に条件ハン ド ラ ーが指定 さ れていれば処理す る こ と がで き ます。
正常完了す る と 、 結果 コ ー ド 変数は、 ス ト ア ド ・ プ ロ シージ ャ 内の制御文を除 く
SQL 文に適 し た値に設定 さ れ ま す。 制御文は、 結果 コ ー ド 変数に よ っ て変更 さ れ
る こ と はあ り ません。
ス ト ア ド ・ プ ロ シージ ャ での結果コ ー ド 変数に対する制限
ス ト ア ド ・ プ ロ シージ ャ での結果 コ ー ド 変数には、 以下の制約が適用 さ れます。
• 結果 コ ー ド 変数は、 ス ト ア ド ・ プ ロ シージ ャ に対 し て ロ ーカルです。
入れ子の ス ト ア ド ・ プ ロ シージ ャ の場合 も 、 呼び出 し 側のプ ロ シージ ャ にはエ
ク ス ポー ト さ れません。
• 結果 コ ー ド 変数を明示的に宣言す る こ と はで き ません。
• 次の よ う な場合には、 結果 コ ー ド 変数は指定で き ません。
•
114
•
SET 文の割 り 当ての タ ーゲ ッ ト (LHS) と し て指定す る 場合
SQL SELECT…INTO 文の INTO 句で指定す る 場合
•
SQL CALL 文の INOUT お よ び OUT 引数の位置に指定す る 場合
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第5章:
SQL ス ト ア ド ・ プ ロ シージ ャ
こ の章では、 SQL 形式の ス ト ア ド ・ プ ロ シージ ャ について説明 し ます。
ス ト ア ド ・ プ ロ シージ ャ の概要につい ては、 「ス ト ア ド ・ プ ロ シージ ャ の概要」
(15 ページ ) を参照 し て く だ さ い。
外部ス ト ア ド ・ プ ロ シージ ャ については、 <SQL デー タ 定義言語 > お よ び <SQL 外
部ルーチン ・ プ ロ グ ラ ミ ン グ > を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ に関係す る 権限の付与
プ ロ シージ ャ を作成、 削除、 実行、 お よ び変更す る ための権限は、 GRANT 文を使
用 し て付与 し 、 REVOKE 文を使用 し て取 り 消す こ と がで き ます。
権限
こ の権限を付与で き る デー タ ベース ・ オブジ ェ ク ト の レベル
CREATE PROCEDURE
• デー タ ベース
• ユーザー
ALTER PROCEDURE
DROP PROCEDURE
EXECUTE
PROCEDURE
• デー タ ベース
• ユーザー
• ス ト ア ド ・ プ ロ シージ ャ
• DROP PROCEDURE は、 新 し いユーザーやデー タ ベース が作成 さ れ る と き に、
すべてのユーザーお よ びデー タ ベース に自動的に付与 さ れます。
• EXECUTE PROCEDURE は、 オブ ジ ェ ク ト が作成 さ れ る と き に、 ス ト ア ド ・
プ ロ シージ ャ の作成者にのみ自動的に付与 さ れます。
ス ト ア ド ・ プ ロ シージ ャ の所有者 と 作成者が異な る 場合、 Teradata Database は こ
の権限を、 ス ト ア ド ・ プ ロ シージ ャ の所有者に自動的には付与 し ません。
ス ト ア ド ・ プ ロ シージ ャ の直接所有者は、 ユーザー、 ま たはその ス ト ア ド ・ プ ロ
シージ ャ が作成 さ れたデー タ ベース領域にな り ます。 一方、 作成者 と は、 任意の
デー タ ベース内で ス ト ア ド ・ プ ロ シージ ャ を作成す る ユーザーの こ と を言い ます。
SQL 形式の GRANT 文 と REVOKE 文について、 お よ び ALTER PROCEDURE、
CREATE PROCEDURE、 DROP PROCEDURE、 EXECUTE PROCEDURE 権限につい
ての詳細は、 <SQL デー タ 制御言語 > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
115
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の権限チ ェ ッ ク
ス ト ア ド ・ プ ロ シ ージ ャ の権限チ ェ ッ ク
ス ト ア ド ・ プ ロ シージ ャ を作成ま たは実行す る には、 プ ロ シージ ャ で SQL 文を実
行す る ための適切な権限 と 、 ス ト ア ド ・ プ ロ シージ ャ 本体で参照 さ れ る デー タ ベー
ス ・ オブジ ェ ク ト に対す る 権限がなければな り ません。 ま た Teradata Database は、
プ ロ シージ ャ の作成時には適切な CREATE 権限 と DROP 権限について、 お よ びプ
ロ シージ ャ の実行時には EXECUTE 権限について適切にチ ェ ッ ク し ます。
CREATE/REPLACE PROCEDURE 文で SQL SECURITY 句を定義す る こ と に よ り 、
権限チ ェ ッ ク の処理方法を指定で き ます。 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ルま
たは実行時に、 Teradata Database は SQL SECURITY 句の以下のオプシ ョ ンに基づい
て、 必要な権限をチ ェ ッ ク し ます。
• CREATOR
• DEFINER
• INVOKER
• OWNER
注 : ス ト ア ド ・ プ ロ シージ ャ の作成者 と 直接所有者が異な る 場合は、 OWNER
オプシ ョ ン を指定す る ために CREATE OWNER PROCEDURE 権限が必要にな り
ます。
SQL SECURITY オプシ ョ ンに よ り 、 ス ト ア ド ・ プ ロ シージ ャ を コ ンパ イ ル ま たは実
行す る と き に、 次に示すど の権限をチ ェ ッ ク 対象にす る かを決定 し ます。
•
ス ト ア ド ・ プ ロ シージ ャ を作成 し たユーザーの権限 ( ス ト ア ド ・ プ ロ シージ ャ が
常駐す る 場所は関係あ り ません )
•
•
ス ト ア ド ・ プ ロ シージ ャ を呼び出 し た現在のユーザーの権限
ス ト ア ド ・ プ ロ シージ ャ の直接所有者の権限 ( ユーザーま たは ス ト ア ド ・ プ ロ
シージ ャ が常駐す る デー タ ベース領域 )
•
ス ト ア ド ・ プ ロ シージ ャ の作成者お よ び所有者の権限
さ ら に、 SQL SECURITY オプシ ョ ンでは、 デフ ォ ル ト ・ デー タ ベース も 決定 し ま
す。 こ のデー タ ベース は、 プ ロ シージ ャ 本体の SQL 文で参照す る 修飾 さ れていな
いオブジ ェ ク ト の暗黙的な修飾に使用 さ れます。
SQL SECURITY 句は、 任意選択です。 こ の句を含めない場合、 Teradata Database に
よ り 、 デフ ォ ル ト と し て SQL SECURITY DEFINER オプシ ョ ンが使用 さ れます。
SQL SECURITY 句についての詳細は、 <SQL デー タ 定義言語 > の 「CREATE/
REPLACE PROCEDURE」 を参照 し て く だ さ い。
プ ロ キ シ経由で Teradata Database にア ク セ ス し てい る 場合 も 、 ス ト ア ド ・ プ ロ シー
ジ ャ の権限チ ェ ッ ク は SQL SECURITY 句に基づいて行われます。 SQL SECURITY
INVOKER オプシ ョ ンが指定 さ れてい る 場合、 プ ロ キ シ ・ ユーザーの権限は、 参照
さ れ る SQL 文やオブジ ェ ク ト に必要な権限のチ ェ ッ ク にのみ使用 さ れます。
116
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ での SQL 文の使用に関す る 規則
ス ト ア ド ・ プ ロ シージ ャ にプ ロ キ シ ・ ユーザーを設定す る SET QUERY_BAND 文が
含まれ る 場合は、 ス ト ア ド ・ プ ロ シージ ャ が実行 さ れ る と き に、 信頼済みユーザー
の CONNECT THROUGH 権限が Teradata Database に よ り 検証 さ れます。
信頼済みユーザーの CONNECT THROUGH 権限に WITH TRUST-ONLY オプシ ョ ン
が含 ま れ る 場合は、 プ ロ キ シ ・ ユーザー ま たはプ ロ キ シ ・ ロ ール を設定、 変更、
ま たは削除す る 、 すべての SET QUERY_BAND 文は、 信頼済み要求か ら 実行 さ れな
ければな り ません。 ス ト ア ド ・ プ ロ シージ ャ 内の CALL 文が信頼済みの場合、 SQL
ス ト ア ド ・ プ ロ シージ ャ の SET QUERY_BAND 文は信頼済みです。
信頼済みユーザーへの CONNECT THROUGH 権限の付与について、 詳細は <SQL
デー タ 制御言語 > を参照 し て く だ さ い。 SET QUERY_BAND を使用 し たプ ロ キ シ ・
ユーザーの設定について、 詳細は <SQL デー タ 定義言語 > を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ での SQL 文の使用に関す る規則
静的お よ び動的な SQL 文、 制御文、 条件ハン ド ラ ー、 カー ソ ル宣言、 条件宣言、
お よ び ロ ーカル宣言文を含むあ ら ゆ る 文を ス ト ア ド ・ プ ロ シージ ャ で使用す る 際
に適用 さ れ る 規則は、 SQL SECURITY 句で指定 さ れたオプシ ョ ンに よ っ て異な り
ます。
ス ト ア ド ・ プ ロ シージ ャ 内での文の使用に対 し て、 以下の規則が適用 さ れます。
•
ス ト ア ド ・ プ ロ シージ ャ 内に指定 さ れたいずれかの SQL 文が欠落 し たデー タ
ベース ・ オブジ ェ ク ト を参照 し ていて、 SQL SECURITY 句が CREATOR、
OWNER、 ま たは INVOKER であ る場合、 そのプ ロ シージ ャ の作成時に SPL コ ン
パ イ ル警告が出 さ れ る 。
ス ト ア ド ・ プ ロ シージ ャ 内に指定 さ れたいずれかの SQL 文が、 欠落 し たデー タ
ベース ・ オブジ ェ ク ト を参照 し ていて、 SQL SECURITY 句が DEFINER であ る
場合。
• 作成者 と 所有者が同 じ であれば、 その ス ト ア ド ・ プ ロ シージ ャ の作成時に
SPL コ ンパ イ ル警告が出 さ れ る 。
• 作成者 と 所有者が同 じ でなければ、 エ ラ ーが報告 さ れ、 その ス ト ア ド ・ プ ロ
シージ ャ は作成 さ れない。
参照 さ れてい る オブジ ェ ク ト が、 ス ト ア ド ・ プ ロ シージ ャ の実行時に存在 し な
い と 、 実行時例外が報告 さ れ る 。
欠落 し たデー タ ベース ・ オブジ ェ ク ト を カー ソ ルの SELECT 文が参照す る と 、
SPL コ ンパ イ ル ・ エ ラ ーが出 さ れ る 。
• SQL 文に よ っ て ス ト ア ド ・ プ ロ シージ ャ 本体内に作成 さ れたオブジ ェ ク ト がす
でに存在す る 場合や、 別の ス キーマの も と に存在す る 場合、 SPL コ ンパ イ ル警
告が出 さ れ る 。
• ス ト ア ド ・ プ ロ シージ ャ で参照 さ れ る オブジ ェ ク ト に対 し てユーザーが必要な
権限を持っ ていない場合、 ス ト ア ド ・ プ ロ シージ ャ の作成時に該当す る 警告ま
たはエ ラ ーが出 さ れ る 。 Teradata Database は、 SQL SECURITY 句の定義に基づい
て権限をチ ェ ッ ク し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
117
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ での SQL 文の使用に関す る 規則
要求 さ れた権限が ス ト ア ド ・ プ ロ シージ ャ の実行時に存在 し ない と 、 実行時例
外が報告 さ れ る 。
カー ソ ルの SELECT 文内で参照 さ れてい る オブジ ェ ク ト に対 し て必要な権限を
作成者が も っ ていない と 、 SPL コ ンパ イ ル ・ エ ラ ーが報告 さ れ る 。
ス ト ア ド ・ プ ロ シージ ャ で作成 さ れたオブ ジ ェ ク ト の所有権
•
ス ト ア ド ・ プ ロ シージ ャ の直接所有者は、 その ス ト ア ド ・ プ ロ シージ ャ を使用
し て作成 さ れた永続オブジ ェ ク ト の作成者です。 た と えプ ロ キ シ接続経由で
Teradata Database にア ク セ ス し てい る 場合で も 、 こ の よ う にな り ます。 揮発性表
は、 永続オブジ ェ ク ト ではないので、 例外にな り ます。
それ以外のユーザーがその ス ト ア ド ・ プ ロ シージ ャ を実行 し て も 、 新 し く 作成
さ れたオブジ ェ ク ト に対す る 自動的な権限を与え ら れません。 直接所有者は、
新規に作成 し たオブジ ェ ク ト に対す る 権限を、 他のユーザーに対 し て明示的に
付与す る こ と がで き ます。
• SQL 文内のデー タ ベース ・ オブジ ェ ク ト をデー タ ベース名で明示的に修飾 し な
い と 、 デフ ォ ル ト ・ デー タ ベース が使われて、 オブジ ェ ク ト 名が暗黙で修飾 さ
れます。 詳細は、 「ス ト ア ド ・ プ ロ シージ ャ の権限チ ェ ッ ク 」 (116 ページ ) を参
照 し て く だ さ い。
DDL 文を使っ てデー タ ベース ・ オブジ ェ ク ト を作成す る 場合は、 修飾す る 側の
デー タ ベース ( 暗黙ま たは明示的の ど ち ら かで ) が、 作成 さ れ る そのオブジ ェ ク
ト の直接所有者にな り ます。
SQL 文エ ラ ー
ス ト ア ド ・ プ ロ シージ ャ 本体内の何 ら かの文に よ っ てエ ラ ーや警告が発生す る と 、
次の よ う な影響が生 じ ます。
118
文で発生 し たエ ラ ーや警告
その場合
構文エ ラ ー
• コ ンパ イ ル ・ エ ラ ーが報告 さ れ る 。
• プ ロ シージ ャ は作成 さ れない。
複数のエ ラ ー
その文に関 し て、 最初のエ ラ ーだけが報告 さ れ る 。
複数の警告
その文に関 し て、 最初の警告だけが報告 さ れ る 。
エ ラ ー と 警告
その文に関 し て、 最初のエ ラ ーだけが報告 さ れ る 。
コ ンパ イ ルに関す る 警告
( エ ラ ーはな し )
警告 と と も に ス ト ア ド ・ プ ロ シージ ャ が作成 さ れ る 。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の実行
SQL 文内の未修飾オブ ジ ェ ク ト
ス ト ア ド ・ プ ロ シージ ャ の実行時には、 いずれかの DML 文中で参照 さ れてい る の
にデー タ ベース名で明示的に修飾 さ れていないデー タ ベース ・ オブジ ェ ク ト に対 し
て、 以下の よ う な規則が適用 さ れます。
• 未修飾の表参照の場合、 ス ト ア ド ・ プ ロ シージ ャ のデ フ ォ ル ト ・ デー タ ベー
ス がデ フ ォ ル ト に な り ま す。 デ フ ォ ル ト ・ デー タ ベー ス は、 SQL SECURITY
オプ シ ョ ン に よ っ て異な り ま す。 詳細は、 「ス ト ア ド ・ プ ロ シージ ャ の権限
チ ェ ッ ク 」 (116 ページ ) を参照 し て く だ さ い。
状況
その場合
コ ンパ イ ル時のデ
フ ォ ル ト ・ デー タ
ベース内にその表は
存在 し ない
ユーザーの ロ グ イ ン ・ デー タ ベース内か ら 、 同 じ 名前の付い
た揮発性の表が検索 さ れます。
参照 さ れてい る 表は
デフ ォ ル ト ・ デー タ
ベース内に存在す る
• 揮発性の表が存在す る 場合、 それに対す る ア ク セ ス が行な
われます。
• 揮発性の表が存在 し ない場合、 実行時例外 3807 (Table/
view/trigger/procedure does not exist) が発生 し ます。
同 じ 名前の付い た揮発性の表が ユーザーの ロ グ イ ン ・ デー
タ ベー ス 内に存在 し な い場合は、 表への ア ク セ ス が行 な わ
れ ま す。
同 じ 名前の付いた揮発性の表がユーザーの ロ グ イ ン ・ デー タ
ベース内 に も 存在する 場合、 実行時例外 3806 (Table/view/
trigger name is ambiguous) が発生 し ます。
• 揮発性にな る 可能性のあ る 表に対す る 参照 も 含め、 ス ト ア ド ・ プ ロ シージ ャ 本
体内に指定 さ れた文中で参照 さ れてい る 未修飾のデー タ ベース ・ オブジ ェ ク ト
はすべて、 現在のデフ ォ ル ト ・ デー タ ベース か ら 検証 さ れます。
ス ト ア ド ・ プ ロ シ ージ ャ の実行
ス ト ア ド ・ プ ロ シージ ャ を実行す る には、 SQL CALL 文を使用 し ます。
埋め込み SQL か ら の ス ト ア ド ・ プ ロ シージ ャ の実行について、 詳細は <SQL デー
タ 操作言語 > の CALL 文を参照 し て く だ さ い。
CALL 文の実行で ト ラ ンザ ク シ ョ ン を開始す る こ と はで き ません。
ト ラ ンザク シ ョ ンの開始
ト ラ ンザ ク シ ョ ンは、 ス ト ア ド ・ プ ロ シージ ャ 内で制御文以外の最初の SQL 文が
実行 さ れ る と 、 開始 さ れます。 制御文では、 ト ラ ンザ ク シ ョ ン を開始す る こ と はで
き ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
119
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の再 コ ンパ イ ル
• Teradata ト ラ ンザ ク シ ョ ン ・ モー ド では、 ス ト ア ド ・ プ ロ シージ ャ 内の各文が
別個の ト ラ ンザ ク シ ョ ンにな り ます。 プ ロ シージ ャ 本体の中で BT (BEGIN
TRANSACTION) お よ び ET (END TRANSACTION) を指定す る こ と に よ っ て、
ト ラ ンザ ク シ ョ ン を明示的に開始で き ます。
• ANSI ト ラ ンザ ク シ ョ ン ・ モー ド では、 ス ト ア ド ・ プ ロ シージ ャ の本体が
COMMIT で終わ っ ていない限 り 、 後続の文で COMMIT か ROLLBACK が指定
さ れ る ま で ス ト ア ド ・ プ ロ シージ ャ のア ク シ ョ ンが コ ミ ッ ト さ れません。
要求の数は、 ス ト ア ド ・ プ ロ シージ ャ 内の各 SQL 要求ご と に増え ます。
デー タ ・ タ イ プ ・ コ ー ド
Teradata Database は、 CALL 文が実行依頼 さ れ る と 、 呼び出 し 側の ア プ リ ケ ー
シ ョ ンに CLIv2 デー タ ・ タ イ プ ・ コ ー ド の特定のセ ッ ト を返 し ます。
ス ト ア ド ・ プ ロ シージ ャ のパラ メ ー タ
CALL 文を実行依頼す る と 返 さ れ る デー タ ・ タ イ プ ・ コ ー ド には、 パ ラ メ ー タ ・
タ イ プが含まれます。 ス ト ア ド ・ プ ロ シージ ャ のパ ラ メ ー タ には、 次の 3 種類があ
り ます。
• IN ( 入力パ ラ メ ー タ )
• INOUT ( 入力パ ラ メ ー タ か出力パ ラ メ ー タ のいずれか、 ま たは両方 )
• OUT ( 出力パ ラ メ ー タ )
ス ト ア ド ・ プ ロ シージ ャ では、 ど のデー タ ・ タ イ プのパ ラ メ ー タ も ヌ ル可能です。
関連 ト ピ ッ ク
ス ト ア ド ・ プ ロ シージ ャ の実行について、 詳細は <SQL デー タ 操作言語 > の CALL
文の説明を参照 し て く だ さ い。
CALL 文で使用で き る デー タ ・ タ イ プ ・ コ ー ド の完全な リ ス ト は、 <Teradata CLI V2
ワー ク ス テーシ ョ ン接続シ ス テ ム > ま たは <Teradata CLI V2 リ フ ァ レ ン ス - メ イ ン
フ レーム接続シ ス テ ム > の 「DataInfo パーセル」 を参照 し て く だ さ い。
INOUT パ ラ メ ー タ の メ モ リ の考慮事項については、 <SQL デー タ 定義言語 > を参照
し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ の再 コ ン パ イ ル
メ ジ ャ ー ・ リ リ ース にア ッ プグ レー ド ま たは移行す る と き には、 ス ト ア ド ・ プ ロ
シージ ャ を必ず再 コ ンパ イ ルす る 必要が あ り ま す。 ス ト ア ド ・ プ ロ シージ ャ の再
コ ンパ イ ルには、 ALTER PROCEDURE 文を使用 し ます。 詳細は、 <SQL デー タ 定義
言語 > の 「ALTER PROCEDURE (SQL 形式 )」 を参照 し て く だ さ い。
120
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の再 コ ンパ イ ル
SQL プ ロ シージ ャ の AT TIME ZONE オプ シ ョ ン
SQL プ ロ シージ ャ を作成す る と 、 Teradata Database は、 そのプ ロ シージ ャ の定義 と
一緒に現在のセ ッ シ ョ ンの タ イ ム ゾーン を格納 し ます。 その結果、 そのプ ロ シー
ジ ャ に含まれてい る SQL 制御言語要素 と SQL 文を常に同 じ タ イ ム ゾーンで実行 し 、
常に一貫性のあ る 結果を生成す る こ と が可能にな り ます。 ただ し 、 プ ロ シージ ャ に
入力パ ラ メ ー タ と し て渡 さ れ る 時刻デー タ ま たは タ イ ム ス タ ン プ ・ デー タ では、
プ ロ シージ ャ の作成時の タ イ ム ゾーンではな く 、 実行時セ ッ シ ョ ンの タ イ ム ゾーン
が使用 さ れます。
AT TIME ZONE オプシ ョ ン を使用す る と 、 プ ロ シージ ャ を再 コ ンパ イ ルす る 際に
SQL プ ロ シージ ャ のすべての SQL 要素に関す る タ イ ム ゾーン を リ セ ッ ト で き ます。
その後、 Teradata Database は新 し く 指定 さ れた タ イ ム ゾーン を、 プ ロ シージ ャ の作
成時 タ イ ム ゾーン と し て格納 し ます。
AT TIME ZONE を指定で き る のは COMPILE [ONLY] オプシ ョ ン と 一緒の場合だ
けで、 COMPILE [ONLY] の後に こ のオプシ ョ ン を指定す る 必要があ り ます。 前述
以外の指定をす る と 、 Teradata Database は要求を アボー ト し 、 エ ラ ーを要求側に戻
し ます。
タ イ ムゾーン文字列の使用に関する制約
標準 Teradata Database シ ス テ ム ・ タ イ ム ゾーン文字列を使用す る と き に、 タ イ ム
ゾーン ・ ルール ( 例えば、 DST (Daylight Saving Time) シ フ ト ) は、 1986 年以前には
適用 さ れません。 Teradata Database 標準 タ イ ム ゾーン文字列の有効な年は、 1987 年
か ら 9999 年ま でです。
Teradata Database 標準 タ イ ム ゾーン文字列が要件を満た さ ない場合、 新 し い カ ス
タ ム ・ タ イ ム ゾーン文字列を追加す る こ と がで き ま す。 ま たは、 ルール を変更す
る か、 新規ルールを GetTimeZoneDisplacement に追加す る こ と に よ っ て既存の文字
列を変更す る こ と も で き ます。
注 : DST に準拠 し た ロ ケールの タ イ ム ゾーン文字列を使用 し た も のの、 タ イ ム
ゾーン ・ オ フ セ ッ ト 値が時間値に含まれない場合、 Teradata Database はあい ま いな
時間内の時間値を DST と し て解釈 し て処理す る べ き か、 ま たは標準時間 と し て解
釈 し て処理す る べ き か を判別で き ません。 こ の よ う な場合、 DisplacementOnOverlap
の DBS 制御設定値に よ っ て、 Teradata Database が こ れ ら の時間 を DST タ イ ム
ゾ ーン ・ オ フ セ ッ ト と 見なすか、 標準 タ イ ム ゾーン ・ オ フ セ ッ ト と 見なすかが決定
さ れます。
こ の問題は、 DST ロ ケールの タ イ ム ゾーン文字列が使用 さ れ る 場合、 時間値が タ イ
ム ゾーン ・ オ フ セ ッ ト 値を含ま ない場合、 お よ び TimeDateWZControl の DBS 制御
設定値が 3 に設定 ( タ イ ム ゾーン ・ オ フ セ ッ ト 情報がない日付お よ び時間の値を シ
ス テ ム ・ ロ ーカル時間を使用 し て保管 ) さ れてい る 場合のみ発生 し ます。
DisplacementOnOverlap TimeDateWZControl について、 詳細は < ユーテ ィ リ テ ィ
Vol. 1 A-K> の DBS 制御に関す る 章を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
121
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ に関す る 制約事項
ス ト ア ド ・ プ ロ シ ージ ャ に関す る 制約事項
•
ス ト ア ド ・ プ ロ シージ ャ の本体のサ イ ズは、 6.4 MB ま でに制限 さ れてい ます。
ただ し 、 ス ト ア ド ・ プ ロ シージ ャ のオブジ ェ ク ト ・ コ ー ド ( コ ンパ イ ル済みの ス
ト ア ド ・ プ ロ シージ ャ ) のサ イ ズには、 制限はあ り ません。
• ス ト ア ド ・ プ ロ シージ ャ 内の SQL 文が大 き く て複雑な場合は、 構文解析プ ロ グ
ラ ムの制限が適用 さ れます。
• 反復 も 含めた入れ子の CALL 文の数は、 15 を超え てはな り ません。
• プ ロ シージ ャ 内のパ ラ メ ー タ 数は、 256 を超え てはな り ません。
• 複数のデー タ ベース に ま たが っ て ス ト ア ド ・ プ ロ シージ ャ の名前を変更す る こ
と はで き ません。
• ANSI ト ラ ンザ ク シ ョ ン ・ モー ド で作成 さ れた ス ト ア ド ・ プ ロ シージ ャ を
Teradata ト ラ ン ザ ク シ ョ ン ・ モー ド で実行 し た り 、 その逆を行な う こ と はで き
ま せん。
ただ し 、 REPLACE PROCEDURE を使用 し て新 し いセ ッ シ ョ ンで再作成 し た後で
あれば、 その ス ト ア ド ・ プ ロ シージ ャ を実行す る こ と は可能です。 <SQL デー タ
定義言語 > を参照 し て く だ さ い。
•
ス ト ア ド ・ プ ロ シージ ャ は、 作成時のプ ラ ッ ト フ ォーム と 実行時のプ ラ ッ ト
フ ォームが異な る と 実行で き ません。
ただ し 、 こ の制約 も ま た、 ALTER PROCEDURE 文を使用 し て ス ト ア ド ・ プ ロ
シージ ャ を再 コ ンパ イ ルすれば対処で き ます。 <SQL デー タ 定義言語 > を参照 し
て く だ さ い。
• マ ク ロ 内の唯一の文が ス ト ア ド ・ プ ロ シージ ャ であ る 場合、 マ ク ロ か ら プ ロ
シージ ャ を実行で き ます。
• ス ト ア ド ・ プ ロ シージ ャ は以下をサポー ト し ません。
•
•
•
ス ト ア ド ・ プ ロ シージ ャ 内の EXPLAIN 修飾子 と USING 要求修飾子
EXECUTE マ ク ロ 文
•
ス ト ア ド ・ プ ロ シージ ャ 内の WITH 句
ス ト ア ド ・ プ ロ シージ ャ お よ びマ ク ロ は、 以下の問合わせ ロ ギ ン グ文をサポー
ト し ません。
• BEGIN QUERY LOGGING
•
END QUERY LOGGING
•
FLUSH QUERY LOGGING
•
REPLACE QUERY LOGGING
• 特定の日付形式で作成 さ れた ス ト ア ド ・ プ ロ シージ ャ では、 実行セ ッ シ ョ ンに
設定 さ れた日付形式に関係な く 、 常に同 じ 日時の形式が表示 さ れます。
• ス ト ア ド ・ プ ロ シージ ャ 内では、 キ ュ ー表形式の CREATE TABLE (<SQL デー タ
定義言語 > の 「CREATE TABLE ( キ ュ ー表形式 )」 を参照 ) を実行で き ません。
その他の形式の CREATE TABLE 文はすべて有効です。
122
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
• 行レベル ・ セキ ュ リ テ ィ (RLS) 管理のために、 ス ト ア ド ・ プ ロ シージ ャ に DDL
文 と DCL 文を定義す る こ と はで き ません。 RLS には、 セキ ュ リ テ ィ ・ ポ リ
シー、 デー タ 重要度分類、 お よ びユーザーに割 り 当て ら れてい る セキ ュ リ テ ィ ・
ク レデン シ ャ ルに基づいてデー タ ・ ア ク セ ス を制御す る 機能が備わっ てい ます。
ユーザーに上書 き 権限がない場合には、 サポー ト さ れてい る RLS 制約チ ェ ッ ク
が実行 さ れます。
• ス ト ア ド ・ プ ロ シージ ャ で CURRENT_TIME ま たは CURRENT_TIMESTAMP を
使用 し 、 DBS 制御汎用フ ィ ール ド 16 (System TimeZone Hour ) お よ び 17
(System TimeZone Minute) を手動で変更 し た場合には、 ス ト ア ド ・ プ ロ シー
ジ ャ を再 コ ンパ イ ルす る 必要があ り ます。 タ イ ム ゾーン を自動的に変更す る た
めに TimeZoneString を tdlocaledef に設定す る 必要はあ り ません。
ス ト ア ド ・ プ ロ シ ージ ャ の語彙
名前
ス ト ア ド ・ プ ロ シージ ャ の名前、 な ら びに ス ト ア ド ・ プ ロ シージ ャ ・ パ ラ メ ー タ 、
ロ ーカル変数、 ラ ベル、 FOR ループ相関名お よ び列、 カー ソ ル、 お よ び FOR ルー
プ変数は、 有効な Teradata SQL 名 ( ま たは識別子 ) でなければな り ません。
ス ト ア ド ・ プ ロ シージ ャ に名前を付け る 際には、 デー タ ベース ・ オブジ ェ ク ト の命
名に適用 さ れ る すべての規則が適用 さ れます。 <SQL 基礎 > の 「SQL の語彙」 を参
照 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ 内の各種の名前には以下の規則が適用 さ れます。
名前
固有性を求め ら れ る 場所
相関ま たは列
FOR 繰返 し 文、 ま たは DECLARE CURSOR 文。
入れ子であ る か ど う かに関係な く 、 ス ト ア ド ・ プ ロ シージ ャ 内の
FOR 文には、 同 じ 相関名ま たは列名を再使用で き ます。
相関名や列名には、 FOR 文中の FOR ループ変数やカー ソ ル名 と 同
じ 名前を使用で き ます。
カー ソ ル
入れ子の FOR 文。
カー ソ ルの名前には、 FOR 文中の FOR ループ変数や相関名ま たは
列名 と 同 じ 名前を使用す る こ と がで き ます。
DECLARE CURSOR を使用 し て定義 さ れた カー ソ ルの場合、 カー ソ
ル名は、 そのカー ソ ルが宣言 さ れ る 複合文の中で固有な も のであ る
必要があ り ます。
FOR ループ変数
入れ子の FOR 繰返 し 文。
FOR ループ変数の名前には、 FOR 文中のカー ソ ル名や相関名ま たは
列名 と 同 じ 名前を使用で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
123
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
名前
固有性を求め ら れ る 場所
ラ ベル
入れ子の繰返 し 文ま たは入れ子の BEGIN…END 文のグループ。 繰
返 し 文の ラ ベル名は、 ス ト ア ド ・ プ ロ シージ ャ 内の他の入れ子でな
い繰返 し 文の構成や、 入れ子でない BEGIN…END 文で再使用で き
ます。
ラ ベル名には専用の名前領域があ る ため、 ロ ーカル変数やパ ラ メ ー
タ に使用 さ れ る 他の識別子 と 衝突す る こ と はあ り ません。
ロ ーカル変数
その ロ ーカル変数が宣言 さ れ る BEGIN…END 複合文。
パラ メ ータ
ス ト ア ド ・ プ ロ シージ ャ 。
た と えば、 同 じ ス ト ア ド ・ プ ロ シージ ャ 内の ロ ーカル変数に対 し て
パ ラ メ ー タ 名を重複 し て使用す る こ と はで き ません。
ス ト ア ド ・ プロ
シージ ャ
デー タ ベース。 こ れは、 表、 マ ク ロ 、 ビ ュ ー、 お よ び ト リ ガーの名
前領域に帰属す る か ら です。
キーワー ド
ス ト ア ド ・ プ ロ シージ ャ では、 キーワ ー ド 内の大文字小文字を区別 し ません。 通常
は、 大文字 と 小文字の ど ち ら を使用 し て も か ま い ません。
構文 を 読みやす く す る た め、 各構文要素の間に 1 つ以上のブ ラ ン ク ・ ス ペー ス
文字を含め る こ と がで き ま す。 ただ し 、 連続す る 複数のブ ラ ン ク ・ ス ペー ス 文字
は 1 つの スペース と し て扱われます。
キーワ ー ド について、 詳細は <SQL 基礎 > を参照 し て く だ さ い。
定数
ス ト ア ド ・ プ ロ シージ ャ では、 Teradata Database がサポー ト し てい る 、 制御文を含
む SQL 文のテ キ ス ト に直接値を指定す る ための リ テ ラ ルがすべて有効です。
ロー カル変数
ス ト ア ド ・ プ ロ シージ ャ の BEGIN…END 複合文におけ る 変数の宣言文では、
Teradata Database がサポー ト し てい る すべてのデー タ ・ タ イ プの ロ ーカル変数を指
定で き ます。 「サポー ト さ れてい る デー タ ・ タ イ プ」 (128 ページ ) を参照 し て く だ
さ い。
各複合文には複数の変数の宣言を設け る こ と がで き 、 ま た、 それぞれの DECLARE
文には複数の ロ ーカル変数を含め る こ と がで き ます。
ロ ーカル変数は任意の有効なデー タ ・ タ イ プ を持つ こ と がで き ます。
制御文以外の SQL 文で ロ ー カ ル変数 を 指定す る 場合は、 接頭部 と し て コ ロ ン
文字 (:) を付け る 必要はあ り ません。 ロ ーカル変数の接頭部の コ ロ ンは引 き 続 き サ
ポー ト さ れてい ますが、 お勧めす る も のではあ り ません。
ロ ーカル変数の接頭部 と し て コ ロ ン文字を付けない場合、 変数名 と 列名を同 じ に し
ないで く だ さ い。
124
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
SQL 変数名 と 列名 と で同 じ 識別子が SQL 文に含 ま れ る 場合、 Teradata はその識別
子を列名 と 解釈 し ます。 こ れを防ぐ には、 列名 と 同 じ SQL 変数の識別子を複合文
名で修飾 し て く だ さ い。
ロ ーカル変数の名前に、 ス テー タ ス変数名 と し て予約 さ れてい る 以下の名前を使用
す る こ と はで き ません。
• SQLCODE
• SQLSTATE
• ACTIVITY_COUNT
ロ ーカル変数に DEFAULT 句が指定 さ れてい る 場合は、 こ れに定数を入れ る こ と が
で き ます。 ただ し 、 式を入れ る こ と はで き ません。
ロ ーカル変数には、 対応す る 複合文、 つ ま り その変数が宣言 さ れ る 複合文の ラ ベ
ル を付け る こ と がで き ます。 こ れは、 入れ子に さ れた複合文で ロ ーカル変数を再使
用 し た と き に混乱が生 じ ない よ う にす る のに役立ち ます。
ロ ーカル変数の使用についての詳細は、 「DECLARE」 (285 ページ ) を参照 し て く だ
さ い。
パラ メ ー タ
ス ト ア ド ・ プ ロ シージ ャ には、 Teradata Database でサポー ト さ れてい る 任意のデー
タ ・ タ イ プ と 文字セ ッ ト のパ ラ メ ー タ を最大 256 個ま で指定す る こ と がで き ます。
「サポー ト さ れてい る デー タ ・ タ イ プ」 (128 ページ ) を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ と その属性はデー タ ・ デ ィ ク シ ョ ナ リ の DBC.TVFields 表
に保管 さ れます。
制御文以外の SQL 文でパ ラ メ ータ を指定する場合は、 接頭部 と し て コ ロ ン文字 (:) を
付け る 必要はあ り ません。 パ ラ メ ー タ の接頭部 と し て コ ロ ン文字を使用す る こ と は
サポー ト さ れてい ますが、 お勧めす る も のではあ り ません。
パ ラ メ ー タ の接頭部 と し て コ ロ ン文字を付けない場合、 列名を同 じ に し ないで く だ
さ い。
SQL パ ラ メ ー タ 名 と 列名 と で同 じ 識別子が SQL 文に含まれ る 場合、 Teradata
Database はそれを列名 と 解釈 し ます。 こ れを防 ぐ には、 複合文の名前で列名を修飾
し て く だ さ い。
パ ラ メ ー タ と 同 じ 概念 ( ただ し 名前が異な る ) の説明については、 「ホ ス ト 変数」
(252 ページ ) お よ び <SQL 外部ルーチ ン ・ プ ロ グ ラ ミ ン グ > の 「USING 行記述
子」 を参照 し て く だ さ い。
次の 3 つの名前は、 ス テー タ ス変数用に予約 さ れてい る ため、 パ ラ メ ー タ には使用
で き ません。
• SQLCODE
• SQLSTATE
• ACTIVITY_COUNT
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
125
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
以下の句は、 パ ラ メ ー タ には指定で き ません。
• DEFAULT
• FORMAT
• NOT NULL
IN、 OUT、 および INOUT パラ メ ー タ の規則
パラ メ ータ
含め る こ と がで き る も の
含め る こ と がで き ない も の
IN
SQL 文の ソ ース指定
SQL 文の タ ーゲ ッ ト 指定
OUT
SQL 文の タ ーゲ ッ ト 指定
SQL 文の ソ ース指定
INOUT
SQL 文の ソ ースお よ び タ ーゲ ッ
ト 指定
—
• パ ラ メ ー タ は任意の有効なデー タ ・ タ イ プ を持つ こ と がで き ます。
• INOUT パ ラ メ ー タ は、 入力値 と 出力値の両方に使用で き ます。
•
入力値は、 ス ト ア ド ・ プ ロ シージ ャ を実行す る 際に、 INOUT パ ラ メ ー タ の引
数 と し て指定で き ます。
•
出力値は、 プ ロ シージ ャ の実行後に同 じ パ ラ メ ー タ か ら 読み取 る こ と がで き
ます。
• CREATE/REPLACE PROCEDURE の全入力お よ び全出力パ ラ メ ー タ の合計デー
タ ・ サ イ ズは、 64000 バ イ ト を超え てはな り ません。
• ス ト ア ド ・ プ ロ シージ ャ の起動時、 IN 定数には、 CALL 文でオーバー ラ イ ド さ
れない限 り 、 指定 さ れた値のデー タ ・ タ イ プが想定 さ れます。
• INOUT 定数引数のデー タ ・ タ イ プは、 定義 さ れ る デー タ ・ タ イ プではな く 、 渡
さ れ る 値のデー タ ・ タ イ プに よ っ て規制 さ れます。 渡 さ れ る 値のデー タ ・ タ イ
プが CREATE/REPLACE PROCEDURE 文で定義 さ れ る デー タ ・ タ イ プ よ り も 小
さ く 、 渡 さ れ る 値のデー タ ・ タ イ プの最大値 よ り 大 き な値を ス ト ア ド ・ プ ロ
シージ ャ が返す場合は、 シ ス テ ムはオーバーフ ロ ー ・ エ ラ ーを返 し ます。
た と えば、 INTEGER INOUT パ ラ メ ー タ を定義す る ス ト ア ド ・ プ ロ シージ ャ を考
え てみます。 SMALLINT に適合す る 定数の入力値でプ ロ シージ ャ を呼び出す場
合に、 出力値が SMALLINT の最大値であ る 32767 よ り 大 き く な る と き は、 シ ス
テ ムに よ り オーバーフ ロ ー ・ エ ラ ーが返 さ れます。
他の規則、 お よ び ス ト ア ド ・ プ ロ シージ ャ のパ ラ メ ー タ の詳細説明 と 使用例につ
い ては、 <SQL デー タ 操作言語 > の CALL 文に関す る 説明 と 、 <SQL デー タ 定義
言語 > の CREATE PROCEDURE 文に関す る 説明を参照 し て く だ さ い。
126
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
ラ ベル
ラ ベルは、 ス ト ア ド ・ プ ロ シージ ャ 内の繰返 し 文 (FOR、 LOOP、 REPEAT、 お よ び
WHILE) と BEGIN…END 複合文で使用で き ます。 次の規則が適用 さ れます。
• 先頭の ラ ベルの末尾には、 コ ロ ン文字 (:) を付け る 必要があ り ます。
• 繰返 し 文や複合文の場合、 最後の ラ ベルは必須ではあ り ません。
最後の ラ ベルを指定す る 場合、 その ラ ベルには、 その繰返 し 文ま たは
BEGIN…END 文 に 関連付 け ら れ て い る 対応す る 先頭 の ラ ベル が 必要 で す。
た と えば、 END WHILE の後に最後の ラ ベル を指定す る 場合は、 こ れに対応す
る WHILE の前に、 コ ロ ン文字の付い た同等の先頭の ラ ベルが な ければな り ま
せん。
•
ラ ベルの有効範囲は、 その ラ ベルが関連付け ら れてい る 繰返 し 文ま たは
BEGIN…END 複合文です。
つま り 、 別の繰返 し 文や複合分が入れ子にな っ てい る 場合、 外側の繰返 し 文ま
たは複合文に関連付け ら れてい る ラ ベル名を内側の繰返 し 文や複合文に使用す
る こ と はで き ない と い う こ と です。
FOR ループ変数
FOR ループ変数は、 通常、 FOR 繰返 し 文の名前 と し て用い ら れます。
FOR ループ変数は、 相関名や列名への参照を修飾す る ために使用 さ れます。 SQL
制御文を含めた SQL 文内の相関名ま たは列名の参照は、 FOR ループ変数で修飾 さ
れない と 、 パ ラ メ ー タ ま たは ロ ーカル変数 と みな さ れます。
次の規則が適用 さ れます。
• 制御文以外の SQL 文中で使用す る 場合、 FOR ループ変数には接頭部 と し て コ
ロ ン文字 (:) を付け る 必要があ り ます。
• FOR ループ変数の適用範囲は、 それが関連付け ら れてい る FOR 文に限定 さ れ
ま す。
FOR 文が入れ子にな っ てい る 場合、 外側の FOR 文に関連付け ら れた FOR ルー
プ変数は、 内側の FOR 文内の他の文か ら 参照す る こ と がで き ます。
カーソル
ス ト ア ド ・ プ ロ シージ ャ でのカー ソ ルの使用に適用 さ れ る 規則お よ び指針について
は、 第 2 章 : 「SQL カー ソ ル」 を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ 内でのカー ソ ルの使用についての詳細 と 例は、
「DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 )」 (56 ページ ) お よ び
「FOR」 (289 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
127
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
相関名 と 列名
FOR 文や DECLARE CURSOR 文のカー ソ ル指定の列には、 任意選択のキーワー ド
AS を使用 し て別名を付け る こ と がで き ます。
ANSI/ISO SQL 規格では、 別名の こ と を相関名 と いい ます。 範囲変数 と も いい ます。
次の規則が適用 さ れます。
•
カー ソ ル指定で使用 さ れ る 式には、 別名を付けなければな り ません。
• 相関名や列のデータ ・ タ イ プ ( 文字データ ・ タ イ プ CHARACTER SET 句 も 含む )
には、 カ ー ソ ル指定内の対応す る 相関名 ま た は列のデー タ ・ タ イ プ を 使用 し
ま す。
• 相関名や列は、 関連す る FOR ループ変数名で こ れを特定す る こ と に よ っ て、
FOR 繰返 し 文の本文で参照 さ れなければな り ません。 特定 さ れていない名前は、
ロ ーカル変数ま たはパ ラ メ ー タ 名 と みな さ れます。
• FOR 繰返 し 文に含まれ る 相関名ま たは列の適用範囲は、 その FOR 文の本文だけ
に限 ら れます。
FOR 文が入れ子にな っ てい る 場合、 外側の FOR 文に関連付け ら れた相関名ま た
は列は、 内側の FOR 文内の文か ら 参照す る こ と がで き ます。
•
ス ト ア ド ・ プ ロ シージ ャ では、 制御文以外の SQL 文内で使用す る 相関名や列名
の前に コ ロ ン文字 (:) をつけ る 必要があ り ます。
サポー ト さ れているデー タ ・ タ イ プ
Teradata Database でサポー ト さ れ る デー タ ・ タ イ プはすべて、 JSON デー タ ・ タ イ
プ、 UDT (VARIANT_TYPE UDT を除 く )、 BLOB、 お よ び CLOB を含め、 ス ト ア
ド ・ プ ロ シージ ャ のパ ラ メ ー タ お よ び ロ ーカル変数で使用で き ます。 JSON デー
タ ・ タ イ プについての詳細は、 <Teradata JSON> を参照 し て く だ さ い。
デー タ ・ タ イ プの詳細お よ び使用上の考慮事項については、 <SQL 基礎 > の 「SQL
の語彙」、 お よ び <SQL デー タ ・ タ イ プお よ び リ テ ラ ル > を参照 し て く だ さ い。 ス
ト ア ド ・ プ ロ シージ ャ で LOB の操作の指針については、 <SQL デー タ 定義言語 > の
「CREATE PROCEDURE ( 内部形式 )」 を参照 し て く だ さ い。
注 : ス ト ア ド ・ プ ロ シージ ャ において UDT を正 し く 操作す る には、 UDT において
必須の順序付け機能 と デー タ 変換機能が定義 さ れていなければな り ません。 ま た、
tosql お よ び fromsql 変換ルーチンが、 UDT と の間におけ る 事前定義 さ れた、 同等の
暗黙的キ ャ ス ト 定義に よ っ てバ ッ ク ア ッ プ さ れ る こ と も 必要です。 こ れを行な う 最
も 簡単な方法は、 CREATE TRANSFORM 文 と CREATE CAST 文の両方で同 じ ルー
チン を参照す る こ と です。 こ れ ら の文について、 詳細は <SQL デー タ 定義言語 > を
参照 し て く だ さ い。
DISTINCT 型 UDT の場合、 シ ス テ ム生成のデフ ォ ル ト の変換お よ び暗黙的キ ャ ス
テ ィ ン グ機能が使用で き ます。
し か し 、 STRUCTURED 型 UDT の場合は、 CREATE TRANSFORM 文お よ び
CREATE CAST 文を使用 し て、 機能を明示的に定義 し なければな り ません。
128
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
注意 :
Teradata の国際化計画に従っ て、 KANJI1 のサポー ト は保証外にな り ま し た。 こ のサ
ポー ト は、 近い将来に廃止 さ れ る 予定です。 KANJI1 はデフ ォ ル ト の文字セ ッ ト と
し て許可 さ れません。 シ ス テ ムはデフ ォ ル ト の KANJI1 文字セ ッ ト を UNICODE 文
字セ ッ ト に変更 し ます。 KANJI1 の新規オブジ ェ ク ト の作成は、 高度に制限 さ れて
い ます。 KANJI1 を使用す る 問い合わせやアプ リ ケーシ ョ ンの多 く は、 従来通 り 動
作 し ますが、 KANJI1 を使用す る サ イ ト はで き る だけ早 く 別の文字セ ッ ト に変換す
る 必要があ り ます。 詳細は、 < 国際文字セ ッ ト ・ サポー ト > の 「KANJI1 文字セ ッ
ト 」 を参照 し て く だ さ い。
TD_ANYTYPE パ ラ メ ー タ ・ デー タ ・ タ イ プは、 SQL ス ト ア ド ・ プ ロ シージ ャ では
使用で き ません。
ユーザーは、 デー タ ・ タ イ プが NUMBER の 1 つ以上のパ ラ メ ー タ / 変数が含まれ
る Teradata ス ト ア ド ・ プ ロ シージ ャ を作成で き ます。 NUMBER デー タ ・ タ イ プは、
IN、 OUT、 INOUT のいずれかのパ ラ メ ー タ を定義す る ために使用で き ます。 ま た
NUMBER デー タ ・ タ イ プ を使用 し て、 ス ト ア ド ・ プ ロ シージ ャ 本体の ロ ーカル変
数を定義す る こ と も で き ます。
ユーザー定義関数
ス ト ア ド ・ プ ロ シージ ャ の制御文、 お よ びス ト ア ド ・ プ ロ シージ ャ 内の制御文では
ない SQL 文か ら 、 UDF を呼び出す こ と がで き ます。 こ れには、 VARIANT_TYPE 入
力パ ラ メ ー タ を持つ UDF を含みます。
区切 り 記号
ス ト ア ド ・ プ ロ シージ ャ では、 ANSI お よ び Teradata Database でサポー ト さ れてい
る すべての区切 り 記号が使用で き ます。 い く つかの例を紹介 し ます。
使用す る 区
切 り 文字
名前
目的
;
セ ミ コロン
DML、 DDL、 DCL 文、 制御文、 お よ び制御の宣言を含む、
ス ト ア ド ・ プ ロ シージ ャ 本体内の各文の終わ り を示す。
セ ミ コ ロ ン文字は、 必須の文区切 り 記号です。
:
コロン
ス ト ア ド ・ プ ロ シージ ャ 内の制御文以外の SQL 文で ス
テー タ ス変数お よ び FOR ループ相関名を使用す る 場合に、
接頭部 と な る 。
複合文や繰返 し 文では、 先頭の ラ ベルの接尾部に も コ ロ ン
文字を付け る 必要があ り ます。
(
左括弧
)
右括弧
パ ラ メ ー タ や CALL 引数の リ ス ト を囲む。
ス ト ア ド ・ プ ロ シージ ャ のカ ン マ文字 (,)、 ピ リ オ ド 文字 (.)、 お よ び SQL 演算子の
よ う な他の区切 り 記号は、 Teradata SQL の他の部分での使用法 と 同 じ です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
129
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
語分離記号
ス ト ア ド ・ プ ロ シージ ャ では、 Teradata SQL でサポー ト さ れてい る すべての語分離
記号 ( コ メ ン ト 、 埋め込み文字、 お よ び改行文字 ) を使用す る こ と がで き ます。
読みやす さ を向上 さ せ る ため、 ス ト ア ド ・ プ ロ シージ ャ 本体ではな る べ く 改行文
字を使用す る 必要があ り ます。
改行文字は、 実装に よ っ て異な り ますが、 Enter キー ( 非 3270 端末の場合 ) ま たは
Return キー (3270 端末の場合 ) で入力で き ます。
ロ ッ ク 修飾子
ロ ッ ク 修飾子は、 CALL を除 き 、 ス ト ア ド ・ プ ロ シージ ャ で使用 さ れ る すべての
DML、 DDL、 お よ び DCL 文でサポー ト さ れてい ます。
結果 コ ー ド 変数
結果 コ ー ド 変数の定義 と 詳細については、 第 4 章 : 「結果 コ ー ド 変数」、 付録 C:
「SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)」 お よ び付録 D: 「SQLSTATE のマ ッ ピ ン
グ」 を参照 し て く だ さ い。
対応す る SQLSTATE コ ー ド にマ ッ プ さ れ る Teradata Database の戻 り コ ー ド の完全な
リ ス ト は、 付録 D: 「SQLSTATE のマ ッ ピ ン グ」 を参照 し て く だ さ い。
Teradata Database エ ラ ー ・ コ ー ド への SQLCODE のマ ッ ピ ン グについては、 付録 C:
「SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)」 を参照 し て く だ さ い。
ト リ ガー
ト リ ガーに よ っ て ス ト ア ド ・ プ ロ シージ ャ を呼び出す こ と がで き ますが、 以下の制
限が適用 さ れます。
•
ト リ ガーか ら 呼び出 さ れ る ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の文を使用で
き ません。
• DDL 文
•
•
DCL 文
BT (BEGIN TRANSACTION) … ET (END TRANSACTION)
•
COMMIT
•
例外処理文
•
ト リ ガーか ら 呼び出 さ れ る ス ト ア ド ・ プ ロ シージ ャ 内では、 INOUT お よ び OUT
パ ラ メ ー タ を使用で き ません。
•
ス ト ア ド ・ プ ロ シージ ャ に行を渡す こ と はで き ますが、 表を渡す こ と はで き ま
せん。
以下の有効な例では、 Sp1 と い う ス ト ア ド ・ プ ロ シージ ャ に行が渡 さ れます。
CREATE TRIGGER Trig1 AFTER INSERT ON Tab1
REFERENCING NEW AS NewRow
FOR EACH ROW
(CALL Sp1(NewRow.C1,NewRow.C2);)
130
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の語彙
以下の例では、 Sp1 と い う ス ト ア ド ・ プ ロ シージ ャ に表が渡 さ れます。 こ の操作
は無効で、 要求側に対 し てエ ラ ーが戻 さ れます。
CREATE TRIGGER Trig1 AFTER INSERT ON Tab1
REFERENCING NEW_TABLE AS NewTable
FOR EACH STATEMENT
(CALL Sp1(NewTable.c1,NewTable.C2);)
キ ュ ー表
ス ト ア ド ・ プ ロ シージ ャ はキ ュ ー表をサポー ト し ます。 <SQL デー タ 定義言語 > を
参照 し て く だ さ い。
複文要求
ス ト ア ド ・ プ ロ シージ ャ は複文要求をサポー ト し ます。 <SQL デー タ 定義言語 > の
「CREATE PROCEDURE ( 内部形式 )」 にあ る 、 「ス ト ア ド ・ プ ロ シージ ャ での SQL
複文サポー ト 」 を参照 し て く だ さ い。
コメント
ス ト ア ド ・ プ ロ シージ ャ では コ メ ン ト を使用で き ます ( 入れ子の括弧で囲まれた コ
メ ン ト を除 く )。
コ メ ン ト の ANSI/ISO SQL:2011 定義には、 Teradata Database ス タ イ ル ・ コ メ ン ト と
呼ばれ る コ メ ン ト も 含まれます。 規格に よ っ て コ メ ン ト ・ タ イ プは次の よ う に区別
さ れます。
ANSI 名
コ メ ン ト の構造
--
単純な コ メ ン ト
/* … */
括弧で囲まれた コ メ ン ト
括弧で囲まれた コ メ ン ト は ANSI/ISO SQL:2011 規格で も 定義 さ れてい ますが、
Teradata ス タ イ ル ・ コ メ ン ト と 呼ばれ る こ と も あ り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
131
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の DDL 文
ス ト ア ド ・ プ ロ シ ージ ャ の DDL 文
サポー ト さ れている DDL 文
ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の SQL DDL 文を使用で き ます。
• ALTER FUNCTION
• DROP JOIN INDEX
• ALTER TABLE
• DROP MACRO
• ALTER TRIGGER
• DROP ORDERING
• BEGIN LOGGING
• DROP PROCEDURE
• COLLECT STATISTICS
( 最適化ルーチン形式 )
• COMMENT
• DROP PROFILE
• CREATE CAST
• DROP TABLE
• CREATE DATABASE
• DROP TRANSFORM
• CREATE ERROR TABLE
• DROP TRIGGER
• CREATE HASH INDEX
• DROP USER
• CREATE INDEX
• DROP VIEW
• CREATE JOIN INDEX
• END LOGGING
• CREATE MACRO
• MODIFY DATABASE
• CREATE ORDERING
• MODIFY PROFILE
• CREATE PROFILE
• MODIFY USER
• CREATE RECURSIVE VIEW
• RENAME MACRO
• CREATE ROLE
• RENAME PROCEDURE
• CREATE TABLE
• RENAME TABLE
• CREATE TRANSFORM
• RENAME TRIGGER
• CREATE TRIGGER
• RENAME VIEW
• CREATE USER
• REPLACE CAST
• CREATE VIEW
• REPLACE FUNCTION
• DELETE DATABASE
• REPLACE MACRO
• DELETE USER
• REPLACE ORDERING
• DROP CAST
• REPLACE TRANSFORM
• DROP DATABASE
• REPLACE TRIGGER
• DROP ERROR TABLE
• REPLACE VIEW
• DROP HASH INDEX
• SET QUERY_BAND = … FOR TRANSACTION
• DROP ROLE
• DROP STATISTICS ( 最適化ルーチン形式 )
• DROP INDEX
サポー ト さ れてい る DDL 文について、 詳細は <SQL デー タ 定義言語 > を参照 し て
く だ さ い。
132
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の DDL 文
使用上の注意
文
注意
COMMENT
ス ト ア ド ・ プ ロ シージ ャ 内では DDL COMMENT 文だけ を使用で
き ます。 埋め込み SQL アプ リ ケーシ ョ ン に限定 さ れてい る DML
COMMENT 文を指定 し て、 デー タ ベース ・ オブジ ェ ク ト 、 表の
列、 お よ びパ ラ メ ー タ の コ メ ン ト を取 り 出す こ と は で き ません 。
CREATE TABLE
CREATE TABLE 文の変形はすべて有効です。
CREATE VOLATILE
TABLE
ス ト ア ド ・ プ ロ シージ ャ 内に CREATE VOLATILE TABLE 文を入
れ る と 、 ロ グ イ ン ・ デー タ ベース内に揮発表が作成 さ れます。 そ
のデー タ ベース内に同 じ 名前の付いたオブジ ェ ク ト がすでに存在
す る と 、 実行時例外が発生す る こ と にな り ます。
揮発性の表を参照す る ス ト ア ド ・ プ ロ シージ ャ 内の DML 文内に
は、 修飾子 と し てユーザーの ロ グ イ ン ・ デー タ ベース があ る か、
ま たは修飾のデー タ ベース名が皆無であ る 必要があ り ます。
CREATE
DATABASE/
CREATE USER
ス ト ア ド ・ プ ロ シージ ャ 内の CREATE DATABASE 文ま たは
CREATE USER 文には、 FROM 句が入っ ていなければな り ません。
指定 さ れたデー タ ベース は、 作成 さ れ る USER ま たは DATABASE
の直接の所有者にな り ます。
CREATE DATABASE ま たは CREATE USER が FROM 句を省略 し
た場合、 ス ト ア ド ・ プ ロ シージ ャ の作成時に コ ンパ イ ル ・ エ ラ ー
が報告 さ れ ます。 5568 - 「SQL statement is not supported within a
stored procedure」。
ス ト ア ド ・ プ ロ シージ ャ 内で、 FROM 句を使わないで動的 SQL
文 と し て CREATE USER/ DATABASE を指定す る と 、 ス ト ア ド ・
プ ロ シージ ャ を実行 し た と き に実行時例外 と し て同 じ エ ラ ーが報
告 さ れ ます。
SET QUERY_BAND
ス ト ア ド ・ プ ロ シージ ャ の SET QUERY_BAND 文は、 FOR
TRANSACTION 句 を 指定す る 必要が あ り ま す。 ク エ リ ー ・ バ ン
ド を ス ト ア ド ・ プ ロ シージ ャ 内のセ ッ シ ョ ンに設定す る こ と はで
き ません。
SET QUERY_BAND 文の ク エ リ ー ・ バン ド 指定文字列は、 IN 引数
ま たは INOUT 引数の形で ス ト ア ド ・ プ ロ シージ ャ に渡す こ と が
で き ます。
SET QUERY_BAND 文に対 し て実行 さ れ る 権限チ ェ ッ ク について
は、 「ス ト ア ド ・ プ ロ シージ ャ の権限チ ェ ッ ク 」 (116 ページ ) を参
照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
133
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の DDL 文
サポー ト さ れていない DDL 文
ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の SQL DDL 文は使用で き ません。
• ALTER METHOD
• EXPLAIN
• ALTER PROCEDURE
• HELP ( 全形式 )
• ALTER TYPE
• REPLACE METHOD
• CREATE FUNCTION
• REPLACE PROCEDURE
• CREATE METHOD
• REPLACE TYPE
• CREATE PROCEDURE
• SET QUERY_BAND = … FOR SESSION
• CREATE TABLE ( キ ュ ー表
形式 と ト レース表形式 )
• CREATE TYPE ( 全形式 )
• SET ROLE
• DATABASE
• SHOW ( 全形式 )
• SET SESSION ( 全形式 )
• SET TIME ZONE
• DROP TYPE
DDL 文に対する ト ラ ンザク シ ョ ン ・ モー ド の影響
ス ト ア ド ・ プ ロ シージ ャ に指定 し た DDL 文の実行時の動作は、 そのプ ロ シージ ャ
が作成 さ れた と き の Teradata セ ッ シ ョ ンの ト ラ ンザ ク シ ョ ン ・ モー ド に よ っ て異な
り ます。
•
ス ト ア ド ・ プ ロ シージ ャ において Teradata ト ラ ン ザ ク シ ョ ン ・ モー ド で明示的
( ユーザー定義の ) ト ラ ンザ ク シ ョ ンに指定す る DDL 文は、 その ト ラ ンザ ク
シ ョ ンの最後の文でなければな り ません。 そ う でない と 、 実行時例外
(SQLCODE: 3932、 SQLSTATE: 'T3932') が発生 し ます。
• ス ト ア ド ・ プ ロ シージ ャ を ANSI ト ラ ンザ ク シ ョ ン ・ モー ド で実行す る 場合は、
そのプ ロ シージ ャ 本体に指定 さ れてい る ど の DDL 文の後に も COMMIT WORK
文が続いていなければな り ません。 そ う でない と 、 実行時例外 (SQLCODE: 3722、
SQLSTATE: 'T3722') が発生 し ます。
134
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の DML 文
ス ト ア ド ・ プ ロ シ ージ ャ の DML 文
サポー ト さ れている DML 文
ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の SQL DML 文を使用で き ます。
• ABORT
• FETCH
• BEGIN TRANSACTION
• INSERT
• END TRANSACTION
• MERGE
• CALL
• OPEN
• CLOSE
• ROLLBACK
• COLLECT STATISTICS (QCD 形式 )
• DECLARE CURSOR ( 選択形式 )
• SELECT ( カー ソ ルの場合のみ )
• SELECT AND CONSUME TOP 1 ( 定位置カー
ソ ル内のみ )
• DELETE ( 全形式 )
• SELECT INTO
• DROP STATISTICS (QCD 形式 )
• SELECT AND CONSUME TOP 1 INTO
• COMMIT
• UPDATE ( 検索形式、 定位置形式、 お よ び
ア ッ プサー ト 形式の も のを含む )
サポー ト さ れてい る DML 文について、 詳細は <SQL デー タ 操作言語 > を参照 し て
く だ さ い。
サポー ト さ れていない DML 文
ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の SQL DML 文は使用で き ません。
• CHECKPOINT
• COLLECT DEMOGRAPHICS
SQL 文の実行の制限
CREATE/REPLACE PROCEDURE 文の SQL_data_access 句では、 ス ト ア ド ・ プ ロ
シージ ャ が SQL 文を発行で き る か ど う か、 ど の タ イ プの SQL 文が発行で き る の
か を示 し ます。 SQL_data_access 句のオプシ ョ ンは、 次の と お り です。
オプシ ョ ン
ス ト ア ド ・ プ ロ シージ ャ が実行で き る SQL 文
CONTAINS SQL
SQL 制御文。 ス ト ア ド ・ プ ロ シージ ャ か ら 、 SQL デー タ の読み
取 り 、 ま たは変更はで き ません。
READS SQL DATA
FETCH 文な ど の、 SQL デー タ を 読み取 る 文。 ス ト ア ド ・ プ ロ
シージ ャ か ら 、 SQL デー タ の変更はで き ません。
MODIFIES SQL DATA
UPDATE、 INSERT ま たは DELETE 文な ど、 ス ト ア ド ・ プ ロ シー
ジ ャ か ら 呼び出 し 可能なすべての SQL 文。 SQL_data_access 句が
CREATE/REPLACE PROCEDURE 文に含まれていない場合は、
こ れがデフ ォ ル ト にな り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
135
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の DCL 文
シ ス テ ムは、 次に示す例外を返 し ます。
オプシ ョ ン
試行内容
返 さ れ る メ ッ セージ
CONTAINS SQL
SQL デー タ の読み取 り や変更。 ま た
は、 SQL デー タ の読み取 り や変更を
試行す る プ ロ シージ ャ の呼び出 し 。
‘2F004’ reading SQLdata not permitted.
READS SQL DATA
SQL デー タ の変更。 ま たは、 SQL
デー タ の変更を試行す る プ ロ シー
ジ ャ の呼び出 し 。
‘2F002’ modifying
SQL-data not
permitted.
関連 ト ピ ッ ク
DML 文について、 詳細は <SQL デー タ 操作言語 > を参照 し て く だ さ い。
SQL_data_access 句について、 詳細は <SQL デー タ 定義言語 > の 「CREATE
PROCEDURE (SQL 形式 )/REPLACE PROCEDURE」 を参照 し て く だ さ い。
SQL_data_access 例外について、 詳細は付録 C の 「SQLCODE か ら SQLSTATE への
マ ッ プ」 を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ の DCL 文
サポー ト さ れている DCL 文
ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の SQL DCL 文を使用で き ます。
• GIVE
• GRANT ( 全形式 )
• GRANT CONNECT THROUGH
• GRANT LOGON
• REVOKE ( 全形式 )
• REVOKE CONNECT THROUGH
• REVOKE LOGON
こ れ ら の DCL 文に関す る 詳細は、 <SQL デー タ 制御言語 > を参照 し て く だ さ い。
DCL 文に対する ト ラ ンザク シ ョ ン ・ モー ド の影響
ス ト ア ド ・ プ ロ シージ ャ に指定 し た DCL 文の実行時の動作は、 そのプ ロ シージ ャ
が作成 さ れた と き の Teradata セ ッ シ ョ ンの ト ラ ンザ ク シ ョ ン ・ モー ド に よ っ て異な
り ます。
•
136
ス ト ア ド ・ プ ロ シージ ャ において Teradata ト ラ ン ザ ク シ ョ ン ・ モー ド で明示的
( ユーザー定義の ) ト ラ ンザ ク シ ョ ンに指定す る DCL 文は、 その ト ラ ンザ ク
シ ョ ンの最後の文でなければな り ません。 そ う でない と 、 実行時例外
(SQLCODE: 3932、 SQLSTATE: 'T3932') が発生 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ の診断文
•
ス ト ア ド ・ プ ロ シージ ャ を ANSI ト ラ ンザ ク シ ョ ン ・ モー ド で実行す る 場合は、
そのプ ロ シージ ャ 本体に指定 さ れてい る ど の DCL 文の後に も COMMIT WORK
文が続いていなければな り ません。 そ う でない と 、 実行時例外
(SQLCODE: 3722、 SQLSTATE: 'T3722') が発生 し ます。
ス ト ア ド ・ プ ロ シ ージ ャ の診断文
ス ト ア ド ・ プ ロ シージ ャ 内では、 以下の診断文を使用で き ます。
• GET DIAGNOSTICS
• SIGNAL
• RESIGNAL
詳細は、 「GET DIAGNOSTICS」 (243 ページ )、 「SIGNAL」 (219 ページ )、 お よ び
「RESIGNAL」 (229 ページ ) を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ での SQL 操作
以下の SQL 文は、 ス ト ア ド ・ プ ロ シージ ャ に対 し て DML、 DDL、 HELP、 お よ び
SHOW 操作を行ない ます。 こ れ ら の文のほ と ん どは、 Teradata Database ク ラ イ ア ン
ト ・ ユーテ ィ リ テ ィ ま たは イ ン タ ーフ ェース上の ど のアプ リ ケーシ ョ ンか ら で も 実
行依頼す る こ と がで き ます。
• ALTER PROCEDUREALTER PROCEDURE
• CALL
• CREATE PROCEDURE
• DROP PROCEDURE
• RENAME PROCEDURE
• REPLACE PROCEDURE
• HELP PROCEDURE
• HELP 'SPL …'
• SHOW PROCEDURE
注 : CREATE PROCEDURE と REPLACE PROCEDURE は、 BTEQ、 ODBC、 JDBC、
CLIv2 アプ リ ケーシ ョ ンお よ び Teradata SQL Assistant ユーテ ィ リ テ ィ でサポー ト さ
れてい ます。
BTEQ お よ び TeqTalk ユーテ ィ リ テ ィ か ら の CREATE/REPLACE PROCEDURE の
実行依頼は、 COMPILE コ マ ン ド に よ っ て参照 さ れ る フ ァ イ ルで行な う 必要が あ
り ま す。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
137
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ 内の制御文
ス ト ア ド ・ プ ロ シ ージ ャ 内の制御文
制御文 と 制御の宣言を使用 し て、 ス ト ア ド ・ プ ロ シージ ャ を作成で き ます。
割 り 当て、 条件付 き の実行、 ループ、 お よ び分岐の機能を制御文が SQL に与え る
こ と で、 こ の言語の計算機能が最大限に向上 し ます。
制御の宣言には、 ス ト ア ド ・ プ ロ シージ ャ の条件ハン ド ラ ー と ロ ーカル変数が含ま
れます。
ス ト ア ド ・ プ ロ シージ ャ の作成に使用する制御文 と 制御の宣言の リ ス ト は、 第 8 章 :
「SQL 制御文」 を参照 し て く だ さ い。
完了条件、 例外条件、 お よ びユーザー定義条件のハ ン ド ラ ー
ス ト ア ド ・ プ ロ シージ ャ は、 CONTINUE タ イ プ と EXIT タ イ プの完了条件、 例外条
件、 お よ びユーザー定義条件のハン ド ラ ーをサポー ト し ます。 こ れ ら には、 以下が
含まれます。
• SQLSTATE ベース の条件ハン ド ラ ー
• SQLEXCEPTION 条件のための汎用例外条件ハン ド ラ ー
• SQLWARNING 条件お よ び NOT FOUND 条件のための汎用完了条件ハン ド ラ ー
• ユーザー定義条件のための条件ハン ド ラ ー
ス ト ア ド ・ プ ロ シ ージ ャ で の条件ハ ン ド ラ ーについ て の詳細は、 第 6 章 : 「条件
処理」 を参照 し て く だ さ い。
カ ー ソ ル宣言
詳細は、 「カー ソ ル と ス ト ア ド ・ プ ロ シージ ャ 」 (25 ページ )、 「DECLARE CURSOR
( ス ト ア ド ・ プ ロ シージ ャ 形式 )」 (56 ページ )、 お よ び 「FOR」 (289 ページ ) を参照
し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ か ら の結果セ ッ ト の返送
CREATE/REPLACE PROCEDURE 文の DYNAMIC RESULT SETS 句 を 使用 し て、
最大 15 の結果セ ッ ト を ス ト ア ド ・ プ ロ シージ ャ の呼び出 し 側 ( 外部ス ト ア ド ・ プ ロ
シージ ャ ) ま たは ク ラ イ ア ン ト (BTEQ な ど のアプ リ ケーシ ョ ン ) に返す こ と がで き
ます。 こ の ス ト ア ド ・ プ ロ シージ ャ は、 複文の応答ス プール形式で結果セ ッ ト を返
し ます。
句を省略 し た場合、 ス ト ア ド ・ プ ロ シージ ャ はゼ ロ の結果セ ッ ト を想定 し ま す。
ス ト ア ド ・ プ ロ シージ ャ は結果セ ッ ト を返 さ ない可能性があ り ます。 あ る いは、
DYNAMIC RESULT SETS 句で指定 さ れた場合よ り も 少ない結果セ ッ ト を返 し ます。
138
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト の返送
こ の句は任意選択です。 ス ト ア ド ・ プ ロ シージ ャ で結果セ ッ ト を返 さ ない場合は、
こ の句を使用 し ないで く だ さ い。
外部ス ト ア ド ・ プ ロ シージ ャ での結果セ ッ ト の読み取 り については、 <SQL 外部
ルーチン ・ プ ロ グ ラ ミ ン グ > を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ の作成 と 呼び出 し 側またはク ラ イ ア ン ト への結果セ ッ ト の返送
結果セ ッ ト を返すス ト ア ド ・ プ ロ シージ ャ を作成す る には、 以下の よ う に し ます。
1
CREATE/REPLACE PROCEDURE 文で DYNAMIC RESULT SETS 句を使用し、 ス ト
ア ド ・ プ ロ シージ ャ が返す結果セ ッ ト の数を指定 し ます。 た と えば、 次に示す
文では、 1 つの結果セ ッ ト を返すス ト ア ド ・ プ ロ シージ ャ を定義 し てい ます。
CREATE PROCEDURE sp1 (IN SqlStr VARCHAR(50), IN a INT)
DYNAMIC RESULT SETS 1
2
DECLARE CURSOR 文を使用 し て、 ス ト ア ド ・ プ ロ シージ ャ が返す結果セ ッ ト
ご と の結果セ ッ ト ・ カー ソ ルを宣言 し ます。 「DECLARE CURSOR ( ス ト ア ド ・
プ ロ シージ ャ 形式 )」 (56 ページ ) を参照 し て く だ さ い。
•
•
•
•
•
ス ト ア ド ・ プ ロ シージ ャ に対 し て WITH RETURN ONLY TO CALLER ま たは
WITH RETURN ONLY を指定 し て、 対象プ ロ シージ ャ の呼び出 し 側にのみ結
果セ ッ ト ( 複数可 ) が返 さ れ る よ う に し ます。 ク ラ イ ア ン ト か ら プ ロ シー
ジ ャ を呼び出す と 、 ス ト ア ド ・ プ ロ シージ ャ は結果セ ッ ト を ク ラ イ ア ン ト ・
アプ リ ケーシ ョ ンに返 し ます。 あ る ス ト ア ド ・ プ ロ シージ ャ か ら 対象プ ロ
シージ ャ を呼び出す と 、 ス ト ア ド ・ プ ロ シージ ャ は結果セ ッ ト を呼び出 し 側
のプ ロ シージ ャ に返 し ます。 こ のプ ロ シージ ャ は、 SQL が許可 さ れた外部ス
ト ア ド ・ プ ロ シージ ャ の場合 も あ り ます。
ス ト ア ド ・ プ ロ シージ ャ に対 し て WITH RETURN TO CALLER ま たは WITH
RETURN を 指定 し て、 対象プ ロ シージ ャ の呼び出 し 側 と 対象プ ロ シージ ャ
( カー ソ ルを開いたプ ロ シージ ャ ) の両方に結果セ ッ ト ( 複数可 ) が返 さ れ る
よ う に し ます。
ス ト ア ド ・ プ ロ シージ ャ に対 し て WITH RETURN TO CLIENT を指定 し て、
ク ラ イ ア ン ト (BTEQ な ど のアプ リ ケーシ ョ ン ) と 対象プ ロ シージ ャ ( カー ソ
ルを開いたプ ロ シージ ャ ) の両方に結果セ ッ ト ( 複数可 ) が返 さ れ る よ う に
し ます。
ス ト ア ド ・ プ ロ シージ ャ に対 し て WITH RETURN ONLY TO CLIENT を指定
し て、 結果セ ッ ト がアプ リ ケーシ ョ ンにのみ返 さ れ る よ う に し ます。
結果セ ッ ト を作成す る SELECT 文が静的な場合、 その文を DECLARE
CURSOR 文の SELECT 部分に組み込みます。 た と えば、
DECLARE cur1 CURSOR WITH RETURN ONLY FOR
SELECT * FROM m1;
•
DECLARE CURSOR 文の動的形式を使用 し て結果セ ッ ト を返すには、
SELECT の代わ り に文名を使用 し ます。 た と えば、
DECLARE c1 CURSOR WITH RETURN ONLY FOR s1
3
指定 さ れた文名を準備す る には、 DECLARE CURSOR の動的形式それぞれに対
し て、 PREPARE 文を使用 し ます。 た と えば、
PREPARE s1 FROM SqlStr;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
139
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト の返送
4
OPEN 文を使用 し て、 静的ま たは動的 SELECT 文を実行す る ために、 各結果
セ ッ ト ・ カー ソ ルを開 き ます。 動的 SELECT 文でパ ラ メ ー タ ・ マーカー ( 疑問
符 ) を使用す る 場合は、 USING 句を指定 し て入力に使用す る 変数を特定 し ます。
た と えば、
OPEN c1 USING a;
USING 句に指定す る 変数の数 と 、 パ ラ メ ー タ ・ マーカーの数は、 必ず同 じ でな
ければな り ません。 注意 し て く だ さ い。
5
FETCH 文を使用 し て、 結果セ ッ ト ・ カー ソ ルの位置を決め、 結果セ ッ ト か ら 読
み込みます。
6
結果セ ッ ト を呼び出 し 側ま たは ク ラ イ ア ン ト に返すために、 結果セ ッ ト ・ カー
ソ ルは開いた ま まに し ます。 ス ト ア ド ・ プ ロ シージ ャ で結果セ ッ ト ・ カー ソ ルを
閉 じ る と 、 その結果セ ッ ト は削除 さ れ、 返 さ れな く な り ま す。 結果セ ッ ト は、
開かれた順に返 さ れます。
例1
結果セ ッ ト を返すス ト ア ド ・ プ ロ シージ ャ を作成す る ための、 DYNAMIC RESULT
SETS 句 と 静的形式の DECLARE CURSOR 文の使用例を次に示 し ます。
CREATE PROCEDURE Sample_p (INOUT c INTEGER)
DYNAMIC RESULT SETS 2
BEGIN
DECLARE cur1 CURSOR WITH RETURN ONLY FOR
SELECT * FROM m1;
DECLARE cur2 CURSOR WITH RETURN ONLY FOR
SELECT * FROM m2 WHERE m2.a > c;
SET c = c +1;
OPEN cur1;
OPEN cur2;
END;
次に、 サンプルの ス ト ア ド ・ プ ロ シージ ャ の結果セ ッ ト を、 BTEQ ( ク ラ イ ア ン ト )
が読み取 る 方法の例を示 し ます。
BTEQ -- Enter your DBC/SQL request or BTEQ command:
CALL sample_p(1);
*** Procedure has been executed.
*** Warning: 3212 The stored procedure returned one or more result sets.
*** Total elapsed time was 1 second.
1
----------2
***
***
***
***
Procedure dynamic result set. One row found. 2 columns returned.
Starting Row Number: 1
Database Name: FSK
Procedure Name: SAMPLE_P
a
b
----------- ---------------------1
2.00000000000000E 000
140
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用
***
***
***
***
Procedure dynamic result set. One row found. 2 columns returned.
Starting Row Number: 1
Database Name: FSK
Procedure Name: SAMPLE_P
a
b
----------- ---------------------2
4.00000000000000E 000
例 2 : 動的形式の DECLARE 文
次の例では、 DECLARE CURSOR 文に文名 s1 が含ま れ ます。 PREPARE 文では、
s1 を参照 し て、 CREATE PROCEDURE 文の SqlStr に含まれ る 動的 SELECT 文を
準備 し ます。 OPEN 文では、 CREATE PROCEDURE で指定 し た USING のパ ラ メ ー
タ a を使用 し て、 DECLARE CURSOR 文で指定 し た結果セ ッ ト ・ カー ソ ルの c1 を
開 き ます。
CREATE PROCEDURE sp1 (IN SqlStr VARCHAR(50), IN a INT)
DYNAMIC RESULT SETS 1
BEGIN
DECLARE c1 CURSOR WITH RETURN ONLY FOR s1;
PREPARE s1 FROM SqlStr;
OPEN c1 USING a;
END;
次に示す例は、 BTEQ か ら 入力する こ と にな る動的 SELECT 文です。 CALL 文には、
USING 句の変数 と 同 じ 数のパ ラ メ ー タ ・ マーカー を 含め る よ う に注意 し て く だ
さ い。
CALL sp1(‘sel * from tab1 where a = ? order by 1;’,1);
ス ト ア ド ・ プ ロ シ ージ ャ での動的 SQL の使用
動的 SQL は、 実行時に ス ト ア ド ・ プ ロ シージ ャ 内か ら コ ン パ イ ルお よ び実行す
る こ と に よ り 、 SQL 文 を 起動す る 手段で、 一部の例外 を 除い て、 DDL、 DML、
ま た は DCL 文 を ス ト ア ド ・ プ ロ シージ ャ 内で動的 SQL と し て起動す る こ と が
で き ま す。
動的 SQL 文
動的 SQL 文 と は、 実行ご と に要求テ キ ス ト が変わ る 可能性のあ る 文の こ と です。
こ の文に よ っ て、 ス ト ア ド ・ プ ロ シージ ャ 定義の可用性 と 簡潔性が向上 し ます。
結果セ ッ ト を返 さ ない動的 SQL の呼び出 し
結果セ ッ ト を 返 さ ない 動的 SQL は、 2 通 り の方法で ス ト ア ド ・ プ ロ シージ ャ 内か
ら 呼び出す こ と がで き ます。 こ の呼び出 し には、 次に示す文を使用 し ます。
• EXECUTE 文ま たは EXECUTE IMMEDIATE 文。
• CALL 文。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
141
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用
次に示す CALL 文を使用す る と 、 結果セ ッ ト を 返 さ ない動的 SQL を、 ス ト ア
ド ・ プ ロ シージ ャ 内でセ ッ ト ア ッ プ し て、 呼び出す こ と がで き ます。
CALL
dbc. SysExecSQL
(
string_expression
)
;
YS6Dyn01
説明
構文要素
指定内容
dbc.SysExecSQL
文字列の使用目的。
• 動的 SQL の起動
• ユーザーの権利の検証
現在のデフ ォ ル ト ・ デー タ ベース が DBC でないかぎ り 、 修飾用の
デー タ ベース名 DBC を指定 し なければな り ません。
string_expression
SQL 文を作成す る ための任意の有効な文字列式。
string_expression には、 以下を入れ る こ と がで き ます。
• 文字列 リ テ ラ ル
• ス テー タ ス変数
• ロ ーカル変数
• 入力 (IN お よ び INOUT) パ ラ メ ー タ
• FOR ループ別名
例1
次の例では、 結果セ ッ ト を返 さ ない動的 SQL 文を、 ス ト ア ド ・ プ ロ シージ ャ 内で
使用す る 方法 を 示 し て い ま す。 こ の例では、 EXECUTE IMMEDIATE 文 を 使用 し
ま す。
CREATE PROCEDURE new_sales_table (my_table VARCHAR(30),
my_database VARCHAR(30))
BEGIN
DECLARE sales_columns VARCHAR(128)
DEFAULT '(item INTEGER, price DECIMAL(8,2) ,
sold INTEGER)' ;
DECLARE sqlstr VARCHAR(500);
SET sqlstr = 'CREATE TABLE ' || my_database ||
'.' || my_table || sales_columns ;
EXECUTE IMMEDIATE sqlstr;
END;
142
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用
例2
次の例では、 結果セ ッ ト を返 さ ない動的 SQL 文を、 ス ト ア ド ・ プ ロ シージ ャ 内で
使用す る 方法を示 し てい ます。 こ の例では、 CALL 文を使用 し ます。
CREATE PROCEDURE new_sales_table (my_table VARCHAR(30),
my_database VARCHAR(30))
BEGIN
DECLARE sales_columns VARCHAR(128)
DEFAULT '(item INTEGER, price DECIMAL(8,2) ,
sold INTEGER)' ;
CALL DBC.SysExecSQL('CREATE TABLE ' || my_database ||
'.' || my_table || sales_columns) ;
END;
結果セ ッ ト を返す動的 SQL の呼び出 し
動的形式の DECLARE CURSOR ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 文を使用す る と 、
結果セ ッ ト を返す動的 SQL を、 ス ト ア ド ・ プ ロ シージ ャ 内か ら 呼び出す こ と がで
き ます。
例
以下の例は、 結果セ ッ ト を返す動的 SQL 文を、 ス ト ア ド ・ プ ロ シージ ャ 内で使用
す る 方法を示 し てい ます。 こ のプ ロ シージ ャ では WITH RETURN 文を使用 し てい
ない こ と に注意 し て く だ さ い。
CREATE PROCEDURE GetEmployeeSalary
(IN EmpName VARCHAR(100), OUT Salary DEC(10,2))
BEGIN
DECLARE SqlStr VARCHAR(1000);
DECLARE C1 CURSOR FOR S1;
SET SqlStr = 'SELECT Salary FROM EmployeeTable WHERE EmpName = ?';
PREPARE S1 FROM SqlStr;
OPEN C1 USING EmpName;
FETCH C1 INTO Salary;
CLOSE C1;
END;
動的に使用で き ない SQL 文
結果セ ッ ト を返 さ ない ス ト ア ド ・ プ ロ シージ ャ を記述す る と き には、 次に示す SQL
文を動的に使用す る こ と はで き ません。
• ALTER PROCEDURE
• CALL
• CREATE PROCEDURE
• DATABASE
• EXPLAIN
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
143
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用
• HELP ( すべての形式 )
• OPEN
• PREPARE
• REPLACE PROCEDURE
• SELECT
• SELECT … INTO
• SET ROLE
• SET SESSION ACCOUNT
• SET SESSION COLLATION
• SET SESSION DATEFORM
• SET TIME ZONE
• SHOW
• 以下を含むカー ソ ル文
• CLOSE
•
FETCH
•
OPEN
注 : 結果セ ッ ト を返すス ト ア ド ・ プ ロ シージ ャ で、 動的 SQL 文を使用す る と き に
サポー ト さ れ る SQL ス テー ト メ ン ト は、 SELECT だけです。
動的 SQL 文内で作成または参照 さ れるオブ ジ ェ ク ト の所有権
ス ト ア ド ・ プロ シージ ャ内で参照されるか、 または動的 SQL 文を使って作成されるオ
ブジ ェ ク ト に関する規則は、 他の文中で参照されるオブジ ェ ク ト の規則 と 同じ です。
「ス ト ア ド ・ プ ロ シージ ャ で作成 さ れたオブジ ェ ク ト の所有権」 (118 ページ ) を参
照 し て く だ さ い。
動的 SQL 文の使用上の規則
• 動的 SQL 文は、 コ ンパ イ ル時 ( つま り 、 ス ト ア ド ・ プ ロ シージ ャ の作成時 ) に
は検査 さ れ ま せん。 検査は、 ス ト ア ド ・ プ ロ シージ ャ の実行時にのみ行なわれ
ま す。
注 : ス ト ア ド ・ プ ロ シージ ャ の作成者が直接所有者ではな く 、 OWNER SQL
SECURITY オプシ ョ ンが指定 さ れてい る と 、 シ ス テ ムはユーザーが CREATE
OWNER PROCEDURE 権限を持っ てい る か、 そ う でなければコ ンパ イ ル ・ エ ラ ー
が報告 さ れていないか、 プ ロ シージ ャ が作成 さ れていないかを確認 し ます。
• BEGIN REQUEST…END REQUEST ブ ロ ッ ク 内の動的 SQL 要求で複文要求を指定で
き ます。 そ う し ない場合は、 ス ト ア ド ・ プ ロ シージ ャ の実行時にエ ラ ー 5568
(SQL statement is not supported within a stored procedure) が報告 さ れます。
• 動的に作成 さ れた SQL 文では、 末尾のセ ミ コ ロ ン文字は任意指定です。
144
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
再帰的ス ト ア ド ・ プ ロ シージ ャ
• 動的に構築 さ れた SQL 文では以下の こ と が可能です。
• ヌ ルの文にす る 。
•
コ メ ン ト を含め る (Teradata Database ス タ イ ル と ANSI ス タ イ ルの両方が
可能 )。
•
•
•
•
•
•
改行文字や他の埋め込み文字を含め る 。
ス ト ア ド ・ プ ロ シージ ャ 内では、 動的 SQL と し て使用で き る のは DDL
COMMENT 文だけです。 デー タ ベース ・ オブジ ェ ク ト 、 表の列、 お よ びパ ラ
メ ー タ の コ メ ン ト を取 り 出すのに DML COMMENT 文を指定す る こ と はで き ま
せん。
ス ト ア ド ・ プ ロ シージ ャ 内で動的 SQL と し て使用す る CREATE DATABASE 文
ま たは CREATE USER 文には、 FROM 句が入っ ていなければな り ません。
CALL DBC.SysExecSQL 文は、 ス ト ア ド ・ プ ロ シージ ャ 内で何回使っ て も 差 し 支
え あ り ません。 動的 SQL の文字列式では、 呼び出 し ご と に 1 つの SQL 文だけ を
指定で き ます。
各動的 SQL 要求 (string_expression) のサ イ ズは、 32000 文字 を 超え てはな り ま
せん。
CALL DBC.SysExecSQL 文を使用す る のに、 特別な権限は必要あ り ません。
再帰的ス ト ア ド ・ プ ロ シ ージ ャ
ス ト ア ド ・ プ ロ シージ ャ は、 直接ま たは間接に自身を参照す る こ と で、 再帰プ ロ
シージ ャ にな る こ と がで き ま す。 つ ま り 、 定義 し よ う と す る プ ロ シージ ャ を起動
す る CALL 文を ス ト ア ド ・ プ ロ シージ ャ 本体内に入れ る こ と がで き る と い う こ と
です。 その よ う な CALL 文を入れ子にす る こ と も で き ます。
作成 し よ う と し てい る ス ト ア ド ・ プ ロ シージ ャ が、 自身を直接参照 ま たは起動す
る と 、 SPL コ ンパ イ ル警告 ( エ ラ ーではあ り ません ) と と も にプ ロ シージ ャ が作成
さ れます。 参照 さ れ る オブジ ェ ク ト ( プ ロ シージ ャ ) は、 ま だ存在 し ていないか ら
です。
再帰の レベルに対す る 上限は特にあ り ませんが、 ス ト ア ド ・ プ ロ シージ ャ の入れ子
の限度であ る 15 回が適用 さ れます。 開かれた カー ソ ルが存在す る と 、 こ の限度は
さ ら に引 き 下げ ら れます。
相互再帰
ま た、 相互に再帰す る ス ト ア ド ・ プ ロ シージ ャ を作成す る こ と も で き ます。 それ
は、 ス ト ア ド ・ プ ロ シージ ャ 本体内で互いに起動 し あ う プ ロ シージ ャ の こ と です。
こ れは間接再帰です。 ど ち ら かのプ ロ シージ ャ の作成を試み る と 、 SPL コ ン パ イ
ル警告が報告 さ れ ま す。 こ れは、 参照 さ れてい る プ ロ シージ ャ が存在 し ないか ら
です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
145
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
再帰的ス ト ア ド ・ プ ロ シージ ャ
こ の警告が起 き ない よ う にす る には、 相手のプ ロ シージ ャ に対す る CALL 文を指定
し ないで まず一方の ス ト ア ド ・ プ ロ シージ ャ を作成し てか ら、 も う 一方の ス ト ア ド ・
プ ロ シージ ャ を作成 し 、 次に CALL の入っ た定義を備え た最初のプ ロ シージ ャ を
後のプ ロ シージ ャ に置 き 換え ます。 「例 2: 相互再帰」 (147 ページ ) を参照 し て く だ
さ い。
連鎖再帰
複数のプ ロ シージ ャ (A が B を呼び出 し 、 B が C を呼び出 し 、 そ し て C が A を呼
び出す ) を介 し た再帰連鎖にな る よ う に、 相互再帰プ ロ セ ス を拡張す る こ と がで
き ま す。
例
最初の例は、 自身を直接参照す る ス ト ア ド ・ プ ロ シージ ャ の作成を示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ は コ ンパ イ ル警告 と と も に作成 さ れます。 CALL 文で起動
さ れ る プ ロ シージ ャ は、 コ ンパ イ ル時には存在 し ていないか ら です。
2 番目の例は、 相互再帰を駆使 し 、 コ ンパ イ ル警告を出 さ ない ス ト ア ド ・ プ ロ シー
ジ ャ の作成を示 し てい ま す。 こ れは、 新規の ス ト ア ド ・ プ ロ シージ ャ の作成や、
既存のプ ロ シージ ャ のパ ラ メ ー タ の変更に便利です。
例 1 : 再帰
Employee 表が存在す る と 想定 し ます。
CREATE PROCEDURE spCall(INOUT empcode INTEGER,
INOUT basic DECIMAL (6, 2))
BEGIN
IF (empcode < 1005) THEN
SELECT empbasic INTO basic FROM Employee
WHERE empcode = empcode ;
INSERT Temptab(empcode, basic);
SET empcode = empcode + 1;
CALL spCall(empcode, basic);
END IF;
IF (empcode = 1005) THEN
SET empcode = empcode - 1;
SELECT max(empbasic) INTO basic from Temptab;
END IF;
END;
ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル時に以下の よ う な コ ンパ イ ル警告が発生 し ま
すが、 プ ロ シージ ャ spCall は正常に作成 さ れます。
SPL5000:W(L8), E(3807):Table/view/trigger/procedure ‘spCall’ does not
exist.
ス ト ア ド ・ プ ロ シージ ャ spCall を、 spCall (1001, basic (title 'maximum')); と し ては じ
めて起動 し た と 想定 し ます。
パ ラ メ ー タ empcode の引数 と し て渡 さ れ る 値 1001、 1002、 1003、 お よ び 1004 に関
し て最初の IF 文の条件が真 と 評価 さ れ る ため、 ス ト ア ド ・ プ ロ シージ ャ は自身を
4 回起動 し ます。
146
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のアーカ イ ブ、 コ ピーお よ び復元
例 2 : 相互再帰
ユーザー U1 が、 ス ト ア ド ・ プ ロ シージ ャ を作成 し よ う と し てい る と 想定 し ます。
こ の作成者は ス ト ア ド ・ プ ロ シージ ャ の直接所有者ではあ り ません。 Sp1 と Sp2 は
ど ち ら も db1 デー タ ベース内に作成 さ れ る か ら です。
1
最初の ス ト ア ド ・ プ ロ シージ ャ Sp1 を再帰の指定な し に作成 し ます。
CREATE PROCEDURE db1.Sp1(INOUT p1 INTEGER)
BEGIN
END;
2
既存の プ ロ シ ージ ャ db1.Sp1 を 参照す る 2 番目の プ ロ シ ージ ャ Sp2 を 作成 し
ま す。
CREATE PROCEDURE db1.Sp2(INOUT p1 INTEGER)
BEGIN
IF (p1 > 0) THEN
CALL db1.Sp1(p1- 1);
END IF;
END;
3
ス ト ア ド ・ プ ロ シージ ャ Sp1 を、 Sp2 を参照す る プ ロ シージ ャ に置 き 換え ます。
REPLACE PROCEDURE db1.Sp1(INOUT p1 INTEGER)
BEGIN
IF (p1 > 0) THEN
CALL db1.Sp2(p1 - 1);
END IF;
END;
ス ト ア ド ・ プ ロ シ ージ ャ のア ー カ イ ブ、 コ ピ ーお よ び復元
ARCHIVE (DUMP) 文、 COPY 文 ま たは RESTORE 文を使っ て、 ス ト ア ド ・ プ ロ
シージ ャ を個別にアーカ イ ブ、 コ ピー、 ま たは復元す る こ と がで き ます。 詳細は、
<Teradata Archive/Recovery リ フ ァ レ ン ス > を参照 し て く だ さ い。
ス ト ア ド ・ プ ロ シ ージ ャ と 戦術的問合わせ
ス ト ア ド ・ プ ロ シージ ャ は、 い く つかの戦術的な問い合わせアプ リ ケーシ ョ ンに
と っ て大 き な利点にな り ます。 こ のセ ク シ ョ ン では、 以下を提供 し ます。
• 複雑な更新を処理 し 、 ワ ー ク ロ ー ド のオーバーヘ ッ ド を減 ら し 、 セキ ュ リ テ ィ
監査を維持す る ために ス ト ア ド ・ プ ロ シージ ャ を使用す る 例。
• 異な る 戦術的問い合わせアプ リ ケーシ ョ ンでの ス ト ア ド ・ プ ロ シージ ャ の相対
効果 と マ ク ロ の相対効果の比較。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
147
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ と 戦術的問合わせ
ス ト ア ド ・ プ ロ シージ ャ を使用 し た複雑な戦術的更新の実行
戦術的問い合わせでの複雑な更新は、 逆アセ ンブル し て 1 つの ス ト ア ド ・ プ ロ シー
ジ ャ に統合す る と 、 よ り 簡単に処理 さ れ る 場合があ り ます。 ス ト ア ド ・ プ ロ シー
ジ ャ 制御文の計算を完了 し てお く こ と で、 SQL 文を反復的かつ暫定的に実行で き ま
す。 こ れに よ り 、 多 く の複雑な更新を作成す る のに必要なネ ス ト さ れた副問い合わ
せ よ り も 実行内容を明快にで き る だけでな く 、 処理 も し やす く な り ます。
た と えば、 次の複雑な更新を実行す る 場合、 ス ト ア ド ・ プ ロ シージ ャ では、 2 つの
単一 AMP 文を実行 し ます。 それぞれの文は 1 つの行のハ ッ シ ュ ・ ロ ッ ク だけに適
用 さ れます。
UPDATE orders
SET o_orderpriority = 5
WHERE o_orderkey = 39256
AND EXISTS
(SELECT * FROM lineitem
WHERE l_orderkey = o_orderkey);
次の 2 つの EXPLAIN 報告は、 逆アセ ンブル さ れた SQL 文を表わ し ます。 こ れは、
以前に記述 さ れた複雑な更新を置 き 換え る ための ス ト ア ド ・ プ ロ シージ ャ 内に作成
で き ます。
EXPLAIN
SELECT *
FROM lineitem
WHERE l_orderkey = 39256;
Explanation
-----------------------------------------------------------------------1) First, we do a single-AMP RETRIEVE step from CAB.lineitem by
way of the primary index "CAB.lineitem.L_ORDERKEY = 39256"
with no residual conditions into Spool 1, which is built locally
on that AMP. The input table will not be cached in memory, but it
is eligible for synchronized scanning. The size of Spool 1 is
estimated with high confidence to be 4 rows. The estimated time
for this step is 0.15 seconds.
-> The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.15 seconds.
最初の要求か ら 最低で も 1 つの lineitem 行が戻 さ れ る 場合にのみ、 適切な条件 ロ
ジ ッ ク を使用 し て、 プ ロ シージ ャ は 2 番目の文を実行 し ます。
EXPLAIN
UPDATE orders
SET o_orderpriority = 5
WHERE o_orderkey = 39256
Explanation
-----------------------------------------------------------------------1) First, we do a single-AMP UPDATE from CAB.orders by way of
the unique primary index "CAB.orders.O_ORDERKEY = 39256"
with no residual conditions.
こ れ ら の 2 つの文は、 ト ラ ンザ ク シ ョ ンの境界を指定す る BEGIN TRANSACTION
お よ び END TRANSACTION を使用 し て、 明示的な ト ラ ン ザ ク シ ョ ン内に コ ー
デ ィ ン グす る 必要があ り ます。
ス ト ア ド ・ プ ロ シージ ャ は、 複数行の結果セ ッ ト を返せないため、 表か ら 複数の
行を返す必要があ る 場合には、 通常はマ ク ロ を使用す る や り 方のほ う が有効です。
148
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ と 戦術的問合わせ
不必要なデー タ ベース作業を省 く ためのス ト ア ド ・ プ ロ シージ ャ の使用
2 つの検索対象にな り 得 る 表のいずれか 1 つのデー タ を使用す る アプ リ ケーシ ョ ン
があ り ますが、 まずア ク セ ス し てみない と 2 つの表の ど ち ら が必要なのか知 る こ と
がで き ない と し ます。 ス ト ア ド ・ プ ロ シージ ャ は、 問題を解決す る のに必要にな る
可能性のあ る 処理を省 く こ と がで き ます。
分か り やす く す る ため、 部品情報 owned_parts お よ び supplied_parts を含む 2 つの
表を持つデー タ ベース を考え てみます。 owned_parts が存在す る 場合にそれを戻 し 、
指定 し た基本キーの値を持つ owned_parts デー タ がない場合に supplied_parts だけ を
戻す と い う ビ ジネ ス ・ ルールがあ る と し ます。 さ ら に、 部品キーを指定す る こ と に
よ っ て部品デー タ を突 き 止め る 戦略的問い合わせ も 行な う と し ます。
図に示す よ う に、 マ ク ロ は要求ご と に両方の表にア ク セ ス し てか ら デー タ を アプ リ
ケーシ ョ ンに渡 し 、 2 つの行が戻 さ れ る と き に ど ち ら を使用す る か判別す る 必要が
あ り ます。
䜰䝥 䝸 䜿䞊䝅䝵 䞁
㻼㼍㼞㼠㼗㼑㼥䛾್䛜
Value
for Partkey
䜜䜛
isᣦᐃ䛥
passed
Data
1 or 2
㻝⾜䜎from
䛯䛿㻞⾜䛾
rows
returned
䝕䞊䝍is䛜㏉䛥
䜜䜛
䝕䞊䝍 䝧䞊䝇
㻼㻵䜰 䜽 䝉䝇
㻼㻵䜰 䜽 䝉䝇
Owned
Parts
Supplied
Parts
1101A085
問題を解決す る ス ト ア ド ・ プ ロ シージ ャ を作成す る 場合、 こ の余分な作業は不必
要にな り ます。 行が owned_parts 表で見つか っ た も のか ど う か を判別 し 、 そ う であ
れば、 supplied_parts 表にア ク セ ス せずにアプ リ ケーシ ョ ン に戻す ロ ジ ッ ク を ス ト
ア ド ・ プ ロ シージ ャ に コ ーデ ィ ン グ で き ます。 次の図は、 関係す る 処理を概観 し
た も のです。
䜰 䝥 䝸 䜿䞊䝅 䝵 䞁
Value for Partkey
㻼㼍㼞㼠㼗㼑㼥䛾್䛜
is passed
ᣦᐃ䛥 䜜䜛
䝕䞊䝍 䝧䞊䝇
Data
from only one
㻝⾜䛾䜏䛾䝕䞊䝍
row
is returned
䛜㏉䛥 䜜䜛
䝇STORED
䝖 䜰 䝗 PROCEDURE
䞉 䝥 䝻 䝅 䞊䝆 䝱
Owned
Parts
㻼㻵䜰 䜽 䝉䝇
䝠 䝑 䝖 䛧 䛺 䛡䜜䜀
㻞␒┠䛾䜰 䜽 䝉䝇 䜢
ᐇ⾜䛩䜛
Supplied
Parts
㻼㻵䜰 䜽 䝉䝇
1101A086
1101A086
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
149
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ と 戦術的問合わせ
セキ ュ リ テ ィ と 監査
「不必要 な デー タ ベー ス 作業 を 省 く た め の ス ト ア ド ・ プ ロ シ ー ジ ャ の使用」
(149 ペー ジ ) の同 じ 部品の例について考え、 選択ユーザーだけが supplied_parts 表
へのア ク セ ス を許可 さ れてい る と し ます。 以前の ス ト ア ド ・ プ ロ シージ ャ を変更す
る こ と で、 セキ ュ リ テ ィ 表に対 し てプ ロ シージ ャ を実行依頼 し たユーザーの権限を
検査す る ロ ジ ッ ク を コ ーデ ィ ン グで き ます。 プ ロ シージ ャ は、 次の図に示 さ れてい
る よ う に、 supplied_parts へのア ク セ ス が許可 さ れ る 前に権限を検査 し ますが、 ユー
ザーは自分のア ク セ ス がモニ タ ー さ れてい る こ と に気付 き ません。
䜰 䝥 䝸 䜿䞊䝅 䝵 䞁
Va lue for Pa rtkey
㻼㼍㼞㼠㼗㼑㼥䛾್䛜ᣦᐃ䛥
䜜䜛
is passed
Data from
Ow ned㻻㼣P㼚㼑㼐㻌㻼㼍㼞㼠㼟
arts is
ヱᙜ䝕䞊䝍
䛜䛒䜜䜀䚸
䛛䜙
䝕䞊䝍 䛜㏉䛥
䜜䜛 䚹 㻿㼡㼜㼜㼘㼕㼑㼐㻌㻼㼍㼞㼠㼟
returned,
if available
. D ata
䛛䜙
䛾䝕䞊䝍
䛿㏉䛥Pa
䜜䜛rts
ሙྜ䜒
from
S upplied
may㏉䛥
or 䜜䛺
䛔ሙྜ䜒
may n 䛒䜛
ot be returned
䝇Stored
䝖 䜰䝗 䞉
ST OR ED
䝥
䝻 䝅 䞊䝆 䝱
Procedure
PROCE DURE
䝕䞊䝍 䝧䞊䝇
Owned
Owned
Pa rts
Parts
Se curity
࢔ࢡࢭࢫᶒ
If y es
䜰䜽 䝉䝇ᶒ
㻌䛜䛒䜛 ሙྜ
P I a cce ss
㻼㻵䜰䜽 䝉䝇
If no t found,
c an Us er acc ess
Su ppl ied_P
arts?
䝠 䝑 䝖 䛧 䛺䛡䜜䜀䚸
ᐇ⾜䝴䞊䝄䛿
㻌㻿㼡㼜㼜㼘㼥㻌㼋 㻼㼍㼞㼠㼟⾲䛾䜰䜽 䝉䝇ᶒ㝈䛜
㻌㻌䛒䜛 䛛䜢 ☜ㄆ
S upplied
Pa rts
Supplied
Parts
1101A089
特定のユーザーだけが supplied_parts 表内の特定デー タ を表示で き 、 他のユーザは
表示で き ない こ と を検証す る ため、 同様の方法を実行で き ます。
戦術的問い合わせのためのス ト ア ド ・ プ ロ シージ ャ またはマ ク ロ
マ ク ロ は、 単純な要求、 複文要求 ( 複数の文が並行 し て実行 さ れ る )、 お よ び複数
の行を返す文に対 し て、 ス ト ア ド ・ プ ロ シージ ャ よ り も 良い選択で し た。 こ れは、
ほ と ん ど の場合、 マ ク ロ の方のパフ ォーマ ン ス が優れていたいか ら です。 現在で
は、 ス ト ア ド ・ プ ロ シージ ャ も 複文要求 と 結果セ ッ ト 、 お よ びそれ ら の条件 ロ ジ ッ
ク をサポー ト し てい ます。 こ のため、 戦術的問い合わせを実行す る ために、 マ ク ロ
よ り も 良い選択にな り ま し た。
単純な要求
簡単な要求の場合で も 、 ス ト ア ド ・ プ ロ シージ ャ はマ ク ロ よ り も 効率 よ く 実行す る
場合があ り ます。 簡単な要求を実行す る 場合には、 マ ク ロ と ス ト ア ド ・ プ ロ シー
ジ ャ の ど ち ら か を使用で き ます。
複文要求
マ ク ロ と ス ト ア ド ・ プ ロ シージ ャ は、 ど ち ら も 複文要求を サポー ト し てい ま す。
ス ト ア ド ・ プ ロ シージ ャ の複文要求のパフ ォーマ ン ス は、 マ ク ロ 以上でない場合、
マ ク ロ のパフ ォーマ ン ス と 同 じ にな り ます。
150
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のデバ ッ グ
複数の行を返す文
現在ス ト ア ド ・ プ ロ シージ ャ は結果セ ッ ト をサポー ト し てい ます。 こ れは、 ス ト ア
ド ・ プ ロ シージ ャ が複数の行を返す こ と がで き る 、 と い う こ と です。 複数の行を返
す と い う 点において、 マ ク ロ に ス ト ア ド ・ プ ロ シージ ャ を超え る よ う な長所はあ り
ません。
マ ク ロ と ス ト ア ド ・ プ ロ シージ ャの相違
次の表は、 マ ク ロ と ス ト ア ド ・ プ ロ シージ ャ の違いを要約 し てい ます。
マク ロ
ス ト ア ド ・ プ ロ シージ ャ
手続 き ロ ジ ッ ク が限定 さ れて
いる。
手続 き ロ ジ ッ ク が洗練 さ れてい る 。
同 じ 要求に複数行の結果セ ッ
ト を返す こ と がで き る 。
DYNAMIC RESULT SETS を使用す る と 、 ス ト ア ド ・ プ ロ
シージ ャ は最大 15 の結果セ ッ ト を返せ る よ う にな り ま
す。 詳細は、 「ス ト ア ド ・ プ ロ シージ ャ か ら の結果セ ッ ト
の返送」 (138 ページ ) お よ び 「DECLARE CURSOR ( ス ト
ア ド ・ プ ロ シージ ャ 形式 )」 (56 ページ ) を参照 し て く だ
さ い。
複文要求は複数の単一行文を
並列化す る 。
BEGIN REQUEST - END REQUEST 文を使用す る 複文要
求は、 複数の単一行 DML 文を並列化す る 。
マ ク ロ ・ テ キ ス ト はデ ィ ク
シ ョ ナ リ に保管 さ れ る 。
ス ト ア ド ・ プ ロ シージ ャ はユーザー ・ デー タ ベース に保
管される。
マ ク ロ を EXPLAIN で き る 。
ス ト ア ド ・ プ ロ シージ ャ は EXPLAIN で き ない。 代わ り
に、 個々の ス ト ア ド ・ プ ロ シージ ャ SQL 文を個別に
EXPLAIN す る 必要があ る 。
ト リ ガーで起動で き る 。
ト リ ガーで起動で き る 。
ス ト ア ド ・ プ ロ シ ージ ャ のデバ ッ グ
こ の項では、 ス ト ア ド ・ プ ロ シージ ャ ・ ベース のアプ リ ケーシ ョ ン をデバ ッ グす る
場合の指針を解説 し ます。
以下に示す活動はデバ ッ グ ・ ツール と し て機能 し ます。
• SQL INSERT 文
• 情報を記録す る ための特別な ス ト ア ド ・ プ ロ シージ ャ
完璧な方法 と い う も のはあ り ませんが、 こ れ ら デバ ッ グお よ びテ ス ト 技法はバグ を
最小限にす る のに役立ち ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
151
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のデバ ッ グ
デバ ッ グ方法の比較
以下の表は、 こ れ ら 2 つの方法の長所 と 短所を説明 し てい ます。 こ れ ら の方法は、
実際の要件に基づいて評価 し て く だ さ い。
方法
長所
短所
INSERT 文
ロ グ項目を ユーザー定義 ロ グ表に挿入す
る こ と がで き 、 ス ト ア ド ・ プ ロ シージ ャ
の実行後に ロ グ表を問い合わせ る こ と に
よ っ て結果を参照す る こ と がで き ます。
デバ ッ グの後で、 ス ト ア ド ・ プ ロ シージ ャ 本
体内の 1 つ以上の INSERT 文を使用不能にす
る か ま たは除去 し てか ら 、 プ ロ シージ ャ を再
コ ンパ イ ルす る 必要があ り ます。
デバ ッ グ ・ ス ト
ア ド ・ プ ロ シー
ジャ
標準的なプ ロ シージ ャ を定義 し て ス ト
ア ド ・ プ ロ シージ ャ をデバ ッ グ し ます。
デバ ッ グの後で、 ス ト ア ド ・ プ ロ シージ ャ
本体内の 1 つ以上の CALL 文を使用不能にす
る か ま たは除去 し てか ら 、 プ ロ シージ ャ を再
コ ンパ イ ルす る 必要があ り ます。
デバ ッ グでの INSERT 文の使用
ス ト ア ド ・ プ ロ シージ ャ では INSERT 文を使用 し て、 任意の表に任意の値 ま たは
テ キ ス ト を挿入で き ま す。 以下に示す ス ト ア ド ・ プ ロ シージ ャ の定義を考え て く
だ さ い。
REPLACE PROCEDURE spRow (OUT pRowCount INTEGER)
BEGIN
DECLARE EXIT HANDLER
FOR SQLEXCEPTION
BEGIN
INSERT ErrorLogTable (’spRow’, :SQLSTATE, :SQLCODE);
END;
SET pRowCount = 0;
FOR vFor AS cName CURSOR FOR
SELECT c1 as a, c2 * 10 as b
FROM ValueTable
DO
SET pRowCount = pRowCount + 1;
INSERT LogTable (pRowCount, vFor.a, vFor.b);
...
...
...
END FOR;
END;
ス ト ア ド ・ プ ロ シージ ャ を実行す る と 、 カー ソ ルか ら 取 り 出 さ れ る 各行ご と に、
FOR 文内に指定 し た INSERT 文が実行 さ れます。 それに よ っ て、 ValueTable 表の行
カ ウ ン ト 、 列 c1、 お よ び列 c2 の値が挿入 さ れます。
ス ト ア ド ・ プ ロ シージ ャ の実行中に例外条件ま たは完了条件が生 じ た ら 、 宣言 さ れ
てい る 汎用の条件ハン ド ラ ーを使っ て処理 さ れ る 場合、 そのハン ド ラ ー内に指定 さ
れてい る INSERT 文が実行 さ れます。 その よ う な INSERT 文は、 ス ト ア ド ・ プ ロ
シージ ャ 名、 お よ び SQLCODE と SQLSTATE ス テー タ ス変数の値を ErrorLogTable
に挿入 し ます。 こ の表を問い合わせれば、 ス ト ア ド ・ プ ロ シージ ャ の実行中に例外
があ っ たか ど う か を確かめ る こ と がで き ます。
152
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のデバ ッ グ
デバ ッ グ ・ ス ト ア ド ・ プ ロ シージ ャ の使用
ユーザー ID な ど を使用 し て標準 ロ グ表に任意の生成テ キ ス ト を記録す る 、 サ イ ト
固有ま たはアプ リ ケーシ ョ ン固有の ス ト ア ド ・ プ ロ シージ ャ を作成で き ます。 以下
に示すス ト ア ド ・ プ ロ シージ ャ の定義を考え て く だ さ い。
CREATE PROCEDURE LogDatabase.spDebug (IN spName CHAR(30), IN Text
CHAR(255))
BEGIN
-- Exit in case of any exception.
DECLARE EXIT HANDLER
FOR SQLEXCEPTION
BEGIN
INSERT ErrorLogTable (spName, :SQLSTATE,
:SQLCODE);
END;
-- Log the text in the DebugTable.
INSERT INTO LogDatabase.DebugTable(spName,
USER, CURRENT_DATE, CURRENT_TIME, Text)
END;
spDebug プ ロ シージ ャ は、 事前に定義 さ れてい る デー タ ベース LogDatabase 内に作
成 さ れます。 こ のプ ロ シージ ャ は、 既存の DebugTable 表に行を挿入し ます。 そ し て、
2 つの入力引数 ( ス ト ア ド ・ プ ロ シージ ャ 名 と 記録 さ れ る テ キ ス ト ) を受け入れま
す。 呼び出 し 側が他の ど の ス ト ア ド ・ プ ロ シージ ャ で も こ れを使 う には、 ス ト ア
ド ・ プ ロ シージ ャ での EXECUTE PROCEDURE 権限が必要です。
以下に示すス ト ア ド ・ プ ロ シージ ャ は LogDatabase.spDebug を呼び出 し ます。
CREATE PROCEDURE spRow (OUT pRowCount INTEGER)
BEGIN
DECLARE ErrorText CHAR(255) DEFAULT NULL:
DECLARE EXIT HANDLER
FOR SQLEXCEPTION
BEGIN
SET ErrorText = ’In exception handler ...’||
SQLCODE || ’ SQLSTATE:’ ||
SQLSTATE;
CALL LogDatabase.spDebug (’spRow’, ErrorText);
END;
SET pRowCount = 0
FOR vFor AS cName CURSOR FOR
SELECT c1 as a, c2 * 10 as b
FROM ValueTable
DO
SET pRowCount = pRowCount + 1;
SET ErrorText = ’RowCount:’ || pRowCount ||
’Values:’ || vFor.a || ’ ’ || vFor.b;
CALL LogDatabase.spDebug (’spRow’, ErrorText);
...
...
...
END FOR;
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
’SQLCODE:’ ||
153
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のサン プル
ス ト ア ド ・ プ ロ シ ージ ャ のサン プル
こ の項では、 Teradata Database ス ト ア ド ・ プ ロ シージ ャ のほ と ん ど の機能を使用す
る 、 ス ト ア ド ・ プ ロ シージ ャ のサンプルを紹介 し ます。 こ の ス ト ア ド ・ プ ロ シー
ジ ャ のサンプルは、 実際の使用にお勧めす る も のではあ り ません。
ス ト ア ド ・ プ ロ シージ ャ のサンプルには、 複数のパ ラ メ ー タ 、 ロ ーカル変数宣言、
カー ソ ル (FOR カー ソ ルお よ びカー ソ ル宣言 )、 条件ハン ド ラ ー、 入れ子の複合文、
制御文、 DML 文、 お よ び ANSI ス タ イ ルの コ メ ン ト が含まれてい ます。
前提条件
• ユーザーは現行のデフ ォ ル ト ・ デー タ ベース に対 し て CREATE PROCEDURE 権
限を持っ てい る 。
• こ の プ ロ シー ジ ャ は、 ユーザーが所有す る デー タ ベー ス で作成 さ れ る た め、
作成者 も プ ロ シージ ャ の直接所有者 と な る 。
• 表 tBranch、 tAccounts、 tDummy、 tDummy1、 お よ び Proc_Error_Tbl が現在のデ
フ ォ ル ト ・ デー タ ベース に存在す る 。
• 現行の表に、 ス ト ア ド ・ プ ロ シージ ャ GetNextBranchId も あ る 。
• 新 し い ス ト ア ド ・ プ ロ シージ ャ は支店につ き 1000 口座 し かサポー ト し ない。
表定義の例
次の CREATE TABLE 文は、 ス ト ア ド ・ プ ロ シージ ャ のサンプルで使用 さ れてい る
2 つの重要な表 tAccounts お よ び Proc_Error_Tbl を定義 し ます。 ス ト ア ド ・ プ ロ シー
ジ ャ 本体で参照 さ れてい る すべての表お よ びス ト ア ド ・ プ ロ シージ ャ も 作成す る 必
要があ り ます。
こ の DDL では、 口座表を次の よ う に定義 し てい ます。
CREATE MULTISET TABLE sampleDb.tAccounts, NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL
(
BranchId INTEGER,
AccountCode INTEGER,
Balance DECIMAL(10,2),
AccountNumber INTEGER,
Interest DECIMAL(10,2))
PRIMARY INDEX (AccountNumber) ;
こ の DDL では、 エ ラ ー表を次の よ う に定義 し てい ます。
CREATE MULTISET TABLE sampleDb.Proc_Error_Tbl ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL
(
sql_state CHAR(5) CHARACTER SET LATIN CASESPECIFIC,
time_stamp TIMESTAMP(6),
Add_branch CHAR(15) CHARACTER SET LATIN CASESPECIFIC,
msg VARCHAR(40) CHARACTER SET LATIN CASESPECIFIC)
PRIMARY INDEX ( sql_state );
154
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のサ ンプル
ス ト ア ド ・ プ ロ シージ ャ の定義
以下の CREATE PROCEDURE 文は、 サ ン プルの ス ト ア ド ・ プ ロ シージ ャ を作成 し
ま す。 こ の定義は、 ス ト ア ド ・ プ ロ シージ ャ の 「 ソ ー ス ・ テ キ ス ト 」 と も 呼ばれ
ま す。
こ の CREATE PROCEDURE 文に よ り 、 銀行の内部機能をサポー ト す る AddBranch
と い う プ ロ シージ ャ が作成 さ れます。
• 新 し い支店の詳細を取 り 込んで、 tBranch 表に追加す る 。
• 新 し い支店に BranchId を割 り 当て る 。
• 支店の新 し い口座の詳細を tAccounts 表に追加す る 。
• 新 し い支店の tAccounts 表に載っ てい る 口座の預金残高 と 利息を更新す る 。
CREATE PROCEDURE AddBranch
OUT
IN
IN
IN
IN
IN
IN
)
Lmain: BEGIN
-- Lmain is the label
(
oBranchId INTEGER,
iBranchName CHAR(15),
iBankCode INTEGER,
iStreet VARCHAR(30),
iCity VARCHAR(30),
iState VARCHAR(30),
iZip INTEGER
for the main compound statement
-- Local variable declarations follow
DECLARE hMessage CHAR(50) DEFAULT
’Error: Database Operation ...’;
DECLARE hNextBranchId INTEGER;
DECLARE hAccountNumber INTEGER DEFAULT 10;
DECLARE hBalance INTEGER;
-- Condition Handler Declarations
DECLARE CONTINUE HANDLER FOR SQLSTATE ’21000’
-- Label compoun statements within handlers as HCS1 etc.
HCS1: BEGIN
INSERT INTO Proc_Error_Tbl
(:SQLSTATE, CURRENT_TIMESTAMP, ’AddBranch’, hMessage);
END HCS1;
DECLARE CONTINUE HANDLER FOR SQLSTATE ’42000’
HCS2: BEGIN
SET hMessage = ’Table Not Found ... ’;
INSERT INTO Proc_Error_Tbl
(:SQLSTATE, CURRENT_TIMESTAMP, ’AddBranch’, hMessage);
END HCS2;
-- Get next branch-id from tBranchId table
CALL GetNextBranchId
hNextBranchId);
-- Add new branch to tBranch table
INSERT INTO tBranch ( BranchId, BankId, BranchName, Street,
City, State, Zip)
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
155
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のサン プル
VALUES ( hNextBranchId, iBankId, iBranchName, iStreet,
iCity, iState, iZip);
-- Assign branch number to the output parameter;
-- the value is returned to the calling procedure
SET oBranchId = hNextBranchId;
-- Insert the branch number and name in tDummy table
INSERT INTO tDummy VALUES(hNextBranchId, iBranchName);
-- Insert account numbers pertaining to the current branch
SELECT max(AccountNumber) INTO hAccountNumber FROM tAccounts;
WHILE (hAccountNumber <= 1000) DO
INSERT INTO tAccounts (BranchId, AccountNumber)
VALUES ( hNextBranchId, hAccountNumber);
-- Advance to next account number
SET hAccountNumber = hAccountNumber + 1;
END WHILE;
-- Update balance in each account of the current branch-id
SET hAccountNumber = 1;
L1: LOOP
UPDATE tAccounts SET Balance = 100000
WHERE BranchId = hNextBranchId AND
AccountNumber = hAccountNumber;
-- Generate account number
SET hAccountNumber = hAccountNumber + 1;
-- Check if through with all the accounts
IF (hAccountNumber > 1000) THEN
LEAVE L1;
END IF;
END LOOP L1;
-- Update Interest for each account of the current branch-id
FOR fAccount AS cAccount CURSOR FOR
-- since Account is a reserved word
SELECT Balance AS aBalance FROM tAccounts
WHERE BranchId = hNextBranchId
DO
-- Update interest for each account
UPDATE tAccounts SET Interest = fAccount.aBalance * 0.10
WHERE CURRENT OF cAccount;
END FOR;
-- Inner nested compound statement begins
Lnest: BEGIN
-- local variable declarations in inner compound statement
DECLARE Account_Number, counter INTEGER;
DECLARE Acc_Balance DECIMAL (10,2);
-- cursor declaration in inner compound statement
DECLARE acc_cur CURSOR FOR
156
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のサ ンプル
SELECT AccountCode, Balance FROM tAccounts
ORDER BY AccountNumber;
-- condition handler declarations in inner compound statement
DECLARE CONTINUE HANDLER FOR NOT FOUND
HCS3: BEGIN
DECLARE h_Message VARCHAR(50);
DECLARE EXIT HANDLER FOR SQLWARNING
HCS4: BEGIN
SET h_Message = 'Requested sample is larger
than table rows';
INSERT INTO Proc_Error_Tbl (:SQLSTATE,
CURRENT_TIMESTAMP, 'AddBranch', h_Message);
END HCS4;
SET h_Message = 'Data not Found ...';
INSERT INTO Proc_Error_Tbl (:SQLSTATE,
CURRENT_TIMESTAMP, 'AddBranch', h_Message);
SELECT COUNT(*) INTO :counter FROM Proc_Error_Tbl
SAMPLE 10;
-- Raises a warning. This is a condition raised by
-- a handler action statement. This is handled.
END HCS3;
DELETE FROM tDummy1;
-- Raises “no data found” warning
OPEN acc_cur;
L2: REPEAT
BEGIN
FETCH acc_cur INTO Account_code, Acc_Balance;
CASE
WHEN (Account_code <= 1000) THEN
INSERT INTO dummy1 (Account_code, Acc_Balance);
ELSE
LEAVE L3;
END CASE;
END;
UNTIL (SQLCODE = 0)
END REPEAT L2;
CLOSE acc_cur;
END Lnest; --- end of inner nested block.
END Lmain; -- This comment is part of stored procedure body
-- End-of-Create-Procedure.
入力フ ァ イルから のプ ロ シージ ャ のコ ンパイル
BTEQ で COMPILE コ マ ン ド を使用 し て ス ト ア ド ・ プ ロ シージ ャ AddBranch を作成
す る 場合、 入力フ ァ イ ル内の ス ト ア ド ・ プ ロ シージ ャ の定義全体を実行す る 必要が
あ り ます。
こ のプ ロ シージ ャ は、 ス ト ア ド ・ プ ロ シージ ャ 本体で参照 さ れ る いずれかのデー タ
ベース ・ オブジ ェ ク ト が欠落 し てい る か削除 さ れ る 場合、 コ ンパ イ ル さ れてい く ら
かの警告が発生 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
157
第 5 章 : SQL ス ト ア ド ・ プ ロ シージ ャ
ス ト ア ド ・ プ ロ シージ ャ のサン プル
カー ソ ル SELECT 文で参照 さ れてい る 、 なん ら かのデー タ ベース ・ オブジ ェ ク ト が
欠落 し てい る 場合、 コ ンパ イ ルがエ ラ ーにな り 、 ス ト ア ド ・ プ ロ シージ ャ は作成 さ
れません。
CLIv2、 ODBC、 ま たは JDBC か ら CREATE PROCEDURE が実行 さ れ る と 、 Teradata
Database 内の SPL コ ンパ イ ラ が ス ト ア ド ・ プ ロ シージ ャ を コ ンパ イ ル し ます。
158
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第6章:
条件処理
こ の章では、 ス ト ア ド ・ プ ロ シージ ャ に完了、 例外、 お よ び警告条件を手順どお り
に処理 さ せ る 、 SQL ス ト ア ド ・ プ ロ シージ ャ 文について説明 し ます。 こ の章では、
ま ず ス ト ア ド ・ プ ロ シージ ャ の条件について説明 し 、 次いで さ ま ざ ま な タ イ プの
条件処理文を個別に説明 し ます。
条件処理の利点
• CALL を使用 し て ( ス ト ア ド ・ プ ロ シージ ャ を起動 し ) エ ラ ー ・ コ ー ド を モ
ジ ュ ール化す る こ と に よ っ て 、 ア プ リ ケ ー シ ョ ン の エ ラ ー処理 コ ー ド を 削
減す る 。
• アプ リ ケーシ ョ ンに影響を及ぼす こ と な く 、 アプ リ ケーシ ョ ンの例外を検出し て、
同 じ 実行中にそれ ら を解決す る 。
• ほ と ん ど の例外 ( 処理 さ れなければ、 ス ト ア ド ・ プ ロ シージ ャ は終了す る ) を処
理す る こ と に よ っ て、 ス ト ア ド ・ プ ロ シージ ャ の実行を続行で き る 。
• さ ま ざ ま な条件のための さ ま ざ ま処理 メ カ ニズ ム を提供す る 。
条件処理の用語
用語
完了条件
定義
制御文な ど の SQL 文の実行が致命的な イ ベン ト を伴わずに完了 し 、
Teradata Database か ら 成功 ま たは警告付 き の OK を 示す応答が返 さ れた
状態。
要求が完了 ( 正常な完了以外 ) す る と 、 SQLCODE には戻 り コ ー ド ( 警告
コ ー ド ) が返 さ れ、 SQLSTATE には完了条件を表わす '00000' 以外の値が
設定 さ れ、 ACTIVITY_COUNT には SQL 文に応 じ て 「0」 ま たはゼ ロ 以外
の値が設定 さ れます。
完了条件の例
• 制御文を含む SQL 文が実行 さ れ、 警告が発生 し た場合。
• UPDATE 文ま たは DELETE 文に よ っ て影響を受けた行はゼ ロ の場合。
• SELECT INTO 文に よ っ てゼ ロ の行が返 さ れた場合。
• カー ソ ルの取 り 出 し でデー タ が見つか ら なか っ た場合。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
159
第 6 章 : 条件処理
条件処理の用語
用語
条件
定義
制御文な ど の SQL 文の実行に よ っ て生 じ る エ ラ ーや通知の状態。
例外の条件や完了の条件は、 制御文な ど の SQL 文の実行に関連 し た ス
テー タ ス変数 (SQLSTATE、 SQLCODE、 お よ び ACTIVITY_COUNT) に情
報を提供す る ために出 さ れ ます。
条件ハン ド
ラー
アプ リ ケーシ ョ ン に返 さ れ る SQLSTATE の値、 ま たは、 ハン ド ラ ー宣言
の condition_name で指定 さ れた条件に応 じ て 1 つ以上のア ク シ ョ ン を実行
す る よ う に定義 さ れた構成。
ハン ド ラ ーは まず、 扱 う 条件を 1 つま たは複数定義 し 、 次いでそれに関連
付け る ア ク シ ョ ン を定義 し ます。 ア ク シ ョ ンは、 ス ト ア ド ・ プ ロ シージ ャ
の実行において該当す る 条件が発生す る と 実行 さ れ ます。
例外の条件が発生 し た と き に、 ス ト ア ド ・ プ ロ シージ ャ に ど の SQLSTATE
コ ー ド が返 さ れて も か ま わな ければ、 特定の SQLSTATE コ ー ド を 1 つ ま
たは複数指定す る 代わ り に キー ワ ー ド SQLEXCEPTION を指定す る こ と
がで き ま す。 SQLEXCEPTION は、 汎用例外条件ハ ン ド ラ ー と し て扱わ
れ ま す。
条件名
DECLARE CONDITION 文で SQLSTATE コ ー ド と 関連付け ら れ る ニーモ
ニ ッ ク ( 略号 ) 名。 SQLSTATE 値を条件名に関連付けない と 、 SQLSTATE
値を使用 し てユーザー定義条件を表わ し ます。
条件名は、 処理 さ れ る 条件を識別 し 、 条件宣言、 処理宣言、 SIGNAL 文お
よ び RESIGNAL 文でのみ使用 さ れ ます。
条件の値
5 文字の文字列 リ テ ラ ルに よ る SQLSTATE 値。
SQLSTATE 変数の定義については、 「SQLSTATE」 (105 ページ ) を参照 し
て く だ さ い。
例外条件
SQL 文や制御文の実行に失敗 し た状態。 Teradata Database の応答は、
ERROR ま たは FAILURE を示 し ます。
例外条件が処理 さ れ る と 、 SQLCODE は戻 り コ ー ド を反映 し 、 SQLSTATE
には例外条件を表わす '00000' 以外の値が設定 さ れ、 ACTIVITY_COUNT
は 「0」 に設定 さ れ ます。
例外条件の例
• カー ソ ルの状態が無効な場合
• ゼ ロ 除算の違反
• 文字列が切 り 捨て ら れた場合 (ANSI セ ッ シ ョ ン ・ モー ド の場合のみ )
• 基数違反
汎用条件
ハン ド ラ ー
一般条件 を 処理す る と 宣言 さ れ た ハ ン ド ラ ー。 キ ー ワ ー ド
SQLEXCEPTION、 SQLWARNING、 ま たは NOT FOUND で表わ さ れます。
こ のキー ワー ド は、 1 つ以上の個別の SQLSTATE コ ー ド の代わ り に宣言 さ
れ ます。
SQLEXCEPTION は、 すべての例外条件を表わ し ます。
SQLWARNING は、 正常完了 と 「no data found」 完了条件を除 く すべての
完了条件を表わ し ます。
NOT FOUND は、 すべての 「no data found」 完了条件を表わ し ます。
160
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
SQLSTATE
用語
定義
正常な完了
SQL 文の実行に対する Teradata Database の応答が成功ま たは 「ok」 を示 し 、
警告や他の非致命的な イ ベン ト が発生 し ない状態。
要求が正常に完了す る と 、 SQLSTATE は '00000' に設定 さ れ、 SQLCODE
は 「0」 に、 ACTIVITY_COUNT は SQL 文に応 じ て 「0」 ま たはゼ ロ 以外
の値に設定 さ れ ます。 制御文の場合には、 ス テー タ ス変数の値は変化 し ま
せん。
ユーザー定
義条件
状況を処理す る ために、 ス ト ア ド ・ プ ロ シージ ャ 固有で SQLSTATE 値で
は表わ さ れない、 ユーザーに よ っ て定義 さ れた条件。
ユーザー定義条件の宣言については、 「DECLARE CONDITION」 (187 ペー
ジ ) を参照 し て く だ さ い。
SQLSTATE
SQLSTATE は、 SQL の例外お よ び完了条件が通知 さ れ る ス テー タ ス変数です。
SQLSTATE は埋め込み SQL アプ リ ケーシ ョ ン と ス ト ア ド ・ プ ロ シージ ャ の両方で
使用 さ れ、 文の実行の ス テー タ ス を反映 し ます。
SQLSTATE コ ー ド は、 正常な完了、 完了条件、 お よ び例外 ( エ ラ ー ま たは失敗 )
条件を表わ し ます。 すべての例外の SQLSTATE 値を表わす、 キーワ ー ド
SQLEXCEPTION を使用す る こ と も で き ます。
SQLSTATE についての詳細は、 「SQLSTATE」 (105 ページ ) を参照 し て く だ さ い。
SQLSTATE コ ー ド と その Teradata Database エ ラ ー ・ コ ー ド へのマ ッ プについては、
付録 D: 「SQLSTATE のマ ッ ピ ン グ」 で説明 し てい ます。
診断域
診断域には、 ス ト ア ド ・ プ ロ シージ ャ 内の文の実行ス テー タ ス に関す る 詳細な情
報が含 ま れてい ます。 1 つの ス テー ト メ ン ト ( 文 ) 域 と 、 条件域 ( な し ま たは 1 つ
以上 ) に分割 さ れます。 ス テー ト メ ン ト ( 文 ) 域には、 ス ト ア ド ・ プ ロ シージ ャ 内
の文の実行に関す る 情報が含まれてい ます。 条件域には、 文の実行結果に よ る 成功
条件、 完了条件、 ま たは例外条件に関す る 情報が含まれてい ます。
GET DIAGNOSTICS 文を使用 し て、 診断域か ら 成功条件、 例外条件、 完了条件に関
す る 情報を取得で き ます。
詳細は、 「診断域」 (213 ページ ) お よ び 「GET DIAGNOSTICS」 (243 ページ ) を参照
し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
161
第 6 章 : 条件処理
条件 と 条件ハン ド ラ ー
条件 と 条件ハン ド ラ ー
条件ハン ド ラ ーは、 SQLSTATE ベース ま たは汎用にな る か、 ユーザー定義の条件に
関連付け ら れ る かの ど ち ら かです。
SQLSTATE ベースの条件ハン ド ラ ー
ス ト ア ド ・ プ ロ シージ ャ 内の SQL 文の実行は、 一定の完了、 例外、 お よ び警告条
件にな り ます。 こ う し た条件は SQLSTATE 文変数にポ ス ト さ れます。 条件ハン ド
ラ ーを宣言 し 、 それを 1 つ以上の SQLSTATE 値に関連付け る こ と がで き ます。 ス ト
ア ド ・ プ ロ シージ ャ の実行中に、 指定 し た SQLSTATE 値に よ っ て表わ さ れ る 条件が
発生す る と 、 条件ハン ド ラ ーがそのア ク シ ョ ン を実行 し ます。 詳細は、 「DECLARE
HANDLER ( 基本構文 )」 (192 ページ ) を参照 し て く だ さ い。
一般条件 と 汎用条件ハン ド ラ ー
一般条件は、 キー ワー ド SQLEXCEPTION、 SQLWARNING、 ま たは NOT FOUND
で表わ さ れます。 条件ハン ド ラ ーを宣言 し 、 それを特定の SQLSTATE 値ではな く 、
1 つ以上の一般条件に関連付け る こ と がで き ます。 ス ト ア ド ・ プ ロ シージ ャ の実行
中に、 指定 し た一般条件が発生す る と 、 条件ハン ド ラ ーがそのア ク シ ョ ン を実行 し
ます。 汎用条件ハン ド ラ ーの動作については、 「DECLARE HANDLER
(SQLEXCEPTION タ イ プ )」 (204 ページ )、 「DECLARE HANDLER (SQLWARNING
タ イ プ )」 (208 ページ )、 お よ び 「DECLARE HANDLER (NOT FOUND タ イ プ )」
(211 ページ ) で説明 し てい ます。
条件名の条件ハン ド ラ ー
SQLSTATE は、 5 文字の文字列値です。 ニーモニ ッ ク ( 略号 ) 名を宣言 し てそれを
SQLSTATE 値に関連付け る と 、 その SQLSTATE 値が ど の よ う な条件 を 表わすの
か を覚えやす く な り ます。 条件名の宣言については、 「DECLARE CONDITION」
(187 ページ ) を参照 し て く だ さ い。 条件ハン ド ラ ーを宣言 し 、 それを 1 つ以上の条
件名に関連付け る こ と がで き ます。 ス ト ア ド ・ プ ロ シージ ャ の実行中に、 条件名ま
たは指定 し た SQLSTATE 値に よ っ て識別 さ れ る 条件が発生す る と 、 条件ハン ド ラ ー
がそのア ク シ ョ ン を実行 し ます。
ユーザー定義条件 と ハン ド ラ ー
条件名を宣言 し て も SQLSTATE 値 と は関連付けない方法で、 カ ス タ ム条件を定義す
る こ と がで き ます。 こ れは、 条件が自分のニーズに合わない SQLSTATE 値で表わ さ
れ る 場合に便利です。 条件ハン ド ラ ーを宣言 し 、 それを 1 つ以上のユーザー定義条
件に関連付け る こ と がで き ます。 ス ト ア ド ・ プ ロ シージ ャ の実行中に、 ユーザー定
義条件が発生す る と 、 条件ハ ン ド ラ ーがそのア ク シ ョ ン を実行 し ま す。 SIGNAL
文を使用す る と 、 明示的にユーザー定義条件を発生 さ せ る こ と がで き ます。
ユーザー定義条件の宣言 と 条件ハン ド ラーへのその関連付けについては、 「DECLARE
CONDITION」 (187 ページ ) お よ び 「DECLARE HANDLER ( 基本構文 )」 (192 ペー
ジ ) を参照 し て く だ さ い。 SIGNAL 文については、 「SIGNAL」 (219 ページ ) を参照
し て く だ さ い。
162
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
条件ハン ド ラ ーの タ イ プ
条件ハン ド ラ ーの タ イ プ
ハン ド ラ ー宣言では、 以下のハン ド ラ ー ・ タ イ プのいずれかを指定す る 必要があ り
ます。
• CONTINUE
• EXIT
ス ト ア ド ・ プ ロ シージ ャ があ る 条件にな る と 、 指定 さ れたハン ド ラ ーの タ イ プに関
係な く 、 指定 さ れたハン ド ラ ー ・ ア ク シ ョ ンが実行 さ れます。
こ れ ら の違いは、 CONTINUE は複合文の中の次の文に制御を渡すのに対 し 、
EXIT はハン ド ラ ーを含む複合文の外の次の文に制御を渡す と い う 点です。
CONTINUE ハン ド ラ ー と EXIT ハン ド ラ ーの動作については、 「DECLARE
HANDLER (CONTINUE タ イ プ )」 (194 ページ ) お よ び 「DECLARE HANDLER
(EXIT タ イ プ )」 (198 ページ ) で説明 し てい ます。
条件の発生
ス ト ア ド ・ プ ロ シージ ャ 内の SQL 文の実行中、 その SQL 文の実行が完了す る かエ
ラ ーま たは警告にな る と 、 条件が発生 し ます。
SIGNAL 文を使用 し て、 例外条件、 完了条件 ( 成功条件以外 )、 ま たはユーザー定
義条件を明示的に発生 さ せ る こ と も で き ます。
RESIGNAL 文を使用 し て、 ハン ド ラ ー宣言か ら シ グナルの再送すなわち条件の再呼
び出 し がで き ます。 RESIGNAL 文は、 ハン ド ラ ー宣言内でのみ明示的に指定で き ま
す。 RESIGNAL は、 常に条件を外側に伝搬 さ せます。 ハン ド ラ ー ・ ア ク シ ョ ンか ら
RESIGNAL 文が実行 さ れ る と 、 RESIGNAL 文の外側にあ る 複合文を検索 し て、
RESIGNAL 文で発生 し た条件を処理す る ハン ド ラ ーを見つけ ます。
SIGNAL 文 と RESIGNAL 文については、 「SIGNAL」 (219 ページ ) お よ び
「RESIGNAL」 (229 ページ ) を参照 し て く だ さ い。
制御文の処理
ス ト ア ド ・ プ ロ シージ ャ におけ る 制御文な ど の SQL 文で発生 し た条件の処理につ
いては、 「文固有の条件処理」 (182 ページ ) で説明 し てい ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
163
第 6 章 : 条件処理
条件ハン ド ラ ーのルール
条件ハン ド ラ ーのルール
• 条件ハン ド ラ ーは、 正常な完了を除 く 完了条件 と 例外条件に対 し て定義で き ま
す。 正常な完了 (SQLSTATE = '00000') に対 し て条件ハン ド ラ ーを定義す る こ と
はで き ません。
• 条件ハン ド ラ ーは、 複合文の中でのみ宣言で き ます。
複合文を含ま ない ス ト ア ド ・ プ ロ シージ ャ では、 ハン ド ラ ーは宣言で き ません。
• DECLARE HANDLER 文では、 同 じ SQLSTAT コ ー ド を繰 り 返 し 使用す る こ と は
で き ません。
• 同 じ 複合文内で、 複数の条件ハン ド ラ ーに対 し て同 じ SQLSTATE コ ー ド を宣言
す る こ と はで き ません。
し か し 、 ス ト ア ド ・ プ ロ シージ ャ 内の他の入れ子の、 あ る いは入れ子ではない
複合文の中の条件ハン ド ラ ーに対 し ては、 同 じ SQLSTATE コ ー ド を再利用す る
こ と がで き ます。 「例 3」 (172 ページ ) を参照 し て く だ さ い。
• SQLEXCEPTION、 SQLWARNING、 NOT FOUND、 ま たは こ れ ら の一般条件の任
意の組み合わせをハン ド ラ ー宣言内に指定す る こ と がで き ます。
• 複合文の中では、 各汎用条件ハ ン ド ラ ー を 最高 1 回ずつ宣言す る こ と がで き
ま す。
ス ト ア ド ・ プ ロ シージ ャ の中の他の複合文で同 じ 一般条件を再利用す る こ と が
で き ます。
• あ る 1 つの SQLSTATE 値 と 1 つ以上の一般条件を同一の DECLARE HANDLER
文内に宣言す る こ と はで き ません。
• ハン ド ラー ・ ア ク シ ョ ンに複数の文を指定する場合、 すべての文は BEGIN…END
複合文内に含め る 必要があ り ます。
ハン ド ラ ー ・ ア ク シ ョ ンでは、 入れ子の複合文を実行で き ます。
• 条件ハン ド ラ ーの有効範囲は、 それが宣言 さ れてい る 複合文 ( すべての入れ子の
複合文を含む ) です。
条件名を指定す る ハン ド ラ ーを宣言す る 場合は、 次の追加ルールが適用 さ れます。
• 条件名が同一でない限 り 、 ハン ド ラ ー宣言で 1 つ以上の条件名を指定で き ます。
ハン ド ラ ー ・ ア ク シ ョ ンは、 DECLARE HANDLER 文内のすべての条件名に関連
付け ら れます。 「例 2」 (165 ページ ) では、 こ のルールについて説明 し てい ます。
• ハン ド ラ ー宣言内で同じ条件名を繰 り 返す こ と はで き ません。 その よ う な指定を
す る と 、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中にエ ラ ー SPL1052 が報告 さ れ、
その ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。
• 同 じ ハ ン ド ラ ー宣言内に、 条件名 と 一般条件 を 指定す る こ と はで き ま せん。
そ の よ う な指定をす る と 、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中にエ ラ ー
SPL1082 が報告 さ れ、 その ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。 「例 3」
(166 ページ ) と 「例 4」 (166 ページ ) で は 、 こ の ル ー ル に つ い て 説 明 し て い
ま す。
164
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
条件ハン ド ラ ーのルール
• 同 じ ハ ン ド ラ ー宣言内に、 条件名 と その条件名に関連付け ら れた SQLSTATE
値を指定す る こ と はで き ません。 その よ う な指定をす る と 、 ス ト ア ド ・ プ ロ
シージ ャ の コ ンパ イ ル中にエ ラ ー SPL1054 が報告 さ れ、 その ス ト ア ド ・ プ ロ
シージ ャ は作成 さ れません。 「例 5」 (166 ページ ) では、 こ のルールについて説
明 し てい ます。
• 同 じ 複合文内で同 じ 条件名を指定す る よ う な複数のハン ド ラ ーを宣言す る こ と
はで き ません。 その よ う な指定をす る と 、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ
ル中にエ ラ ー SPL1052 が報告 さ れ、 その ス ト ア ド ・ プ ロ シージ ャ は作成 さ れま
せん。 「例 6」 (167 ページ ) では、 こ のルールについて説明 し てい ます。
• 条件名に対 し てハ ン ド ラ ーを宣言す る と 、 同 じ 複合文内で別のハ ン ド ラ ーを
宣言 し て、 その条件名に関連付け ら れた SQLSTATE 値を処理で き ま せん。
その よ う な指定をす る と 、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中にエ ラ ー
SPL1054 が報告 さ れ、 その ス ト ア ド ・ プ ロ シージ ャ は作成 さ れ ま せん。 「例 7」
(167 ページ ) では、 こ のルールについて説明 し てい ます。
• SQLSTATE 値が関連付け ら れてい る 条件名に対 し てハン ド ラ ーを宣言す る と 、
その SQLSTATE 値を持つ条件の処理に も 同 じ ハン ド ラ ーが使用 さ れます。
例1
次の例は、 ハ ン ド ラ ー内での条件名 と それに関連付け ら れた SQLSTATE 値の使
用法 を 示 し てい ます。 条件宣言では、 条件名 divide_by_zero を定義 し 、 それに
SQLSTATE '22012' を関連付けてい ます。 EXIT ハン ド ラ ーは、 divide_by_zero を処理
す る よ う 定義 さ れてい ます。 ス ト ア ド ・ プ ロ シージ ャ の実行中、 SQLSTATE '22012'
と な る divide-by-zero 例外が発生 し 、 EXIT ハン ド ラ ーがそれを処理 し ます。 EXIT
ハン ド ラ ー文が正常に完了 し た後、 制御は複合文 cs1 にあ り 、 ス ト ア ド ・ プ ロ シー
ジ ャ は正常に完了 し ます。
CREATE PROCEDURE condsp1 (INOUT IOParam2 INTEGER,
OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER
FOR divide_by_zero, SQLSTATE '42000'
SET OParam3 = 0;
SET IOParam2 = 0;
SET OParam3 = 20/IOParam2;
/* raises exception 22012 */
END cs1;
例2
次の例は、 同 じ ハン ド ラ ー ・ ア ク シ ョ ン と 複数の条件名 と の関連付け を示 し てい ま
す。 条件名 divide_by_zero と table_does_not_exist に対 し て CONTINUE ハン ド ラ ーが
定義 さ れてい ます。 ス ト ア ド ・ プ ロ シージ ャ の実行中、 例外 ERRAMPEZERODIV
(SQLCODE 2802 お よ び SQLSTATE '22012') と ERRTEQTVNOEXIST (SQLCODE 3807
お よ び SQLSTATE '42000') の両方を CONTINUE ハン ド ラ ーで処理で き ます。
CREATE PROCEDURE condsp2 (INOUT IOParam2 INTEGER,
OUT OParam3 CHAR(30))
Cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
165
第 6 章 : 条件処理
条件ハン ド ラ ーのルール
DECLARE table_does_not_exist CONDITION FOR SQLSTATE '42000';
DECLARE CONTINUE HANDLER
FOR divide_by_zero, table_does_not_exist
SET OParam3 = 0;
SET IOParam2=0;
SET OParam3 = 20/IOParam2;
/* raises exception 22012 */
INSERT notab VALUES (IOParam2 + 20); /* raises exception 42000 */
END Cs1;
BTEQ> DROP TABLE notab;
BTEQ> CALL condsp2(IOParam2, OParam3);
例3
次の例は、 一般条件や明示的に宣言 さ れた条件を処理す る ための さ ま ざ ま なハン ド
ラ ーの使用法を示 し てい ます。 第 2 の宣言ハン ド ラ ーは、 divide-by-zero 例外を処理
し ます。 SQLEXCEPTION に対 し て宣言 さ れた第 1 のハン ド ラ ーは、 その他すべて
の例外条件を処理 し ます。
CREATE PROCEDURE condsp3 (OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER
FOR SQLEXCEPTION
SET OParam3 = 0;
DECLARE EXIT HANDLER
FOR divide_by_zero
SET OParam3 = 1;
...
END cs1;
例4
同 じ ハン ド ラ ーを使っ て、 宣言 さ れた条件 と 一般条件の両方を処理す る こ と はで き
ません。 こ の例のハン ド ラ ーは、 SQLEXCEPTION と 条件名 divide_by_zero の両方に
対 し て定義 さ れてい ます。 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中に、 エ ラ ー
SPL1082 が報告 さ れ、 ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。
CREATE PROCEDURE condsp4 (OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER
FOR SQLEXCEPTION, divide_by_zero
SET OParam3 = 0;
...
END cs1;
例5
同 じ ハン ド ラ ー内に、 条件名 と その条件名に関連付け ら れた SQLSTATE 値に対す る
ハン ド ラ ーを宣言す る こ と はで き ません。 こ の例では、 条件名 divide_by_zero と
divide_by_zero に関連付け ら れた SQLSTATE 値 '22012' を処理す る よ う ハン ド ラ ーが
定義 さ れてい ます。 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中に、 エ ラ ー SPL1054 が
報告 さ れ、 ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。
166
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
条件ハン ド ラ ーのルール
CREATE PROCEDURE condsp5 (OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER
FOR divide_by_zero, SQLSTATE '22012'
SET OParam3 = 0;
...
END cs1;
例6
同じ複合文内で同じ条件名に対し て複数のハン ド ラ ーを宣言する こ と はで き ません。
こ の例では、 複合文 cs1 の中で、 同 じ 条件名 divide_by_zero に対 し て 2 つのハ ン ド
ラ ーが定義 さ れてい ます。 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中に、 エ ラ ー
SPL1052 が報告 さ れ、 ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。
CREATE PROCEDURE condsp6 (OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER
FOR divide_by_zero
SET OParam3 = 0;
DECLARE EXIT HANDLER
FOR divide_by_zero
SET OParam3 = 1;
...
END cs1;
例7
同 じ 複合文内で、 あ る 条件名に対す る ハン ド ラ ー と 、 その条件名に関連付け ら れた
SQLSTATE 値に対す る も う 1 つ別のハン ド ラ ーを宣言す る こ と はで き ません。 こ の
例では、 最初のハン ド ラ ーは条件名 divide_by_zero を処理す る よ う 定義 さ れてい ま
す。 第 2 のハン ド ラ ーは、 divide_by_zero に関連付け ら れた SQLSTATE '22012' に対
し て定義 さ れてい ます。 両方のハン ド ラ ーが複合文 cs1 の中に定義 さ れてい ます。
そのため、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中に、 エ ラー SPL1054 が報告 さ れ、
ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。
CREATE PROCEDURE condsp7 (OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER
FOR divide_by_zero
SET OParam3 = 0;
DECLARE EXIT HANDLER
FOR SQLSTATE '22012'
SET OParam3 = 1;
...
END cs1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
167
第 6 章 : 条件処理
入れ子の複合文の中の条件ハン ド ラ ーのルール
入れ子の複合文の中の条件ハン ド ラ ーのルール
• ハン ド ラ ー ・ ア ク シ ョ ン文以外のいずれかの文で発生 し た、 複合文中の例外条
件、 完了条件、 お よ びユーザー定義条件は、 適切なハン ド ラ ーが存在すればそ
の複合文の中で処理 さ れます。
入れ子の複合文では、 内側の複合文の中に適切なハ ン ド ラ ーの な い条件は、
ハ ン ド ラ ーの検索のために外側の文に伝搬 さ れます。
次の表では、 内側の複合文内に特定の条件の処理に使用で き る ハン ド ラ ーが無
い場合に発生 し 得 る 種々のシナ リ オについて説明 し てい ます。
条件が発生 し
た場所
入れ子ではな い
複合文
適切なハン ド ラ ー
その場合
その文の中にあ る
条件が処理 さ れ、 ハン ド ラ ーの タ イ プ
に応 じ て、 ス ト ア ド ・ プ ロ シージ ャ の
実行が続行す る か終了す る か し ます。
存在 し ないで、 次に示す条件の場合
• 入れ子の複合文
• ハン ド ラ ー ・
ア ク シ ョ ン文
以外の文
• 例外条件 ま たは処理 さ れな いユーザー定義
条件。
• 完了条件。
•
その文の中にあ る 。
条件が処理 さ れます。
ス ト ア ド ・ プ ロ シージ ャ は終了 し
ます。
• ス ト ア ド ・ プ ロ シージ ャ の実行は
続行 し ます。
その文の中にな く 、 す ぐ外の文で適当なハン ド ラ ーの検索が行なわれ る :
• その文の中にハン ド ラ ーがあれば、 条件は処理 さ れ ます。
• ハ ン ド ラ ーが な い場合は、 次の外側の複合文で適当なハ ン ド ラ ーの検索が行な われ
ま す。
最 も 外側の複合文に も 適当なハン ド ラ ーが存在 し ないで、 次に示す条件の場合 :
• 例外条件ま たは処理 さ れないユーザー定義条件の場合、 ス ト ア ド ・ プ ロ シージ ャ が終
了 し ます。
• 完了条件の場合、 ス ト ア ド ・ プ ロ シージ ャ の実行は、 条件が発生 し た文の次の文か ら
続け ら れます。
• ハン ド ラ ー ・ ア ク シ ョ ン文で発生 し た例外条件、 完了条件、 お よ びユーザー定
義条件の伝搬 と 処理のルールは、 上記 と は異な り ます。 詳細 と 例は、 「ハン ド
ラ ー ・ ア ク シ ョ ンで発生す る 条件」 (173 ページ ) を参照 し て く だ さ い。
168
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
ス テー タ ス変数の値
ス テ ー タ ス変数の値
ハン ド ラ ー ・ ア ク シ ョ ンが完了す る と 、 ス テー タ ス変数が次の表に示 さ れてい る 値
に設定 さ れます。
ス テー タ ス変数
ス テー タ ス ・ コ ー ド
SQLSTATE
'00000'
SQLCODE
0
ACTIVITY_COUNT
0
こ れ ら の値は、 ハン ド ラ ーが CONTINUE タ イ プの場合にのみ返 さ れます。
EXIT ハン ド ラ ーの場合、 制御は条件の発生 し た複合文を終了 し ます。
ス ト ア ド ・ プ ロ シージ ャ 内の式の評価で例外条件か完了条件が発生す る と 、 ス テー
タ ス変数 SQLSTATE、 SQLCODE、 お よ び ACTIVITY_COUNT にはすべて、 Teradata
Database か ら 返 さ れた特定の警告、 エ ラ ー、 ま たは失敗の コ ー ド に対応す る 値が設
定 さ れます。 1 つの例 と し ては、 ゼ ロ 除算の条件があ り ます。
式の評価が正常に完了 し た場合には、 完了の条件は出 さ れません。
個々の条件ハン ド ラ ーの優先順位
ス ト ア ド ・ プ ロ シージ ャ には、 汎用条件ハン ド ラー と 特定条件ハン ド ラ ー ( 特定の
SQLSTATE コー ド や条件名に よ っ て定義 さ れた特定の条件を処理するハン ド ラー ) を
備え る こ と がで き ます。 特定条件ハン ド ラ ー と 、 それに似通っ た条件を処理す る た
めの汎用条件ハン ド ラ ーを備えた ス ト ア ド ・ プ ロ シージ ャ では、 特定条件ハン ド
ラ ーが優先 さ れます。 こ の よ う な場合には、 以下のルールが適用 さ れます。
• 例外条件用に SQLEXCEPTION ハン ド ラ ー と 特定ハン ド ラ ーの両方を ス ト ア ド ・
プ ロ シージ ャ に指定 し た場合、 次の よ う にな り ます。
発生 し た例外
実行 さ れ る ハン ド ラ ー ・ ア ク シ ョ ン
ハン ド ラ ーに指定 さ れた SQLSTATE 値
のいずれか と 一致す る 場合
その特定の条件ハン ド ラ ーに定義 さ れた
アクシ ョ ン
ハン ド ラ ーに指定 さ れた条件名のいずれ
か と 一致す る 場合
その特定の条件ハン ド ラ ーに定義 さ れた
アクシ ョ ン
ど のハン ド ラ ーに指定 さ れた特定の
SQLSTATE コ ー ド ま たは条件名 と も 一致
し ない場合
汎用の例外条件ハン ド ラ ーに定義 さ れた
アクシ ョ ン
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
169
第 6 章 : 条件処理
例外条件 ト ラ ンザ ク シ ョ ンの意義
• SQLWARNING ハン ド ラ ー と 特定のハ ン ド ラ ーを両方 と も 完了条件に指定 し た
場合、 次の よ う にな り ます。
発生 し た条件
実行 さ れ る ハン ド ラ ー ・ ア ク シ ョ ン
ハン ド ラ ーに指定 さ れた SQLSTATE 値
のいずれか と 一致す る 場合
その特定の条件ハン ド ラ ーに定義 さ れた
アクシ ョ ン
ハン ド ラ ーに指定 さ れた条件名のいずれ
か と 一致す る 場合
その特定の条件ハン ド ラ ーに定義 さ れた
アクシ ョ ン
ど のハン ド ラ ーに指定 さ れた特定の
SQLSTATE コ ー ド ま たは条件名 と も 一致
し ない場合
汎用完了条件ハン ド ラ ーに定義 さ れた ア
クシ ョ ン
• NOT FOUND ハン ド ラ ー と 特定ハン ド ラ ーを両方 と も 「no data found」 完了条件
に指定 し た場合、 次の よ う にな り ます。
「no data found」 条件が発生 し た場合の
SQLSTATE 値
実行 さ れ る ハン ド ラ ー ・ ア ク シ ョ ン
特定完了条件ハン ド ラ ーのいずれかに一
致 し た場合
その特定完了条件ハン ド ラ ーに定義 さ れ
たア ク シ ョ ン
特定条件ハン ド ラ ーの どれに も 一致 し な
い場合
汎用の NOT FOUND 条件ハン ド ラ ーに定
義 さ れた ア ク シ ョ ン
• 完了条件の 「no data found」 は、 他の ど の汎用完了条件 よ り も 優先 さ れます。
「no data found」 完了条件を処理で き る のは、 汎用の NOT FOUND ハン ド ラ ーま
たは特定条件ハン ド ラ ーだけです。
例外条件 ト ラ ン ザ ク シ ョ ン の意義
CONTINUE の例外条件 と EXIT の例外条件には、 いずれ も 同 じ ルールのセ ッ ト が適
用 さ れます。 ス ト ア ド ・ プ ロ シージ ャ の動作は、 ANSI お よ び Teradata セ ッ シ ョ ン ・
モー ド の意味 と だいたい一致 し ます。
次の表は、 それぞれ、 エ ラ ー と 失敗の条件におけ る ト ラ ンザ ク シ ョ ンの意味を説明
し てい ます。
条件の タ イ プ
セ ッ シ ョ ン ・ モー ド
Transaction Manager が行な う ア ク シ ョ ン
エラー
ANSI
要求レベルの ロ ールバ ッ ク 。
例外条件の発生 し た文だけが ロ ールバ ッ ク さ
れ ます。
170
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
例外条件 ト ラ ンザ ク シ ョ ンの意義
条件の タ イ プ
セ ッ シ ョ ン ・ モー ド
Transaction Manager が行な う ア ク シ ョ ン
失敗
• ANSI
ト ラ ンザ ク シ ョ ン ・ レベルの ロ ールバ ッ ク 。
• Teradata
ト ラ ンザ ク シ ョ ン内で実行 さ れたすべての更
新が ロ ールバ ッ ク さ れ ます。
例1
こ の例は、 外側の複合文に関連 し た CONTINUE ハン ド ラ ーが、 内側の複合文で発
生 し た例外条件を処理す る 方法を表わ し てい ます。
CREATE PROCEDURE spSample1(IN pName CHARACTER(30), IN pAmt INTEGER)
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
INSERT INTO Proc_Error_Tbl VALUES (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample1', 'Duplicate Row Error');
...
L1: BEGIN
DECLARE counter INTEGER DEFAULT 5;
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
L2: BEGIN
INSERT INTO Proc_Error_Tbl VALUES (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample1',
'Table does not exist');
...
END L2;
WHILE (counter < 1022012) DO
INSERT INTO tab1 VALUES (pName, pAmt) ;
-- Duplicate row error
SET counter = counter + 1;
END WHILE;
...
END L1;
...
END;
表 tab1 が次の よ う に し て作成 さ れ る と し ます。
CREATE SET TABLE tab1(c1 CHARACTER(30), c2 INTEGER);
ス ト ア ド ・ プ ロ シージ ャ spSample1 を実行 し ます。
CALL spSample1('Richard', 100);
L1 の WHILE 文の中の INSERT で重複行例外が発生し ます。 複合文 L1 の中にはハン
ド ラ ーがないので、 こ れは ラ ベルのない外側の複合文に伝搬 さ れます。
SQLSTATE '23505' に対 し て宣言 さ れてい る CONTINUE ハ ン ド ラ ーが呼び出 さ れ
ま す。 こ のハン ド ラ ーが例外条件を処理 し 、 例外条件の発生 し た INSERT の次の文
か ら ス ト ア ド ・ プ ロ シージ ャ の実行が続け ら れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
171
第 6 章 : 条件処理
例外条件 ト ラ ンザ ク シ ョ ンの意義
例2
こ の例は、 ス ト ア ド ・ プ ロ シージ ャ 全体に適当なハン ド ラ ーが存在 し ないために、
内側の複合文で発生 し た例外が処理 さ れずに残 さ れ る 様子を示 し てい ます。
CREATE PROCEDURE spSample1(IN pName CHARACTER(30), IN pAmt INTEGER)
L1: BEGIN
...
L2: BEGIN
DECLARE vName CHARACTER(30);
INSERT INTO tab1 VALUES (pName, pAmt);
-- The table does not exist
-- exception is raised, and not handled
SET vName = pName;
END L2;
INSERT ...
END L1;
次の よ う に表 tab1 が削除 さ れ る と し ます。
DROP TABLE tab1;
ス ト ア ド ・ プ ロ シージ ャ spSample1 を実行 し ます。
CALL spSample1('Richard', 10000);
ス ト ア ド ・ プ ロ シージ ャ の実行中、 最初の INSERT 文で SQLSTATE '42000' の例外
が発生 し ますが、 L2 と い う ラ ベルの複合文には、 こ の例外を処理す る よ う 定義 さ
れたハン ド ラ ーがあ り ません。
発生 し た例外に対 し て定義 さ れてい る ハ ン ド ラ ーは、 外側の L1 と い う ラ ベルの
複合文の中に も あ り ません。 そのため、 ス ト ア ド ・ プ ロ シージ ャ は、 SQLSTATE
'42000' に対応す る エ ラ ー ・ コ ー ド で終了 し ます。
例3
次の例は、 入れ子の複合文におけ る 同一の SQLSTATE コ ー ド の有効な再利用方法を
示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ の実行の前に、 表 tDummy が削除 さ れ る と し ます。 L1 お よ
び L2 と い う ラ ベルの複合文で同 じ 種類の例外条件が発生 し 、 条件はそれぞれの場
所で処理 さ れます。 2 つの コ ンパ イ ル警告を伴 う ス ト ア ド ・ プ ロ シージ ャ が作成 さ
れます。
CREATE PROCEDURE spSample (OUT po1 VARCHAR(50),
OUT po2 VARCHAR(50))
BEGIN
DECLARE i INTEGER DEFAULT 0;
L1: BEGIN
DECLARE var1 VARCHAR(25) DEFAULT 'ABCD';
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
SET po1 = "Table does not exist in L1';
INSERT INTO tDummy (10, var1);
-- Table does not exist.
L2: BEGIN
DECLARE var1 VARCHAR(25) DEFAULT 'XYZ';
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
SET po2 = "Table does not exist in L2';
172
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ン で発生す る 条件
INSERT INTO tDummy (i, var1);
-- Table does not exist.
END L2;
END L1;
END;
ハン ド ラ ー ・ ア ク シ ョ ン で発生す る 条件
条件ハン ド ラーのア ク シ ョ ン句は、 入れ子ま たは入れ子ではない複合文にで き ます。
ア ク シ ョ ン句で発生 し た例外条件、 完了条件、 ま たはユーザー定義条件は、 ア ク
シ ョ ン句の中に定義 さ れてい る ハン ド ラ ーで処理で き ます。
ハン ド ラ ー ・ ア ク シ ョ ンで発生す る 条件がア ク シ ョ ン句の中で処理 さ れない場合、
その条件は適切なハン ド ラ ーの検索のために外側に伝搬 さ れ る こ と はあ り ません。
複合文に関連 し た他のハン ド ラ ーは、 ハン ド ラ ーで発生 し た条件を処理す る こ と は
で き ません。 こ の よ う な条件は処理 さ れずに残 り ます。 唯一の例外は、 RESIGNAL
文です。 その条件は、 ハン ド ラ ー内の複合文のア ク シ ョ ン句の外に伝搬 さ れます。
以下の表では、 処理 さ れない例外条件、 完了条件、 お よ びユーザー定義条件を比較
し てい ます。
処理 さ れない
条件の種類
その場合
例外条件ま た
はユーザー定
義条件
ハン ド ラ ーが終了 し 、 そのハン ド ラ ーを呼び出 し た元々の条件が、
適切なハン ド ラ ーを探すために外側に伝搬 さ れ ます。
完了
条件は無視 さ れ、 ハン ド ラ ー ・ ア ク シ ョ ン内の次の文か ら 実行が続け
ら れます。
元の条件に対す る 適当なハン ド ラ ーが存在 し ない場合、 ス ト ア ド ・
プ ロ シージ ャ は終了 し ます。
以下の事例で こ れ ら の状況について説明 し ます。
ケース 1
以下は、 処理 さ れ る 新 し い例外を引 き 起 こ す例外条件のハ ン ド ラ ー ・ ア ク シ ョ ン
例です。
1
ス ト ア ド ・ プ ロ シージ ャ で例外が発生 し 、 参照 さ れたデー タ ベース ・ オブジ ェ
ク ト が存在 し ない こ と を意味す る SQLSTATE コ ー ド '42000' が発生 し ます。
2
例外条件が条件ハン ド ラ ーに よ っ て処理 さ れます。
3
その後、 ハン ド ラ ー ・ ア ク シ ョ ン で、 ゼ ロ 除算の例外 '22012' が発生 し ます。
4
文のハン ド ラ ー ・ ア ク シ ョ ン ・ グループの中に こ の例外を処理す る ためのハン
ド ラ ーが存在す る ので、 こ れは処理 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
173
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ン で発生す る 条件
ケース 2
以下は、 処理 さ れない新 し い例外を引 き 起 こ す例外条件のハン ド ラ ー ・ ア ク シ ョ ン
例です。
1
ス ト ア ド ・ プ ロ シージ ャ で例外が発生 し 、 参照 さ れたデー タ ベース ・ オブジ ェ
ク ト が存在 し ない こ と を意味す る SQLSTATE コ ー ド '42000' が発生 し ます。
2
その後、 ハン ド ラ ー ・ ア ク シ ョ ン句で、 ゼ ロ 除算の例外 '22012' が発生 し ます。
3
文のハン ド ラ ー ・ ア ク シ ョ ン ・ グループの中に、 こ の新 し く 発生 し た例外に対
す る 適当なハン ド ラ ーが存在 し ない場合、 ハン ド ラ ーを探すために新 し く 発生
し た こ の条件が外側に伝搬 さ れ る こ と はあ り ません。
4
こ のハン ド ラ ー ・ ア ク シ ョ ンは終了 し 、 元の例外条件であ る '42000' は、 適切な
条件ハン ド ラ ーを探すために外側に伝搬 さ れます。
5
元の条件に対 し て適切なハン ド ラ ーが見付か ら ない場合、 ス ト ア ド ・ プ ロ シー
ジ ャ は終了 し 、 元の例外条件であ る '42000' に対応す る Teradata Database エ
ラ ー ・ コ ー ド が戻 さ れます。
ケース 3
以下は、 例外を引 き 起 こ す完了条件のハン ド ラ ー ・ ア ク シ ョ ン例です。
1
要求 し たサンプル ・ サ イ ズは表の行 よ り も 大 き い こ と を意味す る SQLSTATE
コ ー ド 'T7473' で、 ス ト ア ド ・ プ ロ シージ ャ は完了条件 ( 警告 ) を発生 し ます。
2
その後、 ハン ド ラ ー ・ ア ク シ ョ ンで、 表への重複行の挿入の試行に関す る 例外
条件 '23505' が発生 し ます。
3
'23505' に対す る 適切なハン ド ラ ーがハン ド ラ ー ・ ア ク シ ョ ンの中に存在すれば、
こ の条件は処理 さ れます。
4
'23505' に対す る 適切なハン ド ラ ーがハン ド ラ ー ・ ア ク シ ョ ンの中に存在 し ない
場合、 元の条件であ る 'T7473' は、 こ の条件を処理する ための適切なハン ド ラーを
探すために外側に伝搬 さ れます。
5
元の完了条件が処理 さ れた場合で、
•
•
ハン ド ラ ーが CONTINUE タ イ プであ る 場合は、 完了条件が発生 し た文か ら
ス ト ア ド ・ プ ロ シージ ャ の実行が続け ら れます。
ハン ド ラ ーが EXIT タ イ プであ る 場合、 制御は EXIT ハン ド ラ ーを含む複合
文を終了 し ます。
完了条件が処理 さ れない場合は、 次の文か ら ス ト ア ド ・ プ ロ シージ ャ の実行が
続け ら れます。
ケース 4
以下は、 別の完了条件を引 き 起 こ す完了条件のハン ド ラ ー ・ ア ク シ ョ ン例です。
174
1
ス ト ア ド ・ プ ロ シージ ャ で、 要求 し たサンプル ・ サ イ ズは表の行 よ り も 大 き い
こ と を意味す る 完了条件 'T7473' が発生 し ます。
2
完了条件が汎用条件ハン ド ラ ーに よ っ て処理 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ン に よ っ て引 き 起 こ さ れた条件の報告のための規則
3
その後、 ハン ド ラ ー ・ ア ク シ ョ ン で 「no data found」 完了条件が発生 し ます。
4
こ の新 し い完了条件は無視 さ れ、 残 り の文で ス ト ア ド ・ プ ロ シージ ャ の実行が
続け ら れます。
ハン ド ラ ー ・ ア ク シ ョ ン に よ っ て引 き 起 こ さ れた条件の報告
のための規則
「ケース 3」 お よ び 「ケース 4」 では、 SQL 文の完了に関連付け ら れたハン ド ラ ー ・
ア ク シ ョ ンに よ っ て発生 し た条件が、 ど の よ う に呼び出 し 側の ス ト ア ド ・ プ ロ シー
ジ ャ やアプ リ ケーシ ョ ンに報告 さ れ る かが重要な側面です。
• 発生 し た条件が例外を出す こ と な く 処理 さ れた場合は、 ス テー タ ス変数に完了
の条件が反映 さ れます。 発生 し た問題に関す る 情報については、 一切呼び出 し
側に通知 さ れません。 そのため、 ス ト ア ド ・ プ ロ シージ ャ で失敗が起 き てそれ
が処理 さ れた場合、 呼び出 し 側は、 失敗が起 き た こ と や ト ラ ンザ ク シ ョ ンが
ロ ールバ ッ ク さ れた こ と に気付 き ません。
条件の発生に関す る 情報を把握す る ためには、 アプ リ ケーシ ョ ンの規則の よ う
な適切な メ カ ニズ ム を定義す る 必要があ り ます。
• 完了条件ハン ド ラ ーに関係 し たハン ド ラ ー ・ ア ク シ ョ ン内の文が、 正常完了以
外の完了条件を引 き 起 こ し 、 その条件に対す る 適当なハン ド ラ ーが存在 し ない
場合、 そのハン ド ラ ー句内の次の文へ と 実行は継続 し ます。 ス テー タ ス変数に
は、 元の完了条件を反映 し た値が入れ ら れます。
ハン ド ラ ー ・ ア ク シ ョ ンが完了す る と ただちに ス テー タ ス変数は、 そのハン ド
ラ ー ・ ア ク シ ョ ンが正常完了 し た こ と を表わす よ う に設定 さ れます。
• ハン ド ラ ー ・ ア ク シ ョ ン句で例外条件が発生す る 可能性があ る こ と が分か っ て
い る 場合は、 こ の よ う な例外を処理す る ため、 ス ト ア ド ・ プ ロ シージ ャ の作成
時にハ ン ド ラ ー ・ ア ク シ ョ ン 句の中に適切 な ハ ン ド ラ ー を 入れ る こ と が で き
ま す。 ハン ド ラ ーは、 必要に応 じ て何重かの入れ子にす る こ と がで き ます。
例1
こ の例では、 ハン ド ラ ー ・ ア ク シ ョ ンに よ っ て引 き 起 こ さ れた例外が処理 さ れずに
残 さ れ、 こ のハン ド ラ ーを呼び出 し た元の条件が外側に伝搬 さ れます。
CREATE PROCEDURE spSample2(IN pName CHARACTER(30), IN pAmt INTEGER)
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '23505'
INSERT INTO Error_Tbl VALUES (:SQLSTATE,CURRENT_TIMESTAMP,
'spSample2', 'Failed to insert record');
...
L1:BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
BEGIN
INSERT INTO Proc_Error_Tbl VALUES (:SQLSTATE,
CURRENT_TIMESTAMP, spSample2',
'Failed to Insert record');
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
175
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ンに よ っ て引 き 起 こ さ れた条件の報告のための規則
INSERT INTO tab1 VALUES (pName, pAmt);
INSERT INTO tab1 VALUES (pName, pAmt);
-- Duplicate row error
...
END L1;
...
END;
表 tab1 が次の よ う に し て作成 さ れ る と し ます。
CREATE SET TABLE tab1(c1 CHARACTER(30), c2 INTEGER);
次の よ う に し て表 Proc_Error_Tbl を削除 し ます。
DROP TABLE Proc_Error_Tbl;
次の よ う に し てプ ロ シージ ャ spSample2 を実行 し ます。
CALL spSample2('Richard', 100);
ス ト ア ド ・ プ ロ シージ ャ の実行中に、 複合文 L1 の最後の INSERT 文で、 重複行例
外が発生 し ます。 SQLSTATE '23505' に対 し て宣言 さ れてい る CONTINUE ハン ド
ラ ーが呼び出 さ れます。 ハン ド ラ ー ・ ア ク シ ョ ン文 (INSERT) で、 別の例外 '42000'
が発生 し ます。
こ のハン ド ラ ーの中には SQLSTATE '42000' を処理す る ためのハン ド ラ ーがないの
で、 こ のハン ド ラ ーを呼び出 し た元の条件であ る SQLSTATE '23505' は外側に伝搬
さ れ ま す。 外側の複合文には、 SQLSTATE '23505' に対 し て定義 さ れてい る EXIT
ハ ン ド ラ ーがあ り ます。 こ のハン ド ラ ーが例外を処理 し 、 制御が複合文を終了 し ま
す。 プ ロ シージ ャ には他に文が含まれていないので、 プ ロ シージ ャ が終了 し ます。
例2
こ の例では、 ハン ド ラ ー内で発生 し た完了条件が無視 さ れます。
CREATE PROCEDURE spSample1(IN pName CHARACTER(30), IN pAmt INTEGER)
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
BEGIN
DELETE FROM temp_table;
INSERT INTO Proc_Error_Tbl VALUES (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample1',
'Failed to Insert record');
END;
INSERT INTO tab1 VALUES (pName, pAmt);
INSERT INTO tab1 VALUES (pName, pAmt);
-- duplicate row error
...
END;
表 temp_table お よ び tab1 が次の よ う に定義 さ れてい る と し ます。
CREATE TABLE temp_table(c1 INTEGER, c2 CHARACTER(30));
CREATE SET TABLE tab1(c1 CHARACTER(30), c2 DECIMAL(18,2));
次の よ う に し てプ ロ シージ ャ を実行 し ます。
CALL spSample1('Richard', 10000);
176
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ン に よ っ て引 き 起 こ さ れた条件の報告のための規則
最後の INSERT 文で重複行例外が発生 し 、 こ のエ ラ ーに対 し て宣言 さ れてい る
CONTINUE ハン ド ラ ーが呼び出 さ れます。 ハン ド ラ ー ・ ア ク シ ョ ン句の DELETE
文で 「no data found」 完了条件が発生 し ます。
こ のハン ド ラ ーの中では こ の条件を処理す る ためのハン ド ラ ーが定義 さ れていない
ので、 条件は無視 さ れ、 ハン ド ラ ー ・ ア ク シ ョ ン句の中の次の文 (INSERT) か ら ス
ト ア ド ・ プ ロ シージ ャ の実行が続け ら れます。
例3
こ の例は、 ハン ド ラ ー ・ ア ク シ ョ ン句の内外で発生す る 例外が混 じ り あ っ た例で、
ハ ン ド ラ ー ・ ア ク シ ョ ン で発生す る 例外が処理 さ れずに残 さ れ る 様子を示 し てい
ま す。
REPLACE PROCEDURE han1(INOUT IOParam1 INTEGER,
INOUT IOParam2 CHARACTER(20))
Loutermost: BEGIN
DECLARE Var1 INTEGER DEFAULT 10;
L1: BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '42000'
-- Statement 3_1a
SET IOParam2 = 'Table does not exist in the outer
block';
DECLARE EXIT HANDLER FOR SQLSTATE '23505'
L2: BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '23505'
-- Statement 3_2a
SET IOParam2 = ' Duplicate row error ';
DECLARE EXIT HANDLER
FOR SQLSTATE '42000'
BEGIN
-- Statement 3_3a
SET IOParam2 = 'Nonexistent table in inner block ';
-- Statement 3_3b
INSERT INTO tab1 VALUES (IOParam1);
-- duplicate row error
END;
-- Statement 3_3c
INSERT INTO notable VALUES (IOParam1, IOParam2);
-- 42000
END L2; /* End Label L2 */
-- Statement 3_4a
DELETE tab1 ALL;
-- Statement 3_4b
SET IOParam1 = Var1;
-- Statement 3_4c
INSERT INTO tab1 VALUES (IOParam1);
-- Statement 3_4d
INSERT INTO tab1 VALUES (IOParam1);
-- duplicate row error
END L1; /* End Label L1 */
END Loutermost;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
177
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ンに よ っ て引 き 起 こ さ れた条件の報告のための規則
ス ト ア ド ・ プ ロ シージ ャ の実行中に、 INSERT 文 (Statement 3_4d) で、 重複行例
外が発生 し ま す。 SQLSTATE '23505' に対 し て定義 さ れてい る 最初の EXIT ハン ド
ラ ーが、 L1 と い う ラ ベルの同 じ 複合文の中にあ る ので呼び出 さ れます。
次に L2 の Statement 3_3c において、 SQLSTATE '42000' の例外が発生 し ます。 こ の
例外を処理す る ために、 '42000' に対 し て定義 さ れてい る EXIT ハン ド ラ ーが呼び出
さ れます。 INSERT 文 ( ハン ド ラ ー内の Statement 3_3b) で、 重複行例外が発生 し ま
す。 ハン ド ラ ーの中には こ の新 し い条件を処理す る ためのハン ド ラ ーがないので、
ハン ド ラ ーは終了 し ます。
最 も 外側のハン ド ラ ーを呼び出 し た、 SQLSTATE '23505' に対応す る 元の条件が外側
に伝搬 さ れます。 一番外側の複合文であ る Loutermost に も 、 こ の条件に適 し たハン
ド ラ ーはないので、 ス ト ア ド ・ プ ロ シージ ャ は '23505' に対応す る エ ラ ーで終了 し
ます。
例 4: 入れ子のス ト ア ド ・ プ ロ シージ ャ における条件ハン ド ラ ー
こ のセ ク シ ョ ンの例は、 以下の ス ト ア ド ・ プ ロ シージ ャ に基づいてい ます。
CREATE PROCEDURE spSample7a()
BEGIN
DECLARE hNumber INTEGER;
-- Statement_7a_1
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_7a_2
INSERT INTO EmpNames VALUES (1002, ’Thomas’);
-- Statement_7a_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
EmpNames 表が削除 さ れてい る場合、 上記ス ト ア ド ・ プ ロ シージ ャ の Statement_7a_2
は、 SQLSTATE コ ー ド '42000' のエ ラ ーを戻 し ます。 こ のエ ラ ーのための条件ハン
ド ラ ーは定義 さ れていないので、 こ のエ ラ ーは処理 さ れません。
2 番目のプ ロ シージ ャ は Statement_7b_2 で最初のプ ロ シージ ャ を呼び出す こ と に注
意 し て く だ さ い。
2 番目の ス ト ア ド ・ プ ロ シージ ャ 定義を考慮 し ます。
CREATE PROCEDURE spSample7b()
BEGIN
DECLARE hNumber INTEGER;
DECLARE EXIT HANDLER FOR SQLSTATE '42000'
INSERT INTO Proc_Error_Table
(:SQLSTATE, CURRENT_TIMESTAMP, 'spSample7b',
'Failed to Insert Row');
-- Statement_7b_1
178
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
ハン ド ラ ー ・ ア ク シ ョ ン に よ っ て引 き 起 こ さ れた条件の報告のための規則
SELECT nextEmpNum INTO hNumber
FROM EmpNext;
UPDATE Employee
SET nextEmpNum = hNumber+1;
-- Statement_7b_2
CALL spSample7a();
-- Statement_7b_3
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
例 5: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample7b();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
Statement_7b_2 と し てマー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 ス ト ア ド ・
プ ロ シージ ャ spSample7a を呼び出 し ます。
2
ス ト ア ド ・ プ ロ シージ ャ spSample7a 内の Statement_7a_2 は、 SQLSTATE コ ー ド
'42000' の例外を発生 さ せます。
3
spSample7a で条件ハン ド ラ ーが定義 さ れていないため、 制御は例外 と と も に呼
び出 し 元のプ ロ シージ ャ spSample7b に戻 り ます。
4
例外は spSample7b で処理 さ れ、 ハン ド ラ ー ・ ア ク シ ョ ンが実行 さ れます。
5
ハン ド ラ ー ・ タ イ プが EXIT なので、 制御は呼び出 し 元の複合文を終了 し ます。
6
以下の項目は未 コ ミ ッ ト の ま ま残 さ れます。
•
7
8
•
最初の 2 つの対話式 SQL 文
spSample7a か ら 呼び出 さ れ る Statement_7a_1
•
spSample7b か ら 呼び出 さ れ る Statement_7b_1
•
spSample7b 内の条件ハン ド ラ ーか ら 呼び出 さ れ る INSERT 文。
以下の項目は実行で き ません。
•
spSample7a か ら 呼び出 さ れ る Statement_7a_3
•
spSample7b か ら 呼び出 さ れ る Statement_7b_3
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
179
第 6 章 : 条件処理
ス ト ア ド ・ プ ロ シージ ャ 内にあ る 複数の条件ハン ド ラ ー
ス ト ア ド ・ プ ロ シ ージ ャ 内にあ る 複数の条件ハ ン ド ラ ー
こ のセ ク シ ョ ンの例は、 以下の ス ト ア ド ・ プ ロ シージ ャ に基づいてい ます。
CREATE PROCEDURE spSample10()
BEGIN
DECLARE EmpCount INTEGER;
DECLARE CONTINUE HANDLER
FOR SQLSTATE '42000'
H1:BEGIN
-- Statement_10_1
UPDATE Employee
SET Ename = 'John';
-----
Suppose column Ename has been dropped.
Statement_10_1 returns SQLSTATE code '52003' that is
defined for the handler within the
block that activates this handler.
-- Statement_10_2
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample10', 'Failed to Insert Row');
END H1;
DECLARE EXIT HANDLER
FOR SQLSTATE '52003'
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample10', 'Column does not exist');
DECLARE CONTINUE HANDLER
FOR SQLWARNING
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample10', 'Warning has occurred');
DECLARE CONTINUE HANDLER
FOR NOT FOUND
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample10', 'No data found');
-- Statement_10_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_10_4
INSERT INTO EmpNames VALUES (1002, 'Thomas');
-- Suppose table EmpNames has been dropped.
-- Statement_10_4 returns SQLSTATE '42000' that is
-- handled.
-- Statement_10_5
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
-- Statement_10_6
SELECT COUNT(*) INTO EmpCount FROM Employee SAMPLE 5;
180
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
ス ト ア ド ・ プ ロ シージ ャ 内にあ る 複数の条件ハン ド ラ ー
-- Suppose table Employee has only three rows.
-- Statement_10_6 returns SQLSTATE 'T7473' that is
-- handled by SQLWARNING handler.
-- Statement_10_7
DELETE Employee WHERE Employee_Number = 1;
-- Suppose table Employee does not have a row for
-- Employee_Number = 1. Statement_10_7 returns SQLSTATE
-- '02000' that is handled by NOT FOUND handler.
END;
例 : ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample10();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
呼び出 さ れた ス ト ア ド ・ プ ロ シージ ャ の中の Statement_10_4 は、 SQLSTATE
コ ー ド '42000' の例外を発生 さ せ ま す。 こ れは、 CONTINUE ハン ド ラ ーを使っ
て処理 さ れます。
2
SQLSTATE '42000' に対す る ハン ド ラ ー ・ ア ク シ ョ ン を実行 し てい る と き に
Statement_10_1 は、 SQLSTATE コ ー ド '52003' の例外を発生 さ せます。
ハン ド ラ ーに よ っ て発生 し た例外は、 ハン ド ラ ー ・ ア ク シ ョ ン句の外では処理
で き ないため、 SQLSTATE コ ー ド '52003' のハン ド ラ ーに制御は渡 り ません。
3
プ ロ シージ ャ は終了 し 、 元の SQLSTATE コ ー ド '42000' を 呼び出 し 元に戻 し
ま す。
4
以下の文は実行 さ れません。
• Statement_10_2
5
•
Statement_10_5
•
Statement_10_6
•
Statement_10_7
以下の文は、 ま だ コ ミ ッ ト さ れていない ト ラ ンザ ク シ ョ ン内にア ク テ ィ ブの ま
ま残 り ます。
•
•
6
最初の 2 つの対話式 SQL 文
Statement_10_3
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
181
第 6 章 : 条件処理
文固有の条件処理
文固有の条件処理
こ のセ ク シ ョ ンでは、 ス ト ア ド ・ プ ロ シージ ャ で条件を発生 さ せた と き の さ ま ざ ま
な SQL 制御文の動作について説明 し ます。
FOR ループ での例外における カ ー ソ ルの処理
障害お よ びエ ラ ー条件にそれぞれ対応す る オープ ン ・ カー ソ ルの処理について、
以下の表で説明 し てい ます。
FOR カー ソ ル ・ ループの
実行時に発生 し た例外
すべてのオープ ン ・ カー ソ ルに対す る 処理
FAILURE
ト ラ ンザ ク シ ョ ン ・ ロールバ ッ ク の一部 と し て閉じ ら れます。
ERROR
閉 じ ら れません。
条件ハン ド ラーに よ っ て指定 さ れたハン ド ラー ・ ア ク シ ョ ンは、 すべてのオープン ・
カー ソ ルが閉 じ ら れ る ま で実行 さ れません。
例 1: WHILE ループ例外
次の例では、 以下の ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample8()
BEGIN
DECLARE hNumber INTEGER;
DECLARE CONTINUE HANDLER
FOR SQLSTATE '42000'
INSERT INTO Proc_Error_Table
(:SQLSTATE, CURRENT_TIMESTAMP, 'spSample8',
'Failed to Insert Row');
SET hNumber = 1;
-- Statement_8_1
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
WHILE hNumber < 10
DO
-- Statement_8_2
INSERT INTO EmpNames VALUES (1002, 'Thomas');
SET hNumber = hNumber + 1;
END WHILE;
-- If the EmpNames table had been dropped,
-- Statement_8_2 returns an SQLSTATE code of
-- '42000' that is handled.
-- Statement_8_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
182
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
文固有の条件処理
例 2: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample8();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
呼び出 さ れた ス ト ア ド ・ プ ロ シージ ャ の中の Statement_8_2 は、 SQLSTATE
'42000' のエ ラ ー条件を発生 さ せます。 こ れは処理 さ れます。 文は ロ ールバ ッ ク
さ れます。
2
条件ハン ド ラ ーがア ク テ ィ ブに さ れます。
3
ハン ド ラ ー ・ タ イ プが CONTINUE なので、 実行は、 ハン ド ラ ー ・ ア ク シ ョ ンが
完了 し た後で、 WHILE ループ内の SET 文か ら 再開 さ れます。 WHILE ループが
例外のために終了す る こ と は あ り ません。
4
繰返 し のたびに、 Statement_8_2 は処理 さ れ る 例外を発生 さ せます。
Statement_8_3 は、 WHILE ループの終了時に実行 さ れます。
5
6
以下の項目は コ ミ ッ ト さ れません。
•
•
最初の 2 つの対話式 SQL 文
Statement_8_1
•
•
条件ハン ド ラ ーのア ク シ ョ ン文
Statement_8_3
プ ロ セ ス終了。
ス ト ア ド ・ プ ロ シージ ャ spSample8 が Teradata セ ッ シ ョ ン ・ モー ド のセ ッ シ ョ ン
で作成 さ れ る と 、 1 つの違いを除 き 、 上記のプ ロ セ ス が適用 さ れます。 各要求は
Teradata セ ッ シ ョ ン ・ モー ド におけ る 暗黙的な ト ラ ン ザ ク シ ョ ン なので、 以下の
文が コ ミ ッ ト さ れます。
• 最初の 2 つの対話式 SQL 文
• Statement_8_1
• 条件ハン ド ラ ーのア ク シ ョ ン文
• Statement_8_3
例 3: IF 文で発生する例外
次の例では、 以下の ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample9()
BEGIN
DECLARE hNumber, NumberAffected INTEGER;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
183
第 6 章 : 条件処理
文固有の条件処理
DECLARE CONTINUE HANDLER
FOR SQLSTATE '22012'
INSERT INTO Proc_Error_Table
(:SQLSTATE, CURRENT_TIMESTAMP, 'spSample9',
'Failed Data Handling');
SET hNumber = 100;
-- Statement_9_1
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number BETWEEN 1001 AND 1010;
SET NumberAffected = ACTIVITY_COUNT;
IF hNumber/NumberAffected < 10 THEN
-----
If the UPDATE in Statement_9_1 results in 0 rows
being affected, the IF condition raises an
exception with SQLSTATE '22012' that is
handled.
-- Statement_9_2
INSERT INTO data_table (NumberAffected, 'DATE');
SET hNumber = hNumber + 1;
END IF;
-- Statement_9_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
上記の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対
話式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample9();
上記の ス ト ア ド ・ プ ロ シージ ャ に関 し て、 以下の一連の イ ベン ト を考慮 し て く だ
さ い。
184
1
呼び出 さ れた ス ト ア ド ・ プ ロ シージ ャ の中の IF 文で、 SQLSTATE '22012' のゼ ロ
除算エ ラ ー条件が発生 し ます。 こ れは処理 さ れます。
2
ハン ド ラ ー ・ タ イ プが CONTINUE であ る ため、 ハン ド ラ ー ・ ア ク シ ョ ンの完了
後に Statement_9_3 か ら 実行が再開 さ れます。
3
Statement_9_2 と SET 文は、 エ ラ ー条件を発生 さ せた IF 文の内部に あ る ため、
実行 さ れません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
文固有の条件処理
4
以下の項目に よ っ て行なわれた更新内容は、 未 コ ミ ッ ト の ト ラ ンザ ク シ ョ ン内
に影響を受けない ま ま残 り ます。
• Statement_9_1
•
5
Statement_9_3
プ ロ セ ス終了。
例 4: WHILE ループ内の条件によ っ て発生 し た例外
以下の例は、 ループ内の条件に よ っ て例外が発生 し た と き に WHILE 文が ど の よ う
に動作す る かを示 し てい ます。 こ の動作は IF お よ び FOR 文に も 当ては ま り ます。
こ の例では、 以下の ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample8()
BEGIN
DECLARE hNumber INTEGER;
DECLARE CONTINUE HANDLER
FOR SQLSTATE '22012'
INSERT INTO Proc_Error_Table
(:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample8',
'Failed in WHILE condition');
SET hNumber = 1;
SET hNo = 0;
-- Statement_8_1
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
WHILE ((hNumber/hNo) < 10)
DO
-- Statement_8_2
INSERT INTO EmpNames VALUES (1002, 'Thomas');
SET hNumber = hNumber + 1;
END WHILE;
-- The condition in WHILE statement raises
-- an exception and returns SQLSTATE code
-- of 22012 that is handled.
-- Statement_8_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
例 5: ANSI セ ッ シ ョ ン ・ モー ド
上記の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対
話式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee
SET Salary_Amount = 10000
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
185
第 6 章 : 条件処理
文固有の条件処理
WHERE Employee_Number = 1000;
CALL spSample8();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
呼び出 さ れた ス ト ア ド ・ プ ロ シージ ャ 内の WHILE 文の中の条件に よ っ て、 例外
が発生 し ます。
2
条件ハン ド ラ ーがア ク テ ィ ブに さ れます。
条件ハン ド ラ ーが CONTINUE タ イ プなので、 制御は WHILE ループの次の文
(statement_8_3) に渡 さ れ、 ス ト ア ド ・ プ ロ シージ ャ の実行は statement_8_3 か ら
継続 し ます。
3
WHILE ループ内の Statement_8_2 と SET 文は実行 さ れません。
4
ス ト ア ド ・ プ ロ シージ ャ の実行が完了 し た と き 、 以下の文は コ ミ ッ ト さ れ ま
せん。
5
6
186
•
•
最初の 2 つの対話式 SQL 文
Statement_8_1
•
•
条件ハン ド ラ ーのア ク シ ョ ン文
Statement_8_3
ス ト ア ド ・ プ ロ シージ ャ spSample8 が Teradata セ ッ シ ョ ン ・ モー ド のセ ッ シ ョ ン
で作成 さ れ る と 、 1 つの違い を除 き 、 上記のプ ロ セ ス が適用 さ れます。 各要求は
Teradata セ ッ シ ョ ン ・ モー ド におけ る 暗黙的な ト ラ ンザ ク シ ョ ン なので、 以下の
文が コ ミ ッ ト さ れます。
•
•
最初の 2 つの対話式 SQL 文
Statement_8_1
•
•
条件ハン ド ラ ーのア ク シ ョ ン文
Statement_8_3
プ ロ セ ス の終わ り 。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE CONDITION
DECLARE CONDITION
目的
SQLSTATE コ ー ド にニーモニ ッ ク ( 略号 ) 名を割当て る か、 ユーザー定義条件を宣
言 し ます。
呼び出 し
実行可能な制御宣言。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
DECLARE
condition_name
;
CONDITION
FOR SQLSTATE
sqlstate_code
VALUE
1148-001A
説明
構文要素
指定内容
condition_name
SQLSTATE コ ー ド に関連付け ら れたニーモニ ッ ク ( 略号 ) 名。
SQLSTATE 値を指定 し ない と 、 条件名を使用 し てユーザー定義
条件を宣言 し ます。
sqlstate_code
処理す る 5 文字 リ テ ラ ルの SQLSTATE コ ー ド 。
SQLSTATE コ ー ド と その意味の リ ス ト については、 付録 D:
「SQLSTATE のマ ッ ピ ン グ」 を参照 し て く だ さ い。
文の正常完了を表わす '00000' を指定す る こ と はで き ません。
ANSI 準拠
DECLARE CONDITION は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
187
第 6 章 : 条件処理
DECLARE CONDITION
使用上の注意
DECLARE CONDITION 文に よ り 、 条件に対す る シ ン ボル名を宣言 し 、 オプシ ョ ン
と し て特定の SQLSTATE 値にそれを関連付け る こ と がで き ます。 こ れで、
SQLSTATE 値が ど の よ う な条件を表わすのか簡単に想起で き ます。
使用可能な SQLSTATE 値で表わ さ れ る 条件が自分のニーズに合わない場合、 自分の
ス ト ア ド ・ プ ロ シージ ャ 固有のカ ス タ ム条件を定義す る こ と がで き ます。
ユーザー定義条件を宣言す る には、 条件宣言では SQLSTATE 値を割当てずに条件
名を宣言す る だけです。 こ の場合、 Teradata Database は condition_name を ユーザー
定義条件 と し て扱い ます。 SIGNAL 文に条件名を付けて使用す る と 、 明示的にユー
ザー定義条件を発生 さ せ る こ と がで き ます。 SIGNAL 文については、 「SIGNAL」
(219 ページ ) を参照 し て く だ さ い。
規則
次のルールが、 条件宣言に適用 さ れます。
• 条件名は有効な識別子でなければな り ません。 名前は、 ロ ーカル変数、 パ ラ
メ ー タ 、 FOR ループの別名 / 列、 ま たは ス ト ア ド ・ プ ロ シージ ャ で宣言 さ れた
ラ ベル名にす る こ と がで き ます。 「例 1」 (189 ページ ) では、 こ のルールについ
て説明 し てい ます。
• オプシ ョ ン と し て、 条件名を SQLSTATE 値に関連付け る こ と がで き ます。 「例 1」
(189 ページ ) では、 条件名 divide_by_zero を SQLSTATE 値 '22012' に関連付けて
い ます。
• 同 じ 条件名を、 別の入れ子ま たは入れ子ではない複合文で宣言で き ます。
それぞれの複合文内で、 その条件名を同 じ SQLSTATE 値に割当てた り 、
別の SQLSTATE 値に割当てた り で き ます。 複合文の有効範囲設定ルールに よ り 、
それぞれの宣言で別の条件を定義す る こ と がで き ます。 「例 2」 (189 ページ ) と
「例 3」 (190 ページ ) では、 こ のルールについて説明 し てい ます。
• 同 じ 複合文内で同 じ 条件名を複数回宣言す る こ と はで き ません。 その よ う な指
定をす る と 、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ ル中にエ ラ ー SPL1080 が報告
さ れ、 その ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。 「例 6」 (191 ページ ) で
は、 こ のルールについて説明 し てい ます。
• 条件 と 変数の宣言は、 複合文内で他の タ イ プの宣言を行な う 前に行な う 必要が
あ り ます。 「例 1」 (189 ページ ) では、 こ のルールについて説明 し てい ます。
• 同 じ 複合文内で同 じ SQLSTATE 値に関連付けた 1 つ以上の条件名を宣言す る こ
と はで き ません。 その よ う な指定をす る と 、 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ
イ ル中にエ ラ ー SPL1081 が報告 さ れ、 その ス ト ア ド ・ プ ロ シージ ャ は作成 さ れ
ません。 「例 7」 (191 ページ ) では、 こ のルールについて説明 し てい ます。
• SQLSTATE 値に対 し て定義 さ れたハン ド ラ ーは、 その SQLSTATE 値に関連付
け ら れた明示的に宣言 さ れた条件 も 処理で き ます。 「例 5」 (190 ページ ) では、
こ のルールについて説明 し てい ます。
188
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE CONDITION
例1
次の例は、 ロ ーカル変数、 条件、 お よ び別名に同 じ 名前を使用す る 場合を示 し てい
ます。
• divide_by_zero は、 変数お よ び条件名 と し て使用 さ れ る 。
• IOParam1 は、 パ ラ メ ー タ お よ び条件名 と し て使用 さ れ る 。
• cs1 は、 ラ ベル名お よ び条件名 と し て使用 さ れ る 。
CREATE PROCEDURE dec1(INOUT IOParam1 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero INTEGER;
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012';
DECLARE IOParam1 CONDITION;
DECLARE cs1 CONDITION;
DECLARE alias1 CONDITION;
FOR rp1 AS c_rp1
CURSOR FOR
SELECT c1 AS alias1 FROM tab1
DO
SET IOParam1 = rp1.alias1;
END FOR;
...
END cs1;
例2
次の例は、 複合文内での さ ま ざ ま な条件名の使用法を示 し てい ます。 条件宣言は、
同 じ 条件名 divide_by_zero を定義 し てい ま すが、 宣言は別の複合文内で行われ、
同 じ ま たは異な る 条件を それぞれの複合文内で定義 し てい ます。
CREATE PROCEDURE dec2()
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012';
cs2: BEGIN
DECLARE divide_by_zero CONDITION;
cs3: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012';
...
END cs3;
cs4: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '42000';
...
END cs4;
...
END cs2;
...
END cs1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
189
第 6 章 : 条件処理
DECLARE CONDITION
例3
次の例は、 複合文内での条件名の有効範囲を示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中、 行 3 で宣言 さ れてい る 条件名 exception_cond の
有効範囲は、 複合文 cs1 お よ び cs2 です。 行 7 で宣言 さ れてい る exception_cond の
有効範囲は cs2 です。 cs2 での exception_cond の宣言に よ り 、 cs1 での exception_cond
の定義が上書 き さ れます。
行 10 の INSERT 文に よ り 、 例外 ERRTEQTVNOEXIST (SQLCODE 3807 お よ び
SQLSTATE '42000') が発生 し ます。 CONTINUE ハン ド ラ ーは、 cs2 で SQLSTATE
'42000' に関連付け ら れてい る exception_cond を処理す る よ う 定義 さ れてい る ので、
こ の ( 行 8 で宣言 さ れてい る ) ハン ド ラ ーが呼び出 さ れます。
行 13 の INSERT 文で も 、 例外 ERRTEQTVNOEXIST が発生 し ます。 し か し 、 cs1
(INSERT 文の外側にあ る 複合文 ) では SQLSTATE '42000' を処理す る よ う 宣言 さ れ
たハン ド ラ ーがないので、 ス ト ア ド ・ プ ロ シージ ャ は例外 ERRTEQTVNOEXIST
(SQLCODE 3807 お よ び SQLSTATE '42000') で終了 し ます。
1. CREATE PROCEDURE dec3()
2. cs1: BEGIN
3.
DECLARE exception_cond CONDITION FOR SQLSTATE VALUE '22012';
4.
DECLARE CONTINUE HANDLER FOR exception_cond
5.
...
6.
cs2: BEGIN
7.
DECLARE exception_cond CONDITION FOR SQLSTATE VALUE '42000';
8.
DECLARE CONTINUE HANDLER FOR exception_cond
9.
...
10.
INSERT INTO Tab1 VALUES (10); -- Raises exception '42000'
11.
...
12.
END cs2;
13.
INSERT INTO Tab1 VALUES (10); -- Unhandled exception '42000'
14.
...
15. END cs1;
例4
次の例は、 複合文内での さ ま ざ ま な条件名の使用法を示 し てい ます。 条件名
divide_by_zero と balance_too_low は、 ど ち ら も 同 じ 複合文内で宣言 さ れてい ます。
CREATE PROCEDURE dec4()
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012';
DECLARE balance_too_low CONDITION;
...
END cs1;
例5
次の例は、 あ る SQLSTATE 値に関連す る 例外を処理す る よ う 定義 さ れてい る ハン ド
ラ ーが、 その SQLSTATE 値に関連付け ら れた明示的条件 も 処理で き る こ と を示 し て
い ます。 ス ト ア ド ・ プ ロ シージ ャ の実行中、 CONTINUE ハン ド ラ ーは divide-byzero 条件 と SQLSTATE '22012' と な る 例外を処理で き ます。
190
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE CONDITION
CREATE PROCEDURE dec5()
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012';
DECLARE CONTINUE HANDLER FOR SQLSTATE '22012'
...
SET IOPar1 = 10/0;
...
SIGNAL divide_by_zero;
...
END cs1;
例6
同 じ 複合文内で同 じ 条件名を複数回使用す る こ と はで き ません。 次の例では、 条件
名 divide_by_zero は、 複合文 cs1 内で 2 回宣言 さ れてい ます。 ス ト ア ド ・ プ ロ シー
ジ ャ の コ ンパ イ ル中に、 エ ラ ー SPL1080 が報告 さ れ、 ス ト ア ド ・ プ ロ シージ ャ は作
成 さ れません。
CREATE PROCEDURE dec6()
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012';
DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '42000';
...
END cs1;
例7
同じ複合文内で、 同じ SQLSTATE 値を異な る条件名に関連付け る こ と はで き ません。
次の例では、 SQLSTATE 値 '22012' は、 同 じ 複合文内で条件名 divide_by_zero と
zero_division の両方に関連付け ら れてい ます。 ス ト ア ド ・ プ ロ シージ ャ の コ ンパ イ
ル中に、 エ ラ ー SPL1081 が報告 さ れ、 ス ト ア ド ・ プ ロ シージ ャ は作成 さ れません。
CREATE PROCEDURE dec7()
BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE zero_division CONDITION FOR SQLSTATE '22012';
...
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
191
第 6 章 : 条件処理
DECLARE HANDLER ( 基本構文 )
DECLARE HANDLER ( 基本構文 )
目的
条件ハン ド ラ ーに、 ス ト ア ド ・ プ ロ シージ ャ で処理 さ れ る 1 つ以上の例外、 完了、
ま たはユーザー定義の条件を関連付け ます。
呼出 し
実行可能な制御宣言。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
DECLARE
HANDLER
CONTINUE
FOR
A
EXIT
,
A
sqlstate_code
SQLSTATE
handler_action _statement
;
VALUE
condition_name
,
SQLEXCEPTION
SQLWARNING
NOT FOUND
1101A563
説明
構文要素
指定内容
CONTINUE
EXIT
実行す る ハン ド ラ ー ・ ア ク シ ョ ンの タ イ プ。
sqlstate_code
処理す る 5 文字 リ テ ラ ルの SQLSTATE コ ー ド 。
SQLSTATE コ ー ド と その意味の リ ス ト については、 付録 D:
「SQLSTATE のマ ッ ピ ン グ」 を参照 し て く だ さ い。
有効な SQLSTATE 値を コ ン マで区切っ てい く つで も リ ス ト で指
定で き ますが、 文の正常完了を表わす '00000' を使 う こ と はで き
ません。
SQLEXCEPTION
SQLWARNING
NOT FOUND
192
処理対象の一般条件。
一般条件の う ちの 1 つ、 ま たはその条件の任意の組み合わせを、
コ ン マで区切っ た リ ス ト に し て指定す る こ と がで き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER ( 基本構文 )
構文要素
指定内容
condition_name
処理す る 条件の名前を指定 し ます。 「DECLARE CONDITION」
(187 ページ ) を参照 し て く だ さ い。
handler_action_
statement
ハン ド ラ ー ・ ア ク シ ョ ン を定義す る 複合文に入っ た単一文ま た
は複合文。
ハン ド ラ ー ・ ア ク シ ョ ンは、 特定の例外ま たは完了状態がアプ
リ ケーシ ョ ンに戻 さ れた場合、 ま たは、 ユーザー定義条件が発
生 し た場合に実行 さ れます。
文は、 以下のいずれかにな り ます。
•
ス ト ア ド ・ プ ロ シージ ャ でサポー ト さ れ る DML、 DDL、 ま た
は DCL 文。 こ れには、 動的 SQL が含ま れ ます。
• 制御文 ( 入れ子の複合文 も 含む )
宣言 ( ロ ーカル変数、 条件、 カー ソ ル、 ま たはハン ド ラ ー ) 文
は、 ハ ン ド ラ ー ・ ア ク シ ョ ン では単一文 と し ては使用で き ま
せん。 こ れは、 複合文の中か ら 実行依頼で き ます。
ANSI への準拠
DECLARE HANDLER は、 ANSI/ISO SQL2011 に準拠 し てい ます。
許可
な し。
使用上の注意
ハン ド ラ ー宣言内で、 次のいずれか を指定で き ますが、 両方は指定で き ません。
• SQLSTATE 値や条件名の リ ス ト
• 一般条件の リ ス ト
同 じ 条件名、 SQLSTATE コ ー ド 、 ま たは一般条件を同 じ 複合文内のハン ド ラ ー宣言
で繰 り 返す こ と はで き ません。
同 じ 複合文内のハン ド ラ ー宣言で、 条件名 と その条件名に関連付け ら れた
SQLSTATE 値の両方を指定す る こ と はで き ません。
詳細は、 「条件ハン ド ラ ーのルール」 (164 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
193
第 6 章 : 条件処理
DECLARE HANDLER (CONTINUE タ イ プ )
DECLARE HANDLER (CONTINUE タ イ プ )
CONTINUE ハン ド ラ ーは、 制御の フ ロ ーに影響す る ほ ど重大でない完了条件や例
外条件を処理す る のに役立ち ます。
CONTINUE ハン ド ラ ー ・ ア ク シ ョ ン
条件が発生す る と 、 CONTINUE ハン ド ラ ーは以下の処理を行ない ます。
1
ハン ド ラ ー ・ ア ク シ ョ ン を実行 し ます。
2
それを呼び出 し た文の次の文に制御を渡 し ます。
3
条件を発生 さ せた文に続 く 、 残 り のすべての SQL 文を実行 し ます。
4
以下の表では、 発生 し た例外に よ っ て CONTINUE ハン ド ラ ーがア ク テ ィ ブに さ
れた と き の制御の フ ロ ーについて説明 し てい ます。
状況
次の ス テ ッ プでの制御の行先
ハ ン ド ラ ー ・ ア ク シ ョ ン が正常に完了
した
条件 を 発生 さ せた文の後に続 く 文に戻 り
ま す。
FOR、 IF、 LOOP、 ま たは WHILE な ど
の制御文に組み込まれた文に よ っ て例外
が発生 し た
制御文に よ っ て例外が発生 し た ( た と え
ば、 条件式を評価す る と き に )
5
条件を発生 さ せた制御文の後に続 く 文に渡
り ます。
ハ ン ド ラ ー ・ ア ク シ ョ ン で例外条件や完了条件が発生 し 、 そのハ ン ド ラ ー ・
ア ク シ ョ ン内に適当なハン ド ラ ーが存在す る 場合、 新 し く 発生 し たその条件は
処理 さ れます。
制御がハン ド ラ ー ・ ア ク シ ョ ン句に戻 り ます。
6
プ ロ セ ス終了。
例 CONTINUE ハン ド ラ ーの例
以下の例は、 CONTINUE ハン ド ラ ーの動作を示 し てい ます。 こ の例は、 以下の ス
ト ア ド ・ プ ロ シージ ャ 定義に基づいてい ます。
CREATE PROCEDURE spSample4()
BEGIN
DECLARE hNumber INTEGER;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
INSERT INTO Proc_Error_Table
(:SQLSTATE, CURRENT_TIMESTAMP, 'spSample4',
'Failed to Insert Row');
194
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (CONTINUE タ イ プ )
-- Statement_4_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_4_2
INSERT INTO EmpNames VALUES (1002, 'Thomas');
-- If the EmpNames table had been dropped, Statement_4_2
-- returns SQLEXCEPTION that is handled.
-- Statement_4_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
例 1: ANSI セ ッ シ ョ ン ・ モー ド
次の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample4();
SQL 文で、 ANSI セ ッ シ ョ ン ・ モー ド でのデ ッ ド ロ ッ ク な ど のエ ラ ー条件や障害条
件が報告 さ れた場合、 その条件は条件ハン ド ラ ーを使用 し て処理 さ れます。
以下の一連の イ ベン ト では、 上記の 3 つの SQL 文が ANSI セ ッ シ ョ ン ・ モー ド で
呼び出 さ れた場合の、 エ ラ ー条件がそれ ら の文に及ぼす影響について説明 し てい
ま す。
1
Statement_4_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 SQLSTATE コ ー ド
'42000' の例外を発生 さ せます。 要求は ロ ールバ ッ ク さ れます。
2
'42000' 条件に対す る ハン ド ラ ーが呼び出 さ れます。
3
こ のハン ド ラ ー ・ タ イ プが CONTINUE の場合、 ハン ド ラ ー ・ ア ク シ ョ ンの完了
後に制御は Statement_4_3 に渡 さ れます。
4
以下の項目は未 コ ミ ッ ト の ま ま残 さ れます。
5
•
•
最初の 2 つの対話式 SQL 文
Statement_4_1
•
Statement_4_3
•
spSample4 内の条件ハン ド ラ ーか ら 呼び出 さ れ る INSERT 文。
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
195
第 6 章 : 条件処理
DECLARE HANDLER (CONTINUE タ イ プ )
以下の一連の イ ベン ト では、 上記の 3 つの SQL 文が ANSI セ ッ シ ョ ン ・ モー ド で呼
び出 さ れた場合の、 障害条件がそれ ら の文に及ぼす影響について説明 し てい ます。
1
Statement_4_2 と し てマー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文 (CALL spSample4 ()
文に よ っ て呼び出 さ れ る ) は、 障害条件を示す SQLSTATE コ ー ド を戻 し ます。
2
Statement_4_1 の結果 と 最初の 2 つの対話式で入力 さ れた SQL 文の結果は ロ ール
バ ッ ク さ れ、 ト ラ ンザ ク シ ョ ンは ロ ールバ ッ ク さ れます。
3
戻 さ れた SQLSTATE コ ー ド は、 ブ ロ ッ ク 用に定義 さ れた CONTINUE ハ ン ド
ラ ーを呼び出 し ます。 こ のハン ド ラ ーは、 該当す る 条件 (ANSI セ ッ シ ョ ン ・
モー ド の障害 ) を処理す る ために作成 さ れてい ます。
4
ハン ド ラ ー ・ タ イ プが CONTINUE であ る ため、 ス ト ア ド ・ プ ロ シージ ャ はハン
ド ラ ー ・ ア ク シ ョ ン文 と Statement_4_3 を新規 ト ラ ン ザ ク シ ョ ン と し て送 り 、
ス ト ア ド ・ プ ロ シージ ャ は、 ハン ド ラ ー ・ ア ク シ ョ ンが完了 し た後の次の文に
進みます。
5
プ ロ セ ス終了。
例 2: Teradata セ ッ シ ョ ン ・ モー ド
次の例では、 以下の 3 つの SQL 文が BTEQ か ら Teradata セ ッ シ ョ ン ・ モー ド で対
話式に呼び出 さ れ る こ と を想定 し てい ます。 文は Teradata セ ッ シ ョ ン ・ モー ド で呼
び出 さ れ る ため、 各文は暗黙的な ト ラ ンザ ク シ ョ ン と な り ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample4();
上記の 3 つの SQL ス テー ト メ ン ト が Teradata セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る
と 、 次の一連の イ ベン ト が起 こ り ます。
196
1
Statement_4_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 SQLSTATE コ ー ド
'42000' の例外を発生 さ せます。 暗黙の文は ロ ールバ ッ ク さ れます。
2
SQLSTATE コ ー ド '42000' は、 該当す る 条件を処理す る ために定義 さ れた
CONTINUE ハン ド ラ ーを呼び出 し ます。
3
こ のハン ド ラ ー ・ タ イ プは CONTINUE であ る ため、 Statement_4_1 に よ っ て行な
われた変更は影響を受け ません。
4
最初の 2 つの BTEQ 要求は暗黙的な ト ラ ンザ ク シ ョ ンであ る ため、 更新内容は
ロ ールバ ッ ク さ れません。
5
ハン ド ラ ー ・ ア ク シ ョ ンが完了 し た後に、 制御は Statement_4_3 に渡 さ れます。
6
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (CONTINUE タ イ プ )
例 3: Teradata セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら Teradata セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。 シーケ ン ス の開始の BT 文は、 SQL 文を
単一の明示的な ト ラ ンザ ク シ ョ ンに し てい ます。
BT;
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample4();
上記の 3 つの SQL ス テー ト メ ン ト が Teradata セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る
と 、 次の一連の イ ベン ト が起 こ り ます。
1
Statement_4_1、 Statement_4_2、 お よ び最初の 3 つの BTEQ 要求に よ っ て行なわ
れた更新内容は、 すべて ロ ールバ ッ ク さ れます。
2
Statement_4_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 障害条件を示す
SQLSTATE の例外を発生 さ せます。
3
障害条件は、 該当す る 条件を処理す る ために定義 さ れた CONTINUE ハン ド
ラ ーを呼び出 し ます。
4
ハ ン ド ラ ー ・ タ イ プが CONTINUE で あ る ため、 Statement_4_3 はハ ン ド ラ ー ・
ア ク シ ョ ンの完了後に実行 さ れます。
注 : ハン ド ラ ー ・ ア ク シ ョ ン と Statement_4_3 の ど ち ら も 暗黙的な ト ラ ンザ ク
シ ョ ン と し て実行 さ れます。 こ れは、 最初の BT の影響が、 ス テ ッ プ 2 での ロ ー
ルバ ッ ク 時に取 り 消 さ れたためです。
5
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
197
第 6 章 : 条件処理
DECLARE HANDLER (EXIT タ イ プ )
DECLARE HANDLER (EXIT タ イ プ )
EXIT ハン ド ラ ーは、 プ ロ シージ ャ を終了す る ほ ど重大な条件を扱い ます。
EXIT ハン ド ラ ー ・ ア ク シ ョ ン
条件が発生す る と 、 EXIT ハン ド ラ ーは以下の処理を行ない ます。
1
ハン ド ラ ー ・ ア ク シ ョ ン を実行 し ます。
2
ハン ド ラ ーが宣言 さ れた BEGIN…END 複合文を暗黙的に終了 し ます。
3
ス ト ア ド ・ プ ロ シージ ャ の実行は、 複合文の外の残 り の文へ と 続行 し ま す。
プ ロ シージ ャ に他の文が含まれていない場合、 プ ロ シージ ャ は終了 し 、 制御が
呼び出 し 元に渡 り ます。
4
以下の表では、 発生 し た例外条件や完了条件に よ っ て EXIT ハン ド ラ ーがア ク
テ ィ ブに さ れた と き の制御の フ ロ ーについて説明 し てい ます。
状況
プ ロ セ ス の次の ス テ ッ プ
ハン ド ラ ー ・ ア ク シ ョ ン が正常
に完了 し た
制御が複合文の終了に渡 る か、 あ る いは、 ト ッ プ ・ レ
ベルであれば、 ス ト ア ド ・ プ ロ シージ ャ が終了 し ます。
複合文で宣言 さ れてい る 開いたすべてのカー ソ ルが暗
黙的に閉 じ ら れ ます。
こ のプ ロ シージ ャ の CREATE
PROCEDURE 文が、 INOUT ま
たは OUT パ ラ メ ー タ を定義 し
てい る
SUCCESS 応答におけ る ACTIVITY_COUNT の値
は 1 に設定 さ れ ます。
プ ロ シージ ャ で INOUT ま たは
OUT パ ラ メ ー タ が定義 さ れて
いない
SUCCESS 応答におけ る ACTIVITY_COUNT の値
は 0 に設定 さ れ ます。
呼び出 し 元が ス ト ア ド ・ プ ロ
シージ ャ であ る
呼び出 し 元の ス ト ア ド ・ プ ロ シージ ャ 内の ス テー タ
ス 変数は、 戻 さ れ た条件 コ ー ド に適 し た値に設定 さ
れ ま す。
SQLSTATE の場合、 値は '00000' に設定 さ れます。
SQLCODE の場合、 値は 0 に設定 さ れ ます。
制御文に よ っ て例外が発生 し た
制御は呼び出 さ れた EXIT ハン ド ラ ーの入っ てい る 複
合文を終了 し ます。
5
ハン ド ラ ー ・ ア ク シ ョ ンで条件が発生 し た場合、 そのハン ド ラ ー ・ ア ク シ ョ ン
句の中でハン ド ラ ーが定義 さ れていれば、 その条件は処理 さ れます。
6
プ ロ セ ス終了。
「ハン ド ラ ー ・ ア ク シ ョ ンで発生す る 条件」 (173 ページ ) を参照 し て く だ さ い。
198
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (EXIT タ イ プ )
EXIT ハン ド ラ ーの例
以下の例は、 EXIT ハン ド ラ ーの動作を示 し てい ます。 こ の例は、 以下の ス ト ア ド ・
プ ロ シージ ャ 定義に基づいてい ます。
CREATE PROCEDURE spSample5()
BEGIN
DECLARE hNumber INTEGER;
DECLARE EXIT HANDLER
FOR SQLSTATE ’42000’
INSERT INTO Proc_Error_Table
(:SQLSTATE, CURRENT_TIMESTAMP, ’spSample5’,
’Failed to Insert Row’);
-- Statement_5_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_5_2
INSERT INTO EmpNames VALUES (1002, ’Thomas’);
-- If the EmpNames table had been dropped, Statement_5_2
-- returns an SQLSTATE code of ’42000’ that is handled.
-- Statement_5_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
続 く 例では、 ス ト ア ド ・ プ ロ シージ ャ に複合文が 1 つ し か含 ま れていないので、
ハン ド ラ ー ・ ア ク シ ョ ンが完了す る と 、 制御は ス ト ア ド ・ プ ロ シージ ャ を終了 し
て、 呼び出 し 元に渡 り ます。
注 : 入れ子の複合文を含むス ト ア ド ・ プ ロ シージ ャ の場合、 こ れ ら の例で説明 さ れ
てい る EXIT ハン ド ラ ーの有効範囲 と 動作は、 ハン ド ラ ーの定義を含む複合文にの
み当ては ま り ます。
複合文の中で定義 さ れて い る ハ ン ド ラ ーが、 発生 し た条件 を 処理で き な い場合、
その条件は適当なハン ド ラ ーを探すために外側に伝搬 さ れます。
例 1: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample5();
障害条件ではない例外条件が報告 さ れ る と 、 次の よ う な一連の イ ベン ト が起 こ り
ま す。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
199
第 6 章 : 条件処理
DECLARE HANDLER (EXIT タ イ プ )
1
Statement_5_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 SQLSTATE コ ー ド
'42000' の例外を発生 さ せます。 要求は ロ ールバ ッ ク さ れます。
2
SQLSTATE コ ー ド '42000' は、 特定の条件を処理す る ために定義 さ れた EXIT
ハ ン ド ラ ーを呼び出 し ます。
3
こ のハン ド ラ ー ・ タ イ プは EXIT であ る ため、 Statement_5_1 に よ っ て行なわれ
た変更は影響を受け ません。
ハ ン ド ラ ー ・ ア ク シ ョ ン が完了 し た後に、 制御は呼び出 し 元に渡 さ れ ま す。
ス ト ア ド ・ プ ロ シージ ャ におい て、 呼び出 し 元の複合文の外に他の文が あ る
場合、 制御は呼び出 し 元の複合文の外の次の文に渡 り ます。
対話式で呼び出 さ れた最初の SQL 文に よ っ て開始 さ れた暗黙的な ト ラ ンザ ク
シ ョ ンは、 未解決の ま ま残 り ます。
4
プ ロ セ ス終了。
障害条件であ る 例外条件が報告 さ れ る と 、 次の よ う な事柄が起 こ り ます。
1
Statement_5_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 障害条件を示す
SQLSTATE の例外を発生 さ せます。
2
Statement_5_1、 Statement_5_2、 お よ び対話式で入力 さ れた最初の 2 つの SQL
文の結果は ロ ールバ ッ ク さ れます。
3
戻 さ れた SQLSTATE コ ー ド に よ り 、 その特定の条件に対 し て定義 さ れてい る
EXIT ハン ド ラ ーが呼び出 さ れます。
4
ハン ド ラ ー ・ ア ク シ ョ ンの完了後、 制御が呼び出 し 元の複合文を終了 し 、 次の
文があれば、 次の文に渡 り ます。
5
EXIT ハン ド ラ ーで実行 さ れた SQL 文の う ち、 コ ミ ッ ト さ れていない も のがあ
る 場合、 新規 ト ラ ンザ ク シ ョ ンは未解決の ま ま残 り ます。
6
プ ロ セ ス終了。
例 2: Teradata セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら Teradata セ ッ シ ョ ン ・ モー ド で対
話式に呼び出 さ れ る こ と を想定 し てい ます。 文は Teradata セ ッ シ ョ ン ・ モー ド で呼
び出 さ れ る ため、 各文は暗黙的な ト ラ ンザ ク シ ョ ン と な り ます。
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample5();
上記の 3 つの SQL ス テー ト メ ン ト が Teradata セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る
と 、 次の一連の イ ベン ト が起 こ り ます。
200
1
Statement_5_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 SQLSTATE コ ー ド
'42000' の例外を発生 さ せます。 暗黙の文は ロ ールバ ッ ク さ れます。
2
SQLSTATE コ ー ド '42000' は、 その特定の条件のために定義 さ れた EXIT ハン ド
ラ ーを呼び出 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (EXIT タ イ プ )
3
こ のハン ド ラ ー ・ タ イ プが EXIT であ り 、 Statement_5_1 が暗黙的な ト ラ ンザ ク
シ ョ ンで実行 さ れたため、 こ の文に よ っ て行なわれた更新内容は影響を受け ま
せん。
4
最初の 2 つの BTEQ 要求は暗黙的な ト ラ ンザ ク シ ョ ンであ る ため、 更新内容は
ロ ールバ ッ ク さ れません。
5
ハン ド ラ ー ・ ア ク シ ョ ンの完了後、 制御が呼び出 し 元の複合文を終了 し 、 次の
文があれば、 次の文に渡 り ます。
6
プ ロ セ ス終了。
例 3: Teradata セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら Teradata セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。 シーケ ン ス の開始の BT 文は、 SQL 文を
単一の明示的な ト ラ ンザ ク シ ョ ンに し てい る こ と に注意 し て く だ さ い。
BT;
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample5();
上記の 3 つの SQL ス テー ト メ ン ト が Teradata セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る
と 、 次の一連の イ ベン ト が起 こ り ます。
1
Statement_5_2 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 障害条件を示す
SQLSTATE コ ー ド '42000' の例外を発生 さ せます。
2
Statement_5_1、 Statement_5_2、 お よ び最初の 3 つの BTEQ 要求に よ っ て行なわ
れた更新内容は、 すべて ロ ールバ ッ ク さ れます。
3
障害条件は、 該当す る 条件を処理す る ために定義 さ れた EXIT ハン ド ラ ーを呼び
出 し ます。
4
ハ ン ド ラ ー ・ タ イ プが EXIT なので、 ハ ン ド ラ ー ・ ア ク シ ョ ン が完了す る と 、
制御が複合文を終了 し 、 次の文があれば、 次の文に渡 り ます。
注 : ハン ド ラ ー ・ ア ク シ ョ ンは暗黙的な ト ラ ンザ ク シ ョ ン と し て実行 さ れます。
こ れは、 最初の BT の影響が、 ス テ ッ プ 2 での ロ ールバ ッ ク 時に取 り 消 さ れたた
めです。
5
プ ロ セ ス終了。
COMMIT 文を含む EXIT ハン ド ラ ーの例
以下の例は、 COMMIT ト ラ ンザ ク シ ョ ン制御文の入っ た EXIT ハン ド ラ ーの動作を
示 し てい ます。 こ の例では、 以下の ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample6()
BEGIN
DECLARE hNumber INTEGER;
DECLARE EXIT HANDLER
FOR SQLSTATE ’42000’
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
201
第 6 章 : 条件処理
DECLARE HANDLER (EXIT タ イ プ )
INSERT INTO Proc_Error_Table
(:SQLSTATE, CURRENT_TIMESTAMP, ’spSample6’,
’Failed to Insert Row’);
-- Statement_6_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_6_2
COMMIT;
-- Statement_6_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
-- Statement_6_4
INSERT INTO EmpNames VALUES (1002, ’Thomas’);
-- If the EmpNames table had been dropped, Statement_6_2
-- returns an SQLSTATE code of ’42000’ that is handled.
END;
例 1: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample6();
障害条件ではない例外条件が報告 さ れ る と 、 次の よ う な一連の イ ベン ト が起 こ り
ま す。
202
1
ス ト ア ド ・ プ ロ シージ ャ か ら 出 さ れた最初の 2 つの BTEQ 要求 と 、 Statement_6_1
お よ び Statement_6_2 は、 通常通 り に実行 さ れ、 コ ミ ッ ト さ れます。
2
Statement_6_3 は新規 ト ラ ンザ ク シ ョ ン を開始 し ます。
3
Statement_6_4 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 SQLSTATE コ ー ド
'42000' の例外を発生 さ せます。
4
Statement_6_4 は ロ ールバ ッ ク さ れます。
5
SQLSTATE コ ー ド '42000' は、 特定の条件を処理す る ために定義 さ れた EXIT
ハ ン ド ラ ーを呼び出 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (EXIT タ イ プ )
6
こ のハ ン ド ラ ー ・ タ イ プは EXIT な ので、 ハ ン ド ラ ー ・ ア ク シ ョ ン が完了す
る と 、 制御が複合文 を 終了 し 、 そ の複合文の外の次の文が あ れば、 そ こ に渡
り ま す。 ス ト ア ド ・ プ ロ シージ ャ に他の文が含まれていない場合、 プ ロ シー
ジ ャ は終了 し 、 制御が呼び出 し 元に渡 り ます。
ハ ン ド ラ ー ・ ア ク シ ョ ン は、 Statement_6_3 に よ っ て開始 さ れた ト ラ ン ザ ク
シ ョ ン 内で実行 さ れます。
7
プ ロ セ ス終了。
例外条件 ( 障害条件 ) が報告 さ れ る と 、 次の よ う な事柄が起 こ り ます。
1
Statement_6_4 と マー ク さ れた ス ト ア ド ・ プ ロ シージ ャ 文は、 障害条件を示す
SQLSTATE の例外を発生 さ せます。
2
Statement_6_1、 Statement_6_2、 お よ び対話式で入力 さ れた最初の 2 つの SQL 文
の結果は ロ ールバ ッ ク さ れません。
Statement_6_4 で障害が発生す る と 、 Statement_6_4 の ト ラ ンザ ク シ ョ ン と
Statement_6_3 (Statement_6_3 が コ ミ ッ ト さ れなか っ たため ) の ト ラ ンザ ク シ ョ ン
が ロ ールバ ッ ク さ れます。
3
ハン ド ラ ー ・ ア ク シ ョ ン文は新規 ト ラ ンザ ク シ ョ ン を開始 し ます。
4
障害条件は、 該当す る 条件を処理す る ために定義 さ れた EXIT ハン ド ラ ーを呼び
出 し ます。
ハン ド ラ ー ・ ア ク シ ョ ンの完了後、 制御が呼び出 し 元の複合文を終了 し 、 次の
文があれば、 次の文に渡 り ます。
ス ト ア ド ・ プ ロ シージ ャ に他の文が含まれていない場合、 プ ロ シージ ャ は終了
し 、 制御が呼び出 し 元に渡 り ます。
5
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
203
第 6 章 : 条件処理
DECLARE HANDLER (SQLEXCEPTION タ イ プ )
DECLARE HANDLER (SQLEXCEPTION タ イ プ )
SQLEXCEPTION は、 すべての例外条件用の SQLSTATE コ ー ド を表わす一般条件
です。 文の実行中に例外条件が発生 し た場合に、 該当す る 例外条件を処理す る ハン
ド ラ ーが存在 し ない と 、 SQLEXCEPTION に関連 し たハン ド ラ ーが呼び出 さ れます。
SQLEXCEPTION ハン ド ラ ーは、 EXIT ハン ド ラ ーま たは CONTINUE ハン ド ラ ー と
し て記述す る こ と がで き ます。
SQLEXCEPTION ハン ド ラ ー ・ ア ク シ ョ ン
以下の表では、 発生 し た例外に よ っ て SQLEXCEPTION ハン ド ラ ーがア ク テ ィ ブに
さ れた と き の制御の フ ロ ーについて説明 し てい ます。
1
ス ト ア ド ・ プ ロ シージ ャ 内の文に よ り 、 例外が発生 し ます。
2
特定の例外条件を処理す る ハン ド ラ ーが存在 し なければ、 汎用の条件ハン ド
ラ ーが呼び出 さ れます。
3
SQLEXCEPTION ハン ド ラ ーは、 指定 さ れた ア ク シ ョ ン を実行 し ます。
4
プ ロ セ ス の次の ス テ ッ プは、 ハン ド ラ ー ・ タ イ プに よ っ て異な り ます。
5
ハン ド ラ ー ・ タ イ プ
制御の行先
CONTINUE
現在のブ ロ ッ ク にあ る 次の文。
EXIT
現在のブ ロ ッ ク の終わ り 。
特定のハン ド ラ ー と の対話は、 状況に応 じ て変化 し ます。
例については、 「例 3: 同一のプ ロ シージ ャ 内の特定の条件ハン ド ラ ー と 汎用の条
件ハン ド ラ ー」 (206 ページ ) を参照 し て く だ さ い。
6
プ ロ セ ス終了。
例 1: 汎用条件ハン ド ラ ー
以下の例は、 SQLEXCEPTION ハン ド ラ ーの動作を示 し てい ま す。 こ の例では、
以下の ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample11()
BEGIN
DECLARE hNumber INTEGER;
DECLARE EXIT HANDLER
FOR SQLEXCEPTION
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, ’spSample11’, ’Generic
handler performed’);
-- Statement_11_1
204
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (SQLEXCEPTION タ イ プ )
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_11_2
INSERT INTO EmpNames VALUES (1002, ’Thomas’);
-- If the EmpNames table had been dropped,
-- Statement_11_2 returns SQLSTATE ’42000’ that is handled.
-- Statement_11_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1003;
END;
例 2: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample11();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
呼び出 し 先の ス ト ア ド ・ プ ロ シージ ャ の中の Statement_11_2 は、 SQLSTATE
'42000' のエ ラ ー条件を発生 さ せます。 SQLSTATE コ ー ド '42000' 用の特定のハン
ド ラ ーは存在 し ないため、 こ の条件は、 SQLEXCEPTION ハン ド ラ ーに よ っ て処
理 さ れます。
2
Statement_11_2 は ロ ールバ ッ ク さ れます。
3
条件ハン ド ラ ーが EXIT ハン ド ラ ーであ る ため、 ハン ド ラ ー ・ ア ク シ ョ ンの完了
後に制御は呼び出 し 元に渡 さ れます。
ス ト ア ド ・ プ ロ シージ ャ に入れ子のブ ロ ッ ク が含まれてい る 場合、 制御は呼び
出 し 元の複合文の次の文に渡 り ます。
4
5
以下の項目はア ク テ ィ ブの ま ま残 り 、 コ ミ ッ ト さ れません。
•
•
最初の 2 つの対話式 SQL 文
Statement_11_1
•
ハン ド ラ ー内の INSERT 文
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
205
第 6 章 : 条件処理
DECLARE HANDLER (SQLEXCEPTION タ イ プ )
例 3: 同一のプ ロ シージ ャ内の特定の条件ハン ド ラ ー と 汎用の条件ハン ド ラ ー
次の例は、 SQLEXCEPTION ハン ド ラ ー と 特定の条件ハン ド ラ ーの両方の
DECLARE HANDLER ハン ド ラ ーが、 ス ト ア ド ・ プ ロ シージ ャ で組み合わ さ れた と
き に ど の よ う に動作す る かを示 し てい ます。 こ の例では、 以下の ス ト ア ド ・ プ ロ
シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample12()
BEGIN
DECLARE hNumber INTEGER;
DECLARE CONTINUE HANDLER
FOR SQLEXCEPTION
-- Handler_1
BEGIN
UPDATE exception_table
SET exception_count = exception_count + 1;
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, ’spSample12’, 'Failed to insert
row');
END;
DECLARE EXIT HANDLER FOR SQLSTATE ’53000’
-- Handler_2
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, ’spSample12’, ’Column does not exist’);
-- Statement_12_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_12_2
INSERT INTO EmpNames VALUES (1002, ’Thomas’);
-- If the EmpNames table has been dropped, Statement_12_2
-- returns the SQLSTATE code ’42000’ that is handled
-- Statement_12_3
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_number = 1003;
-- If Salary_Amount has been dropped, -- Statement_12_3
returns the SQLSTATE code ’53000’ that is handled
END;
例 4: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES (’10’, ’Development’);
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample12();
206
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (SQLEXCEPTION タ イ プ )
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
ス ト ア ド ・ プ ロ シージ ャ の中の Statement_12_2 は、 SQLSTATE コ ー ド '42000' の
例外を発生 さ せます。 条件ハン ド ラ ーが存在 し ないため、 こ の例外は処理 さ れ
ません。
2
Statement_12_2 は ロ ールバ ッ ク さ れます。
3
汎用の SQLEXCEPTION ハン ド ラ ー ( コ メ ン ト に よ り Handler_1 と 命名 さ れてい
る ) がア ク テ ィ ブに さ れます。
Handler_1 は CONTINUE ハン ド ラ ーなので、 ハン ド ラ ー ・ ア ク シ ョ ンが正常に
完了す る と 、 Statement_12_3 が実行 さ れます。
4
Statement_12_3 は、 SQLSTATE コ ー ド '53000' の例外条件を発生 さ せます。
5
制御は Handler_2 に渡 さ れます。 こ のハン ド ラ ーは、 こ の SQLSTATE 条件を処
理す る ために明示的に定義 さ れてい ます。
6
Handler_2 はハン ド ラ ー ・ ア ク シ ョ ン を実行 し ます。 Handler_2 は EXIT ハン ド
ラ ーなので、 ハン ド ラ ー ・ ア ク シ ョ ンが完了 し た後、 制御がブ ロ ッ ク の終了に
渡 り ます。
他に文が含まれていなければ、 プ ロ シージ ャ は終了 し ます。
7
8
以下の項目はア ク テ ィ ブの ま ま残 り ますが、 コ ミ ッ ト さ れません。
•
•
最初の 2 つの対話式 SQL 文
Statement_12_1
•
Handler_1 用のア ク シ ョ ン文
•
Handler_2 用のア ク シ ョ ン文
プ ロ セ ス終了。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
207
第 6 章 : 条件処理
DECLARE HANDLER (SQLWARNING タ イ プ )
DECLARE HANDLER (SQLWARNING タ イ プ )
SQLWARNING は、 すべての完了条件 ( 正常完了 と 「no data found」 条件以外 ) 用の
SQLSTATE コ ー ド を表わす汎用条件です。
文の実行中に完了条件が発生 し た場合に、 該当す る 完了条件を処理す る ハン ド ラ ー
が存在 し ない と 、 SQLWARNING に関連 し たハン ド ラ ーが呼び出 さ れます。
SQLWARNING ハン ド ラ ーは、 EXIT ま たは CONTINUE の ど ち ら かの タ イ プにな り
ます。
SQLWARNING ハン ド ラ ー ・ ア ク シ ョ ン
SQLWARNING 汎用条件ハン ド ラ ーの制御の流れは、 SQLEXCEPTION ハン ド ラ ー
の制御の流れ と 似てい ます。 ただ し 、 SQLWARNING ハン ド ラ ーは、 完了条件の発
生に よ っ て有効化 さ れ る こ と が異な り ます。
SQLWARNING では、 「 no data found 」 条件 を 処理で き ま せん。 SQLWARNING
ハ ン ド ラ ーは、 NOT FOUND ハン ド ラ ー と 一緒にか ま たは別々に ス ト ア ド ・ プ ロ
シージ ャ 内で宣言 さ れ る と 、 「no data found」 完了条件に よ っ て有効化 さ れな く な
り ま す。
例 1: 汎用条件ハン ド ラ ー
以下の例は、 SQLWARNING ハン ド ラ ーの動作を示 し てい ます。 こ の例では、 以下
の ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample11()
BEGIN
DECLARE EmpCount INTEGER;
DECLARE EXIT HANDLER
FOR SQLWARNING
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample11', 'Generic handler
performed');
-- Statement_11_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_11_2
SELECT COUNT(*) INTO EmpCount FROM Employee SAMPLE 5;
-- Suppose table Employee has only three rows.
-- Statement_11_2 returns SQLSTATE 'T7473' that is
-- handled by the SQLWARNING handler.
END;
208
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (SQLWARNING タ イ プ )
例 2: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample11();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
呼び出 し 元の ス ト ア ド ・ プ ロ シージ ャ の中の Statement_11_2 は、 SQLSTATE
'T7473' の完了条件を発生 さ せます。 SQLSTATE コ ー ド 'T7473' 用の特定ハン ド
ラ ーは存在 し ないため、 こ の条件は、 SQLWARNING ハン ド ラ ーに よ っ て処理 さ
れます。
2
条件ハン ド ラ ーが EXIT タ イ プであ る ため、 ハン ド ラ ー ・ ア ク シ ョ ンの完了後に
制御は呼び出 し 元に渡 さ れます。
3
以下の項目はア ク テ ィ ブの ま ま残 り 、 コ ミ ッ ト さ れません。
4
•
•
最初の 2 つの対話式 SQL 文
Statement_11_1
•
ハン ド ラ ー内の INSERT 文
プ ロ セ ス の終わ り 。
例 3: 同一のプ ロ シージ ャ内の特定の条件ハン ド ラ ー と 汎用の条件ハン ド ラ ー
次の例は、 SQLWARNING ハン ド ラ ー と 特定の条件ハン ド ラ ーの両方の DECLARE
HANDLER ハン ド ラ ーが、 ス ト ア ド ・ プ ロ シージ ャ で組み合わ さ れた と き に ど の よ
う に動作す る か を示 し てい ます。 こ の例では、 以下の ス ト ア ド ・ プ ロ シージ ャ を想
定 し てい ます。
CREATE PROCEDURE spSample12()
BEGIN
DECLARE EmpCount INTEGER DEFAULT 0;
-- Handler_1
DECLARE CONTINUE HANDLER
FOR SQLWARNING
BEGIN
UPDATE warning_table
SET warning_count = warning_count + 1;
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample12', 'Generic warning
handler');
END;
-- Handler_2
DECLARE EXIT HANDLER FOR SQLSTATE 'T7473'
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample12', 'Requested sample is larger
than table rows');
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
209
第 6 章 : 条件処理
DECLARE HANDLER (SQLWARNING タ イ プ )
-- Statement_12_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_12_2
SELECT COUNT(*) INTO EmpCount FROM Employee SAMPLE 5;
-- Suppose the table Employee has only three rows.
-- Statement_12_2 returns SQLSTATE 'T7473' that is
-- handled by specific handler.
END;
例 4: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample12();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
Statement_12_2 は、 SQLSTATE コ ー ド 'T7473' で完了条件を生 じ ます。 こ の条件
は、 特定ハン ド ラ ー Handler_2 に よ っ て処理 さ れます。
2
Handler_2 はハン ド ラ ー ・ ア ク シ ョ ン を実行 し ます。 Handler_2 は EXIT ハン ド
ラ ーで、 プ ロ シージ ャ には 1 つの複合文 し か含まれていないので、 ハン ド ラ ー ・
ア ク シ ョ ンの完了後にプ ロ シージ ャ は終了 し ます。
3
以下の項目はア ク テ ィ ブの ま ま残 り ますが、 コ ミ ッ ト さ れません。
4
210
•
•
最初の 2 つの対話式 SQL 文
Statement_12_1
•
Handler_2 用のア ク シ ョ ン文
プ ロ セ ス の終わ り 。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
DECLARE HANDLER (NOT FOUND タ イ プ )
DECLARE HANDLER (NOT FOUND タ イ プ )
NOT FOUND は、 すべての 「no data found」 完了条件用の SQLSTATE コ ー ド を表わ
す一般条件です。
文の実行中に 「no data found」 完了条件が発生 し た場合に、 特定の条件を処理す る
ハン ド ラ ーが存在 し ない と 、 NOT FOUND に関連付け ら れたハン ド ラ ーが呼び出 さ
れます。
NOT FOUND ハン ド ラ ーは、 EXIT ま たは CONTINUE の ど ち ら かの タ イ プにな り
ま す。
NOT FOUND ハン ド ラ ー ・ ア ク シ ョ ン
NOT FOUND 汎用条件ハン ド ラ ーの制御の流れは、 SQLEXCEPTION ま たは
SQLWARNING ハ ン ド ラ ーの制御の流れ と 似てい ま す。 相違点は、 NOT FOUND
ハン ド ラ ーは 「no data found」 完了条件が発生す る と 有効化 さ れ る こ と です。
例 1: 汎用条件ハン ド ラ ー
以下の例は、 NOT FOUND ハン ド ラ ーの動作を示 し てい ます。 こ の例では、 以下の
ス ト ア ド ・ プ ロ シージ ャ を想定 し てい ます。
CREATE PROCEDURE spSample11()
BEGIN
DECLARE EmpCount INTEGER;
DECLARE EXIT HANDLER
FOR NOT FOUND
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample11', 'Generic
no data found handler performed');
-- Statement_11_1
UPDATE Employee
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_11_2
DELETE Employee WHERE Employee_Number = 1;
-- Suppose table Employee does not have a row for
-- Employee_Number 1. Statement_11_2 returns SQLSTATE
-- '02000' that is handled by NOT FOUND handler.
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
211
第 6 章 : 条件処理
DECLARE HANDLER (NOT FOUND タ イ プ )
例 2: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample11();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
呼び出 し 元の ス ト ア ド ・ プ ロ シージ ャ の中の Statement_11_2 は、 SQLSTATE
'02000' の完了条件を発生 さ せます。 SQLSTATE コ ー ド '02000' 用の特定ハン ド
ラ ーは存在 し ないため、 こ の条件は、 NOT FOUND ハン ド ラ ーに よ っ て処理 さ
れます。
2
条件ハン ド ラ ーが EXIT ハン ド ラ ーであ る ため、 ハン ド ラ ー ・ ア ク シ ョ ンの完了
後に制御は呼び出 し 元に渡 さ れます。
3
以下の項目はア ク テ ィ ブの ま ま残 り 、 コ ミ ッ ト さ れません。
4
•
•
最初の 2 つの対話式 SQL 文
Statement_11_1
•
ハン ド ラ ー内の INSERT 文
プ ロ セ ス の終わ り 。
例 3: 同一のプ ロ シージ ャ内の特定の条件ハン ド ラ ー と 汎用の条件ハン ド ラ ー
次の例は、 NOT FOUND ハン ド ラ ー と 特定の条件ハン ド ラ ーの両方の DECLARE
HANDLER ハン ド ラ ーが、 ス ト ア ド ・ プ ロ シージ ャ で組み合わ さ れた と き に ど の よ
う に動作す る か を示 し てい ます。 こ の例では、 以下の ス ト ア ド ・ プ ロ シージ ャ を想
定 し てい ます。
CREATE PROCEDURE spSample12()
BEGIN
DECLARE CONTINUE HANDLER
FOR NOT FOUND
-- Handler_1
BEGIN
UPDATE warning_table
SET warning_count = warning_count + 1;
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample12', 'Generic no data found
handler');
END;
DECLARE EXIT HANDLER FOR SQLSTATE '02000'
-- Handler_2
INSERT INTO Proc_Error_Table (:SQLSTATE,
CURRENT_TIMESTAMP, 'spSample12', 'No data found');
-- Statement_12_1
UPDATE Employee
212
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
診断域
SET Salary_Amount = 10000
WHERE Employee_Number = 1001;
-- Statement_12_2
DELETE Employee WHERE Employee_Number = 1;
-- Suppose table Employee does not have a row for
-- Employee_Number 1. Statement_12_2 returns SQLSTATE
-- '02000' that is handled by NOT FOUND handler.
END;
例 4: ANSI セ ッ シ ョ ン ・ モー ド
こ の例では、 以下の 3 つの SQL 文が BTEQ か ら ANSI セ ッ シ ョ ン ・ モー ド で対話
式に呼び出 さ れ る こ と を想定 し てい ます。
INSERT INTO Department VALUES ('10', 'Development');
UPDATE Employee SET Salary_Amount = 10000
WHERE Employee_Number = 1000;
CALL spSample12();
上記の 3 つの SQL ス テー ト メ ン ト が ANSI セ ッ シ ョ ン ・ モー ド で呼び出 さ れ る と 、
次の一連の イ ベン ト が起 こ り ます。
1
Handler_2 はハン ド ラ ー ・ ア ク シ ョ ン を実行 し ます。 Handler_2 は EXIT ハン ド
ラ ーであ る ため、 ハン ド ラ ー ・ ア ク シ ョ ンの完了後に制御は呼び出 し 元に渡 さ
れます。
2
Statement_12_2 は、 SQLSTATE コ ー ド '02000' で完了条件を生 じ ます。 こ の条件
は、 特定ハン ド ラ ー Handler_2 に よ っ て処理 さ れます。
3
以下の項目はア ク テ ィ ブの ま ま残 り ますが、 コ ミ ッ ト さ れません。
4
•
•
最初の 2 つの対話式 SQL 文
Statement_12_1
•
Handler_2 用のア ク シ ョ ン文
プ ロ セ ス の終わ り 。
診断域
診断域は、 シ ス テムが管理するデータ構造で、 その中には SQL ス ト ア ド ・ プ ロ シー
ジ ャ 内の文の実行ス テー タ ス に関す る 情報が含まれます。 GET DIAGNOSTICS 文を
使用 し て、 診断域か ら 情報を取得で き ます。 「GET DIAGNOSTICS」 (243 ページ ) を
参照 し て く だ さ い。
診断域は、 2 つの構成要素に分かれてい ます。
• 1 個の ス テー ト メ ン ト ( 文 ) 域
• ゼ ロ 、 1 ま たは 16 個ま での条件域
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
213
第 6 章 : 条件処理
診断域
ス テー ト メ ン ト ( 文 ) 域は、 ヘ ッ ダー と 呼ばれ る 場合 も あ り 、 ス ト ア ド ・ プ ロ シー
ジ ャ 内の最後の文に関す る 情報が含まれてい ます。
条件域は、 詳細域 と 呼ばれ る 場合 も あ り 、 ス テー ト メ ン ト ( 文 ) 域に記録 さ れてい
る 文を実行 し た結果発生 し たエ ラ ー、 警告ま たは成功 コ ー ド それぞれに関す る 情報
が含まれてい ます。
診断域は、 次の文の影響は受け ません。
• BEGIN … END
• ITERATE
• DECLARE
• LEAVE
• GET DIAGNOSTICS
• LOOP
診断域は、 エ ラ ー条件お よ び警告条件の場合に限 り 、 次の文の影響を受け ます。 こ
れ ら の文は まず、 診断域を消去 し てか ら 、 文の実行中に発生 し たエ ラ ー条件ま たは
警告条件に関す る 情報を挿入 し ます。
• CASE
• REPEAT
• FOR
• SET
• IF
• WHILE
ルール
診断域には、 次のルールが適用 さ れます。
• 各セ ッ シ ョ ンに関連付け ら れ る 診断域は 1 つだけです。
• 診断域は、 ク ラ イ ア ン ト が呼び出 し た ス ト ア ド ・ プ ロ シージ ャ の実行前に空に
( ク リ ア ) さ れます。
• 診断域の条件域に格納で き る 条件の最大数は 16 です。
• Teradata Database は、 CALL 以外のすべての SQL 文の実行前に、 診断域を空に し
ます。
文を実行 し た後、 Teradata Database は ス テー ト メ ン ト ( 文 ) 域 ( 加え て、 何 ら か
の条件が発生 し た場合には、 第 1 の条件域 ) に、 それぞれ、 文 と 実行中に発生 し
た条件に関す る デー タ を入れます。
• Teradata Database は、 SQL ス ト ア ド ・ プ ロ シージ ャ 内の CALL 文の実行前には診
断域を空に し ません。 ま た、 CALL 文の実行後 も 診断域を変更 し ません。
診断域の内容は、 呼び出 さ れた SQL ス ト ア ド ・ プ ロ シージ ャ の実行終了時の ま
ま です。
• Teradata Database は、 CASE、 FOR、 IF、 REPEAT、 SET、 ま たは WHILE 文いず
れかの実行後、 その文の実行中に例外条件ま たは完了条件が発生 し てい る 場合
には、 診断域を空に し ます。
シ ス テ ムが ス テー ト メ ン ト ( 文 ) 域 と 第 1 の条件域に文 と 発生 し た条件に関す る
デー タ を入れます。 こ れ ら の文が正常完了 し て も 、 診断域には影響 し ません。
214
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
診断域
• ハン ド ラ ー内の GET DIAGNOSTICS 以外の文が例外ま たはユーザー定義条件を
返 し 、 そのハン ド ラ ーでその条件が処理 さ れない と 、 Teradata Database は
RESIGNAL 文を暗黙的に実行 し ます ( 「RESIGNAL」 (229 ページ ) を参照 )。
こ のア ク シ ョ ンで診断域は空にな り 、 Teradata Database はハン ド ラ ーが診断域に
呼び出 さ れた と き の元の条件を復元 し ます。 す る と シ ス テ ムは、 ハン ド ラ ーを
含む複合文の外にあ る 条件域 1 に条件を伝搬 し ます。
RESIGNAL 文は、 診断域に最大 16 個の条件域を追加す る こ と がで き ます。
RESIGNAL 文の NUMBER オプシ ョ ンは、 診断域に格納 さ れてい る 条件数を示
し ます。
診断域に 16 を超え る 条件の格納を試み る と 、 NUMBER 値は増分 さ れず、 文域
の MORE フ ィ ール ド が 「Y」 に設定 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
215
第 6 章 : 条件処理
診断域
診断域の構造
診断域
文情報項目
フ ィ ール ド
COMMAND_
FUNCTION
説明
実行 さ れ る SQL 文を識別す る テ キ ス
ト 文字列。
コ マ ン ド 関数 と そ れに関連付け ら
れ た コ ー ド の リ ス ト につい て は、
付録 E: 「SQL ス ト ア ド ・ プ ロ シー
ジ ャ ・ コ マ ン ド 関数 コ ー ド 」 を参照
し て く だ さ い。
COMMAND_
FUNCTION_
CODE
実行 さ れ る SQL 文を識別す る 番号。
コ ー ド の詳細は、 付録 E: 「SQL ス ト
ア ド ・ プ ロ シージ ャ ・ コ マ ン ド 関数
コ ー ド 」 を参照 し て く だ さ い。
デー タ ・ タ イ プ
デフ ォ ル ト
属性
VARCHAR(128)
CHARACTER
SET LATIN
ヌル
READ_ONLY
INTEGER
0
READ_ONLY
CHARACTER(1)
CHARACTER
SET LATIN
N
READ_ONLY
INTEGER
0
READ_ONLY
正の値は、 ISO/IEC 9075 SQL 規格
で定義 さ れてい る SQL 文用に予約
さ れてい ま すが、 負の値は Teradata
が定義 し た SQL 文用に予約 さ れて
い ま す。
MORE
SQL 文の実行中に発生 し たすべての
条件が診断域に格納 さ れてい る か ど
う か を示す コ ー ド 。
コー ド :
• N の場合、 SQL 文の実行中に発生
し たすべての条件が診断域に格納
さ れてい ます。
• Y の場合、 SQL 文の実行中に、
診断域に あ る 条件域に格納 し 切
れない よ り 多 く の条件が発生 し
ま し た。
NUMBER
216
こ の前の SQL 文 ( ただ し 、 こ の前の
GET DIAGNOSTICS 文は除 く ) の実
行の結果、 診断域に格納 さ れてい る
実行条件ま たは完了条件の数。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
診断域
診断域
文情報項目
フ ィ ール ド
説明
デー タ ・ タ イ プ
デフ ォ ル ト
属性
ROW_COUNT
検索 DELETE 要求、 INSERT 要求、
MERGE 要求、 検索 UPDATE 要求の
実行に よ っ て、 ま たは、 こ の前の
SQL 文の実行の直接の結果、 影響を
受けた行数。
INTEGER
0
READ_ONLY
TRANSACTION_
ACTIVE
ト ラ ンザ ク シ ョ ン が現在ア ク テ ィ ブ
か ど う か を示す コ ー ド 。
INTEGER
0
READ_ONLY
コー ド :
• 0 の場合、 ト ラ ンザ ク シ ョ ンが現
在ア ク テ ィ ブではない こ と を意味
し ます。
• 1 の場合、 ト ラ ンザ ク シ ョ ンが現
在ア ク テ ィ ブであ る こ と を意味 し
ます。
条件情報項目
フ ィ ール ド
CLASS_ORIGIN
説明
RETURNED_SQLSTATE の ク ラ ス
値 を 定義 し た命名権者の識別子。
コー ド :
デー タ ・ タ イ プ
VARCHAR(128)
CHARACTER
SET UNICODE
デフ ォ ル ト
ヌル
• ISO-9075 (ANSI に よ り 定義 )
• Teradata (Teradata に よ り 定義 )
属性
SQLSTATE 値
に 関連付 け ら
れ て い な い条
件名 に つ い て
は修正可能。
こ の場合、 値は
ISO-9075 ま たは
Teradata 以外の
任意の文字列に
で き ます。
CONDITION_
IDENTIFIER
SIGNAL 文ま たは RESIGNAL 文で指
定 さ れた条件名。
VARCHAR(128)
CHARACTER
SET UNICODE
ヌル
READ_ONLY
CONDITION_
NUMBER
診断域内の各条件情報項目 ( 詳細 )
域を識別す る 連番。
INTEGER
0
READ_ONLY
MESSAGE_
LENGTH
MESSAGE_TEXT 内の文字列値の文
字数。
INTEGER
0
READ_ONLY
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
217
第 6 章 : 条件処理
診断文
診断域
条件情報項目
フ ィ ール ド
説明
MESSAGE_TEXT
RETURNED_SQLSTATE の 値 が 、
次の リ ス ト に示 し た項目のいずれか
に対応す る 場合、 MESSAGE_TEXT
の値は、 SQL が呼び出 し 、 例外が発
生 し たルーチン の メ ッ セージ ・ テ キ
ス ト 項目にな り ます。
デー タ ・ タ イ プ
デフ ォ ル ト
属性
VARCHAR(128)
CHARACTER
SET UNICODE
ヌル
修正可能
• 外部ルーチン呼び出 し 例外
• 外部ルーチン例外
• SQL ルーチン例外
• 警告
RETURNED_
SQLSTATE
こ れが唯一の完了条件、 ま たは例外
条件だっ た場合に返 さ れ る
SQLSTATE パ ラ メ ー タ 。
CHARACTER(5)
CHARACTER
SET LATIN
ヌル
READ_ONLY
SUBCLASS_
ORIGIN
RETURNED_SQLSTATE のサブ ク ラ
ス値を定義 し た命名権者の識別子。
VARCHAR(128)
CHARACTER
SET UNICODE
ヌル
SQLSTATE 値
に 関連付 け ら
れ て い な い条
件名 に つ い て
は修正可能。
コー ド :
• ISO-9075 (ANSI に よ り 定義 )
• Teradata (Teradata に よ り 定義 )
こ の場合、 値は
ISO-9075 ま たは
Teradata 以外の
任意の文字列に
で き ます。
診断文
次の文は、 すべて SQL ス ト ア ド ・ プ ロ シージ ャ限定の文ですが、 その文を使用し て、
診断域に対 し 、 情報の挿入や取得を行な う こ と がで き ます。
• SIGNAL
• RESIGNAL
• GET DIAGNOSTICS
218
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
SIGNAL
SIGNAL
目的
SIGNAL は、 診断域内で例外条件、 完了条件 ( 成功条件以外 )、 ま たはユーザー定
義条件を明示的に発生 さ せます。
呼出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
SIGNAL
;
condition_name
SQLSTATE
SQLSTATE_code
SET condition_information_item=value
VALUE
1101A634
説明
構文要素
指定内容
condition_name
SQL ス ト ア ド ・ プ ロ シージ ャ 内で条件を識別す る ため宣言 さ れた変数名。
condition_name が、 SQLSTATE 値に対応す る 条件を指定す る と 、 その SQLSTATE
の値は条件域の RETURNED_SQLSTATE に割当て ら れます。
「DECLARE CONDITION」 (187 ページ ) を参照 し て く だ さ い。
SQLSTATE [VALUE]
SQLSTATE_code
条件域内の RETURNED_SQLSTATE に割当て ら れ る SQLATATE の値。
SQLSTATE コ ー ド と そ の意味の リ ス ト につい て は、 付録 D: 「SQLSTATE の
マ ッ ピ ン グ」 を参照 し て く だ さ い。
value
指定 し た条件情報名に割当て る テ キ ス ト ま たは数値。
condition_information_item
診断域の条件域か ら 得 ら れ る 、 次の表に示 さ れてい る フ ィ ール ド 名の 1 つ。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
219
第 6 章 : 条件処理
SIGNAL
条件名情報
説明
CLASS_ORIGIN
RETURNED_SQLSTATE の ク ラ ス値を定義 し た命名権者の識別。
値は、 ク ラ ス値が ANSI/ISO SQL:2011 規格で定義 さ れてい る 場合は
ISO 9075、 ク ラ ス値が SQL:2011 規格に対す る Teradata の ク ラ ス拡張の
場合は Teradata と す る 必要があ り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
CONDITION_IDENTIFIER
SIGNAL 文ま たは RESIGNAL 文で指定 さ れた条件名。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
CONDITION_NUMBER
1 ~ 16 の値。 16 は、 診断域に格納で き る 条件の最大数です。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
MESSAGE_LEGTH
MESSAGE_TEXT の長 さ ( 文字数 )。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
MESSAGE_TEXT
こ の前の SQL 文の実行で返 さ れたエ ラ ー ・ メ ッ セージ ま たは警告 メ ッ セージ
のテ キ ス ト 、 ま たは SIGNAL 文ま たは RESIGNAL 文でシ グナル情報 と し て
指定 さ れた メ ッ セージ。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
RETURNED_SQLSTATE
こ の前の SQL 文か ら 返 さ れた SQLSTATE 値、 SIGNAL 文ま たは RESIGNAL
文で指定 さ れた SQLSTATE 値、 ま たは、 SIGNAL 文ま たは RESIGNAL 文で
条件名が指定 さ れてい る 場合の条件名に関連付け ら れた SQLSTATE 値。
デー タ ・ タ イ プ : CHARACTER(5) CHARACTER SET LATIN
デフ ォ ル ト : NULL
SUBCLASS_ORIGIN
RETURNED_SQLSTATE のサブ ク ラ ス値を定義 し た命名権者の識別。
値は、 ク ラ ス値が ANSI/ISO SQL:2011 規格で定義 さ れてい る 場合は
ISO 9075、 ク ラ ス値が SQL:2011 規格に対す る Teradata のサブ ク ラ ス
拡張の場合は Teradata と す る 必要があ り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
使用上の注意
SIGNAL 文が実行 さ れ る と 、 診断域が空にな り 、 ス テー ト メ ン ト ( 文 ) 域には
SIGNAL 文の詳細が入力 さ れ、 SQLSTATE 値 ま たは SIGNAL 文で指定 さ れた条
件名に対応す る 診断域に、 条件番号 1 の条件域が追加 さ れます。 シ グナル情報が
SIGNAL 文で指定 さ れてい る 場合は、 シ グナル情報で与え ら れ る 詳細情報を使っ
て、 こ の追加 さ れた条件域が更新 さ れます。 診断域についての詳細は、 「診断域」
(213 ページ ) を参照 し て く だ さ い。
220
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
SIGNAL
ルール
次のルールが、 SIGNAL 文に適用 さ れます。
• SIGNAL 文で条件名が指定 さ れてい る 場合、 その SIGNAL 文に適用 さ れ る 有効
範囲の中で、 その条件名を宣言す る 必要があ り ます。 宣言 し ない場合、 ス ト ア
ド ・ プ ロ シージ ャ の コ ンパ イ ル中にエ ラ ー SPL1079 が報告 さ れます。 「例 2」
(225 ページ ) では、 こ のルールについて説明 し てい ます。
• SIGNAL 文での条件名の使用法は、 その条件名が対応す る SQLSTATE 値の使用
法 と 同 じ です。 ただ し 、 条件名が SQLSTATE 値 と と も に宣言 さ れた場合に限 ら
れます。 「例 1」 (225 ページ ) では、 こ のルールについて説明 し てい ます。
• SIGNAL 文が例外条件ま たはユーザー定義条件を指定 し 、 その条件を処理す る
複合文内にハン ド ラ ーの定義がない場合、 診断域 と 条件処理のルールは、
「RESIGNAL」 (229 ページ ) お よ び 「BEGIN … END」 (270 ページ ) で示 し た も の
と 同 じ です。
• SIGNAL 文で完了条件を指定 し 、 その条件を処理す る 複合文内にハン ド ラ ーの
定義がない場合、 条件処理のルールは、 「BEGIN … END」 (270 ページ ) で示 し
た も の と 同 じ です。
• ハン ド ラ ーでない複合文内の SIGNAL 文でユーザー定義条件を指定 し 、 その条
件を処理す る ハン ド ラ ーの定義がその複合文内、 あ る いは SIGNAL 文の外側に
あ る 複合文にない場合、 Teradata Database はプ ロ シージ ャ の コ ンパ イ ル中に警告
メ ッ セージ を返 し ます。 その後、 実行時には、 SIGNAL 文で SQLCODE 7603 と
SQLSTATE '45000' の例外が発生 し ます。
• 同 じ 条件名で複数の条件宣言が指定 さ れて い る 場合、 SIGNAL 文 を 含む複合
文の有効範囲が最 も 狭い条件宣言が使用 さ れます。 「例 5」 (227 ページ ) では、
こ のルールについて説明 し てい ます。
signal_information には、 次のルールが適用 さ れます。
•
シ グナル情報指定の左側は、 次の ス テー ト メ ン ト ( 文 ) 域フ ィ ール ド 名のみを明
記で き ます。
• CLASS_ORIGIN
•
MESSAGE_TEXT
•
SUBCLASS_ORIGIN
ロ ーカル変数、 パ ラ メ ー タ 、 ま たは FOR ループの別名 / 列が指定 さ れ る と 、
Teradata Database は コ ン パ イ ル中に要求を ア ボー ト し 、 要求側にエ ラ ーを返 し
ま す。
• シ グナル情報指定の左側は、 次の ス テー ト メ ン ト ( 文 ) 域フ ィ ール ド 名は指定で
き ません。
• CONDITION_IDENTIFIER
•
CONDITION_NUMBER
•
MESSAGE_LENGTH
•
RETURNED_SQLSTATE
こ の う ちのいずれかを指定す る と 、 Teradata Database は コ ンパ イ ル中に要求を ア
ボー ト し 、 要求側にエ ラ ーを返 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
221
第 6 章 : 条件処理
SIGNAL
•
シ グナル情報の左側は、 SIGNAL 文内に条件名が指定 さ れ、 指定 さ れた条件名
が ど の SQLSTATE 値に も 関連付け ら れ て い な い場合に、 次の ス テー ト メ ン ト
( 文 ) 域フ ィ ール ド のみを指定で き ます。
• CLASS_ORIGIN
•
SUBCLASS_ORIGIN
それ以外の場合、 Teradata Database は コ ンパ イ ル中に要求を アボー ト し 、 要求側
にエ ラ ーを返 し ます。
•
シ グナル情報指定では、 条件情報項目名を繰 り 返す こ と はで き ません。
それ以外の場合、 Teradata Database は コ ンパ イ ル中に要求を アボー ト し 、 要求側
にエ ラ ーを返 し ます。
•
シ グナル情報指定の条件情報項目で指定 し た値のデー タ ・ タ イ プには、 条件域
の各列に対 し て指定 し たデー タ ・ タ イ プ と の互換性が必要です ( 「診断域の構
造」 (216 ページ ) の表 を 参照 ) 。 そ れ以外の場合、 Teradata Database は コ ン パ
イ ル中に要求を アボー ト し 、 要求側にエ ラ ーを返 し ます。
• CLASS_ORIGIN ま たは SUBCLASS_ORIGIN に対 し ては、 シ グナル情報変数に
ISO 9075 ま たは Teradata の ど ち ら も 指定で き ません。
CLASS_ORIGIN ま たは SUBCLASS_ORIGIN に対 し てシ グナル情報句の右側を
ISO 9075 ま たは Teradata の ど ち ら か と し て指定す る 場合は、 Teradata Database は
コ ンパ イ ル中に要求を アボー ト し 、 要求側にエ ラ ーを返 し ます。
実行時に CLASS_ORIGIN ま たは SUBCLASS_ORIGIN に対す る シ グナル情報
句の右側が ISO 9075 ま たは Teradata のいずれかにな る と 、 Teradata Database
では要求を ア ボー ト し て要求側にエ ラ ーを返 し 、 SQLCODE を 7609 に、
SQLSTATE を 'T7609' に設定 し ます。
ス テー ト メ ン ト ( 文 ) 域の内容
以下の表に、 SIGNAL 文実行後の ス テー ト メ ン ト ( 文 ) 域の内容を指定 し ます。
フ ィ ール ド 名
内容
COMMAND_FUNCTION
SIGNAL
COMMAND_FUNCTION_CODE
92
NUMBER
1
MORE
N
ROW_COUNT
0
RANSCATION_ACTIVE
ト ラ ンザ ク シ ョ ンがア ク テ ィ ブでない場合、
TRANSACTION_ACTIVE には 0 が入 り ます。
ト ラ ンザ ク シ ョ ンがア ク テ ィ ブな場合、
TRANSACTION_ACTIVE には 1 が入 り ます。
222
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
SIGNAL
条件域 1 の内容
以下の表に、 SIGNAL 文実行後の条件域 1 の内容を指定 し ます。
フ ィ ール ド 名
内容
CLASS_ORIGIN
SIGNAL に よ る 指定条件 :
• SQLSTATE 値ま たは SQLSTATE 値に関連付け ら れた条
件名の場合、 CLASS_ORIGIN には次に示す内容が入 り
ます。
• ク ラ ス値が ANSI/ISO SQL 規格で定義 さ れてい る 場
合、 ISO 9075
•
ク ラ ス値が ANSI/ISO SQL 規格に対す る Teradata の
拡張機能の場合、 Teradata
• ユーザー定義条件の場合、 CLASS_ORIGIN には
signal_information 変数で指定 さ れた値が入 り ます。
• 上記のいずれに も 当てはま ら ない場合、 CLASS_ORIGIN
には ヌ ルが入 り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE
CLASS_ORIGIN
SIGNAL に よ っ て SQLSTATE 値、 ま たは SQLSTATE 値に
関連付け ら れた条件名が指定 さ れ る 場合、 CLASS_ORGIN
は ANSI/ISO SQL 規格ま たは Teradata( ク ラ ス値が ANSI/
ISO SQL 規格に対す る Teradata の拡張機能の場合 ) で定義
さ れ ます。
SIGNAL に よ っ てユーザー定義条件が指定 さ れ る 場合、
CLASS_ORIGIN には、 signal_information 変数で指定 さ れ
た値が入 り ます。
SIGNAL の指定内容が上記のいずれで も ない場合、
CLASS_ORIGIN には ヌ ルが入 り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE
CONDITION_IDENTIFIER
SIGNAL 文で指定 さ れた条件名。
SIGNAL に条件名が指定 さ れていない場合、 こ の フ ィ ー
ル ド は ヌ ルに設定 さ れ ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE
CONDITION_NUMBER
1
デー タ ・ タ イ プ : INTEGER
MESSAGE_TEXT
SIGNAL 文の signal_information 変数で指定 し た
MESSAGE_TEXT の値。
SIGNAL に メ ッ セージ ・ テ キ ス ト 値が指定 さ れていない
場合は、 こ の フ ィ ール ド は ヌ ルに設定 さ れ ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
223
第 6 章 : 条件処理
SIGNAL
フ ィ ール ド 名
内容
MESSAGE_LENGTH
MESSAGE_TEXT の長 さ ( 文字数 )。
SIGNAL に メ ッ セージ ・ テ キ ス ト 値が指定 さ れていない
場合、 こ の フ ィ ール ド は 0 に設定 さ れます。
デー タ ・ タ イ プ : INTEGER
RETURNED_SQLSTATE
以下の う ちの 1 つ。
• SIGNAL 文で指定 さ れた条件に関連付け ら れた
SQLSTATE 値。
• SIGNAL 文で指定 さ れた SQLSTATE 値。
•
ヌ ル。
SIGNAL 文で条件名が指定 さ れ、 ど の SQLSTATE 値に
も 関連付け ら れていない場合、 こ の値は NULL です。
デー タ ・ タ イ プ : CHARACTER(5) CHARACTER SET
LATIN
CLASS_ORIGIN
SIGNAL に よ る 指定条件 :
• SQLSTATE 値ま たは SQLSTATE 値に関連付け ら れた条
件名の場合、 CLASS_ORIGIN には次に示す内容が入 り
ます。
• ク ラ ス 値が ANSI/ISO SQL 規格で定義 さ れて い る
場合、 ISO 9075
•
ク ラ ス値が ANSI/ISO SQL 規格に対す る Teradata の
拡張機能の場合、 Teradata
• ユーザー定義条件の CLASS_ORIGIN には、
signal_information 変数で指定 さ れた値が入 り ます。
• 上記のいずれに も 当ては ま ら ない場合、
CLASS_ORIGIN には ヌ ルが入 り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE
SUBCLASS_ORIGIN
SIGNAL に よ っ て SQLSTATE 値、 ま たは SQLSTATE 値に
関連付け ら れた条件名が指定 さ れ る 場合、 ク ラ ス値が
ANSI/ISO SQL 規格で定義 さ れてい る 場合、
SUBCLASS_ORIGIN には ISO 9075 が入 り 、 ク ラ ス値が
ANSI/ISO SQL 規格に対す る Teradata の拡張機能の場合、
Teradata が入 り ます。
SIGNAL に よ っ てユーザー定義条件が指定 さ れ る 場合、
SUB_CLASS には、 signal_information 変数で指定 さ れた値
が入 り ます。
SIGNAL の指定内容が上記のいずれで も ない場合、
SUB_CLASS には ヌ ルが入 り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER ST
UNICODE
224
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
SIGNAL
例1
次の例は、 SIGNAL 文での条件名 と その条件名に関連付け ら れた SQLSTATE 値に対
し て定義 さ れたハン ド ラ ー宣言の使用法を示 し てい ます。
Req1 か ら の ス ト ア ド ・ プ ロ シージ ャ の実行中、 InParam2 の値はゼ ロ で SIGNAL 文
が実行 さ れます。
SIGNAL 文は、 SQLSTATE '22012' を処理す る よ う 定義 さ れた EXIT ハン ド ラ ーを呼
び出 し ます。 条件名 divide_by_zero は SQLSTATE '22012' に関連付け ら れてい る こ と
に注意 し て く だ さ い。
SIGNAL 文は divide_by_zero を使用 し 、 ハン ド ラ ーは divide_by_zero に関連付け ら れ
てい る SQLSTATE 値を処理す る よ う 定義 さ れてい ますが、 SQLSTATE '22012' のハン
ド ラ ーが呼び出 さ れます。
ハン ド ラ ー ・ ア ク シ ョ ン文が正常に実行 さ れた後、 制御は複合文 cs1 にあ り 、 ス ト
ア ド ・ プ ロ シージ ャ は終了 し ます。
CREATE PROCEDURE signalsp3 (IN InParam1 INTEGER,
IN InParam2 INTEGER,
OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR SQLSTATE '22012'
SET OParam3 = 0;
IF (InParam2 = 0) THEN
SIGNAL divide_by_zero;
ELSE
SET OParam3 = InParam1 + InParam2;
...
END IF;
...
END cs1;
BTEQ> CALL signalsp3(10, 0, OParam3);
例2
次の例は、 SIGNAL 文内での条件名の使用法を示 し てい ます。
Req1 か ら の ス ト ア ド ・ プ ロ シージ ャ の実行中、 InParam2 の値はゼ ロ で SIGNAL 文
が実行 さ れます。
SIGNAL 文は divide_by_zero ま たはそれに関連付け ら れてい る SQLSTATE '22012' に
対 し て定義 さ れてい る ハン ド ラ ーを探 し ます。
divide_by_zero を処理す る よ う EXIT ハン ド ラ ーが定義 さ れてい る ので、 それが呼び
出 さ れます。
ハン ド ラ ー ・ ア ク シ ョ ン文が正常に実行 さ れた後、 制御は複合文 cs1 にあ り 、 ス ト
ア ド ・ プ ロ シージ ャ は終了 し ます。
CREATE PROCEDURE signalsp4 (IN InParam1 INTEGER,
IN InParam2 INTEGER,
OUT OParam3 INTEGER)
cs1: BEGIN
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
225
第 6 章 : 条件処理
SIGNAL
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR divide_by_zero
SET OParam3 = 0;
IF (InParam2 = 0) THEN
SIGNAL divide_by_zero;
ELSE
SET OParam3 = InParam1 + InParam2;
...
END IF;
...
END cs1;
BTEQ> CALL signalsp4(10, 0, OParam3);
例3
以下の例では、 SIGNAL 文の外側にあ る 複合文で定義 さ れてい る CONTINUE ハン
ド ラ ーが SIGNAL 文で発生 し た例外を処理 し ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中、 SIGNAL 文は divide_by_zero を発生 さ せます。
cs2 には divide_by_zero を処理す る よ う 定義 さ れたハン ド ラ ーがないので、
divide_by_zero に関連付け ら れた SQLSTATE 値は、 外側の複合文 cs1 に伝搬 さ れ、
cs1 の CONTINUE ハン ド ラ ーに よ っ て処理 さ れます。
ハン ド ラ ー ・ ア ク シ ョ ン文が正常に完了 し た後、 制御は SIGNAL divide_by_zero
の次の行に戻 り ます。
CREATE PROCEDURE signalsp5 (IN InParam1 INTEGER,
IN InParam2 INTEGER,
OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '22012'
SET OParam3=1;
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012'
cs2: BEGIN
IF (InParam2 = 0) THEN
SIGNAL divide_by_zero;
…
ELSE
SET OParam3 = InParam1 + InParam2;
…
END IF;
…
END cs2;
…
END cs1;
BTEQ> CALL signalsp5(10, 0, OParam3);
例4
次の例は、 SIGNAL 文内でのシ グナル情報の使用法を示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中、 SIGNAL 文は MESSAGE_TEXT に 'balance is too
low' を、 CLASS_ORIGIN に 'Stored Procedure' を設定 し ます。
226
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
SIGNAL
MESSAGE_LENGTH は、 暗黙的に 19 に設定 さ れます。
EXIT ハン ド ラ ーが条件を処理 し ます。
GET DIAGNOSTICS 文は、 MESSAGE_TEXT と CLASS_ORIGIN を最初の条件域か
ら 取得 し 、 それ ら を出力パ ラ メ ー タ Message と Class に割当て ます。
EXIT ハン ド ラ ー ・ ア ク シ ョ ン文が正常に実行 さ れた後、 制御は複合文 cs1 にあ り 、
ス ト ア ド ・ プ ロ シージ ャ は終了 し ます。
CREATE PROCEDURE setsignalsp1 (INOUT acno
INTEGER,
INOUT amt
FLOAT,
OUT
Message VARCHAR(50),
OUT
Class
VARCHAR(50))
cs1: BEGIN
DECLARE balance_too_low CONDITION;
DECLARE count INTEGER DEFAULT 0;
DECLARE bal_amt, balance FLOAT;
DECLARE EXIT HANDLER FOR balance_too_low
BEGIN
GET DIAGNOSTICS EXCEPTION 1
Message = MESSAGE_TEXT, Class = CLASS_ORIGIN;
SET count = count + 1;
INSERT INTO errortbl VALUES (acno, count, User,
current_timestamp, 'Balance too low for the
account');
END;
SELECT balamt INTO balance
FROM Deposit
WHERE accountno = acno;
SET bal_amt = balance - amt;
IF (bal_amt < 1000) THEN
SIGNAL balance_too_low
SET MESSAGE_TEXT = 'Balance is too low',
CLASS_ORIGIN = 'Stored Procedure';
ELSE
UPDATE Deposit
SET balance = bal_amt
WHERE accountno = acno;
END IF;
END cs1;
例5
以下の例では、 SIGNAL 文を含む複合文の有効範囲が最 も 狭い条件宣言が使用 さ れ
ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中、 InParam2 の値はゼ ロ で、 複合文 cs2 内の
SIGNAL 文でユーザー定義条件 divide_by_zero が発生 し ます。
複合文 cs2 には、 こ の条件のハン ド ラ ーがあ る ので、 それが呼び出 さ れます。 複合
文 cs1 には、 divide_by_zero を処理す る よ う 定義 さ れたハン ド ラ ーがあ り ますが、
条件宣言は SIGNAL 文を含んでい る 複合文の有効範囲の方が狭いので呼び出 さ れ
ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
227
第 6 章 : 条件処理
SIGNAL
ス ト ア ド ・ プ ロ シージ ャ の実行は、 ハ ン ド ラ ー ・ ア ク シ ョ ン 文の実行後 も 続 き
ま す。
CREATE PROCEDURE signalsp7 (IN InParam1 INTEGER,
IN InParam2 INTEGER,
OUT OParam3 INTEGER)
cs1: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR divide_by_zero
SET OParam3 = 0;
cs2: BEGIN
DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR divide_by_zero
SET OParam3 = 10;
IF (InParam2 = 0) THEN
SIGNAL divide_by_zero;
ELSE
SET OParam3 = InParam1 + InParam2;
…
END IF;
…
END cs2;
…
END cs1;
BTEQ> CALL signalsp7 (10, 0, OParam3);
228
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
RESIGNAL
目的
RESIGNAL は、 ハン ド ラ ー宣言か ら シ グナルの再送すなわち条件の再呼び出 し を行
ない ます。 RESIGNAL 文は、 ハン ド ラ ー宣言内でのみ明示的に指定で き ます。
呼出 し
実行可能プ ロ グ ラ ム。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
;
RESIGNAL
condition_name
SQLSTATE
SQLSTATE_code
SET condition_information_item=value
VALUE
1101A635
説明
構文要素
指定内容
condition_name
SQL ス ト ア ド ・ プ ロ シージ ャ 内で条件を識別す る ため宣言 さ れた変数名。
condition_name が、 SQLSTATE 値に対応す る 条件を指定す る と 、 その SQLSTATE の値
は条件域の RETURNED_SQLSTATE に割当て ら れ ます。
「DECLARE CONDITION」 (187 ページ ) を参照 し て く だ さ い。
SQLSTATE [VALUE]
SQLSTATE_code
Condition Area の RETURNED_SQLSTATE に割 り 当て ら れ る SQLSTATE の値。
SQLSTATE コ ー ド と その意味の リ ス ト につい ては、 付録 D: 「SQLSTATE のマ ッ ピ ン
グ」 を参照 し て く だ さ い。
value
指定 し た条件情報名に割当て る テ キ ス ト ま たは数値。
condition_information
_item
診断域の条件域か ら 得 ら れ る 、 次の表に示 さ れてい る フ ィ ール ド 名の 1 つ。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
229
第 6 章 : 条件処理
RESIGNAL
条件名情報
説明
CLASS_ORIGIN
RETURNED_SQLSTATE の ク ラ ス値を定義 し た命名権者の識別。
値は、 ク ラ ス値が ANSI/ISO SQL:2011 規格で定義 さ れてい る 場合は
ISO 9075、 ク ラ ス値が SQL:2011 規格に対す る Teradata の ク ラ ス拡張の
場合は Teradata と す る 必要があ り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
CONDITION_IDENTIFIER
SIGNAL 文ま たは RESIGNAL 文で指定 さ れた条件名。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
CONDITION_NUMBER
1 か ら 16 ま での値 を 取 り ま す。 16 は、 診断域に格納で き る 条件の最大数
です。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
MESSAGE_LEGTH
MESSAGE_TEXT の長 さ ( 文字数 )。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
MESSAGE_TEXT
こ の前の SQL 文の実行で返 さ れたエ ラ ー ・ メ ッ セージ ま たは警告 メ ッ セージ
のテ キ ス ト 、 ま たは SIGNAL 文ま たは RESIGNAL 文でシ グナル情報 と し て
指定 さ れた メ ッ セージ。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
RETURNED_SQLSTATE
こ の前の SQL 文か ら 返 さ れた SQLSTATE 値、 SIGNAL 文ま たは RESIGNAL
文で指定 さ れた SQLSTATE 値、 ま たは、 SIGNAL 文ま たは RESIGNAL 文で
条件名が指定 さ れてい る 場合の条件名に関連付け ら れた SQLSTATE 値。
デー タ ・ タ イ プ : CHARACTER(5) CHARACTER SET LATIN
デフ ォ ル ト : NULL
SUBCLASS_ORIGIN
RETURNED_SQLSTATE のサブ ク ラ ス値を定義 し た命名権者の識別。
値は、 ク ラ ス値が ANSI/ISO SQL:2011 規格で定義 さ れてい る 場合は ISO
9075、 ク ラ ス値が SQL:2011 規格に対す る Teradata のサブ ク ラ ス拡張の場合
は Teradata と す る 必要があ り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET UNICODE
デフ ォ ル ト : NULL
使用上の注意
RESIGNAL は常に、 条件を外側に伝搬 さ せます。 ハン ド ラ ー ・ ア ク シ ョ ンか ら
RESIGNAL 文が実行 さ れ る と 、 RESIGNAL 文の外側にあ る 複合文か ら 最 も 適切な
条件ハン ド ラ ー宣言を検索 し ます。 シ グナル値を持つ RESIGNAL 文は、 診断域を
ク リ ア し ません。
230
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
ルール
次のルールが、 RESIGNAL に適用 さ れます。
• RESIGNAL 文は、 条件ハン ド ラ ーの外側で使用 さ れ、 ス ト ア ド ・ プ ロ シージ ャ
の コ ンパ イ ル中に要求を アボー ト し 、 要求側にエ ラ ーを返 し ます。
• RESIGNAL 文で条件名が指定 さ れてい る 場合、 その RESIGNAL 文を含むハン ド
ラ ーに適用 さ れ る 有効範囲の中でその条件名を宣言す る 必要があ り ます。 それ
以外の場合、 ス ト ア ド ・ プ ロ シージ ャ の コ ン パ イ ル中に要求 を ア ボー ト し 、
要求側にエ ラ ーを返 し ます。
• RESIGNAL 文での条件名の使用法は、 その条件名が SQLSTATE 値に関連付け ら
れてい る 場合には、 その条件名が対応す る SQLSTATE 値の使用法 と 同 じ です。
「例 1」 (235 ページ ) では、 こ のルールについて説明 し てい ます。
• 同 じ 条件名で複数の条件宣言が指定 さ れてい る 場合、 RESIGNAL 文を含む複合
文の有効範囲が最 も 狭い条件宣言が使用 さ れます。 「例 2」 (235 ページ ) では、
こ のルールについて説明 し てい ます。
• RESIGNAL 文でシ グナル値が指定 さ れ、 診断域では、 ス テー ト メ ン ト ( 文 ) 域
が RESIGNAL 文の詳細で変更 さ れ、 既存の条件域があれば、 その条件域は n 番
目の条件域が (n+1) 番目の条件域の位置に置かれ る と い っ た形で ス タ ッ ク さ れ
ま す。 シ グナル情報が RESIGNAL 文で指定 さ れてい る 場合、 シ グナル情報で
与え ら れ る 詳細情報を使っ て条件域 1 を更新 し てか ら 、 既存の条件域をず ら し
ます。 シ グナル値に対応す る 新 し い条件域 1 が診断域に追加 さ れ ます。 「例 3」
(236 ページ ) では、 こ のルールについて説明 し てい ます。
• シ グナル値が条件名の場合、 条件域 1 にあ る CONDITION_IDENTIFIER が条
件名を格納す る よ う に設定 さ れます。 条件名が SQLSTATE 値に関連付け ら れ
てい る 場合、 条件域 1 の RETURNED_SQLSTATE は、 こ の SQLSTATE 値を
格納す る よ う に設定 さ れます。 「例 6」 (239 ページ ) では、 こ のルールについ
て説明 し てい ます。
• そ う でない と 、 シ グナル値が SQLSTATE 値の場合に、 条件域 1 の
RETURNED_SQLSTATE が、 こ の SQLSTATE 値を格納す る よ う に設定 さ れ
ま す。 「例 7」 (240 ページ ) では、 こ のルールについて説明 し てい ます。
• 「例 6」 (239 ページ ) と 「例 7」 (240 ページ ) で説明 し てい る よ う に、
RESIGNAL 文で発生 し た条件を処理す る ために、 RESIGNAL 文が含まれた外
側にあ る 複合文内でハン ド ラ ーが検索 さ れます。
• RESIGNAL 文の外側にあ る 複合文で、 RESIGNAL 文で発生 し た条件を処理す る
ハン ド ラ ーを持つ も のがない場合、 次のいずれかにな り ます。
• 例外ス ト ア ド ・ プ ロ シージ ャ は、 RESIGNAL 文で発生 し た例外条件で終了 し
ます。
• 完了条件実行は、 RESIGNAL 文を含むハン ド ラ ー内の REGISNAL 文の次の
文か ら 続行 さ れます。
• ユーザー定義の例外条件 SQLCODE を 7603 に、 SQLSTATE を '45000 に設定
す る 例外が発生 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
231
第 6 章 : 条件処理
RESIGNAL
• RESIGNAL 文の外側にあ る 複合文に、 RESIGNAL 文で発生 し た条件を処理で き
る も のがない場合、 次のいずれかに と な り ます。
• CONTINUE ハン ド ラ ー : ス ト ア ド ・ プ ロ シージ ャ の実行は、 RESIGNAL 文を
含むハン ド ラ ーを呼び出 し た文の次の文か ら 続行 さ れます。 「例 2」 (235 ペー
ジ ) では、 こ のルールについて説明 し てい ます。
• EXIT ハン ド ラ ー : ス ト ア ド ・ プ ロ シージ ャ の実行は、 ア ク シ ョ ン句が正常終
了 し たばか り のハン ド ラ ーを含む END 文の次の文か ら 続行 さ れます。
• RESIGNAL 文がシ グナル値な し で実行 さ れ る と 、 次のいずれかにな り ます。
•
•
診断域は ク リ ア さ れ、 その元の内容 と RESIGNAL 文を含むハン ド ラ ーが呼
び出 さ れて診断域に復元 さ れます。
条件域 1 の CONDITION_IDENTIFIER と RETURNED_SQLSTATE には、 元の
条件 と 呼び出 さ れたハン ド ラ ーが反映 さ れます。
シ グナル情報が指定 さ れ る と 、 条件域 1 は、 RESIGNAL 文のシ グナル情報
指定か ら 取得 し た詳細を使用 し て更新 さ れます。 「例 4」 (236 ページ ) では、
こ のルールについて説明 し てい ます。
•
ハン ド ラ ーが呼び出 さ れた元の条件は外側に伝搬 さ れ、 こ の条件のハン ド
ラ ーが RESIGNAL 文の外側にあ る 複合文の中にないか検索 し ます。
• RESIGNAL 文でユーザー定義条件を使用 し 、 RESIGNAL 文を含む複合文の有効
範囲内にその条件を処理す る よ う 定義 さ れたハン ド ラ ー宣言がない と 、 Teradata
Database は コ ンパ イ ル中に警告を報告 し ます。
「SIGNAL」 (219 ページ ) で指定 さ れたシ グナル情報に関す る ルールは、 RESIGNAL
文内のシ グナル情報に も 適用 さ れます。
診断域の内容
以下の表に、 シ グナル値 と と も に指定 さ れた RESIGNAL 文の実行後の、 ス テー ト
メ ン ト ( 文 ) 域の内容を指定 し ます。
フ ィ ール ド
値
COMMAND_FUNCTION
RESIGNAL
COMMAND_FUNCTION_CODE
91
NUMBER
NUMBER < 16 の場合、 1 ずつ増え ます。
NUMBER
MORE
16 の場合、 値は変更 さ れ ません。
NUMBER の値が変わ っ てい る 場合は Y。
NUMBER の値が変わ っ ていない場合は N。
ROW_COUNT
0
TRANSACTION_ACTIVE
ア ク テ ィ ブな ト ラ ンザ ク シ ョ ン がない場合は 0。
ア ク テ ィ ブな ト ラ ンザ ク シ ョ ン があ る 場合は 1。
232
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
以下の表に、 シ グナル情報を使っ て指定 し た RESIGNAL 文実行後の条件域 1 の内
容を指定 し ます。 RESIGNAL 文でシ グナル値 も 指定 さ れてい る 場合、 こ の条件域
は条件番号 2 にプ ッ シ ュ さ れます。
フ ィ ール ド
CLASS_ORIGIN
値
CLASS_ORIGIN がシ グナル情報に指定 さ れてい る と 、
こ の フ ィ ール ド には指定 さ れた値が入 り ます。
そ う でない場合、 既存の値が残っ た ま ま にな り ます。
CONDITION_IDENTIFIER
こ の フ ィ ール ド は変更で き ないので、 既存の値が残っ た ま
ま にな り ます。
CONDITION_NUMBER
こ の フ ィ ール ド は変更で き ないので、 既存の値が残っ た ま
ま にな り ます。
MESSAGE_TEXT
RESIGNAL 文のシ グナル情報に対 し て指定 さ れた値。
そ う でない場合、 既存の値が残っ た ま ま にな り ます。
MESSAGE_LENGTH
MESSAGE_TEXT の長 さ 。
RESIGNAL に メ ッ セージ ・ テ キ ス ト 値が指定 さ れていない
場合は、 こ の フ ィ ール ド は 0 に設定 さ れます。
RETURNED_SQLSTATE
こ の フ ィ ール ド は変更で き ないので、 既存の値が残っ た ま
ま にな り ます。
SUBCLASS_ORIGIN
シ グナル情報内に SUBCLASS_ORIGIN が指定 さ れてい る 場
合、 こ の フ ィ ール ド には、 指定 さ れた値が入っ てい ます。
そ う でない場合、 既存の値が残っ た ま ま にな り ます。
以下の表に、 シ グナル値 と と も に指定 さ れた RESIGNAL 文の実行後の、 条件域 1
の内容を指定 し ます。
フ ィ ール ド
CLASS_ORIGIN
値
RESIGNAL 文の指定条件 :
• RESIGNAL 文で指定 さ れた条件に関連付け ら れた
SQLSTATE 値。
• RESIGNAL 文で指定 さ れた SQLSTATE 値。
その場合、 CLASS_ORIGIN の内容は次の よ う に し て決ま り
ます。
•
ク ラ ス 値が ANSI/ISO SQL 規格に よ っ て定義 さ れてい る
場合、 CLASS_ORIGIN は ISO 9075 にな り ます。
• ク ラ ス値が Teradata に よ っ て定義 さ れてい る 場合、
CLASS_ORIGIN は Teradata にな り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE。
RESIGNAL 文でユーザー定義条件を指定す る と 、
CLASS_ORIGIN は ヌ ルです。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
233
第 6 章 : 条件処理
RESIGNAL
フ ィ ール ド
CONDITION_IDENTIFIER
値
RESIGNAL 文で指定 さ れた条件名。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE。
条件名が指定 さ れていない場合、 CONDITION_IDENTIFIER
は ヌ ルです。
CONDITION_NUMBER
1
デー タ ・ タ イ プ : INTEGER
MESSAGE_TEXT
ヌル
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET
UNICODE。
MESSAGE_LENGTH
0
デー タ ・ タ イ プ : INTEGER
RETURNED_SQLSTATE
以下の う ちの 1 つです。
• RESIGNAL 文で指定 さ れた条件に関連付け ら れた
SQLSTATE 値
• RESIGNAL 文で指定 さ れた SQLSTATE 値
•
ヌル
デー タ ・ タ イ プ : CHARACTER(5) CHARACTER SET LATIN。
SUBCLASS_ORIGIN
RESIGNAL 文の指定条件 :
• RESIGNAL 文で指定 さ れた条件に関連付け ら れた
SQLSTATE 値
• RESIGNAL 文で指定 さ れた SQLSTATE 値
その場合、 SUBCLASS_ORIGIN の内容は次の よ う に し て決
ま り ます。
•
ク ラ ス 値が ANSI/ISO SQL 規格に よ っ て定義 さ れてい る
場合、 CLASS_ORIGIN は ISO 9075 にな り ます。
• ク ラ ス値が Teradata に よ っ て定義 さ れてい る 場合、
CLASS_ORIGIN は Teradata にな り ます。
デー タ ・ タ イ プ : VARCHAR(128) CHRACTER SET
UNICODE。
RESIGNAL 文でユーザー定義条件を指定す る と 、
SUBCLASS_ORIGIN は ヌ ルです。
シ グナル値を指定 し ない RESIGNAL 文の実行後、 Teradata Database は診断域の内
容を次の よ う に設定 し ます。
•
ス テー ト メ ン ト ( 文 ) 域には、 RESIGNAL 文を含んでい る ハン ド ラ ーが呼び出 さ
れた診断域の ス テー ト メ ン ト ( 文 ) 域の内容が設定 さ れます。
• 条件域は、 RESIGNAL 文を含んでい る ハン ド ラ ーが呼び出 さ れた診断域の条件
域に設定 さ れます。
234
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
例1
こ の例の実行時に、 プ ロ シージ ャ 定義内の最後の SET 文で SQLCODE 2802 と
SQLSTATE '22012' を返す例外が発生 し ます。
SQLSTATE '22012' の処理のため、 CONTINUE ハン ド ラ ーが呼び出 さ れ、
RESIGNAL 文が実行 さ れます。
条件 out_of_range は SQLSTATE '22003' に関連付け ら れてお り 、 SQLSTATE '22003'
は複合文 cs1 に伝搬 さ れ、 EXIT ハン ド ラ ーが呼び出 さ れます。
ハン ド ラ ー ・ ア ク シ ョ ン文が正常に実行 さ れた後、 制御は cs1 にあ り 、 ス ト ア ド ・
プ ロ シージ ャ は正常に終了 し ます。
CREATE PROCEDURE resignalsp3 (INOUT IOParam INTEGER,
OUT
OParam INTEGER)
cs1: BEGIN
DECLARE out_of_range CONDITION FOR SQLSTATE '22003';
DECLARE EXIT HANDLER FOR SQLSTATE '22003'
SET OParam = 0;
cs2: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '22012'
RESIGNAL out_of_range;
SET IOParam = 0;
SET OParam = 20 / IOParam;
END cs2;
END cs1;
BTEQ> CALL resignalsp3 (0, OParam);
例2
次の例は、 外側の複合文内の CONTINUE ハン ド ラ ーが内側の複合文の RESIGNAL
文で発生 し た条件を処理す る と き の戻 り 点を示 し てい ます。
実行時、 SET 文で例外 SQLSTATE '22012' が発生 し ます。
CONTINUE ハン ド ラ ーが呼び出 さ れ、 ハン ド ラ ー ・ ア ク シ ョ ン文の一部 と し て
RESIGNAL 文が実行 さ れます。
条件宣言は RESIGNAL 文が含まれてい る 複合文の有効範囲の方が狭いので、
RESIGNAL 文は、 cs2 で宣言 さ れてい る 条件を参照 し ます。
Condition1 は、 SQLSTATE '21000' に関連付け ら れてい る ため、 例外条件はそれを含
む外側の複合文 cs1 に伝搬 さ れ、 SQLSTATE '21000' の CONTINUE ハン ド ラ ーが呼
び出 さ れます。
ハン ド ラ ー ・ ア ク シ ョ ン文が正常に実行 さ れた後、 制御はプ ロ シージ ャ 定義内の最
後の SET 文の次の文に戻 り ます。
CREATE PROCEDURE resignalsp5(INOUT IOParam INTEGER,
OUT
OParam INTEGER)
cs1: BEGIN
DECLARE Condition1 CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR Condition1
SET OParam = 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '21000'
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
235
第 6 章 : 条件処理
RESIGNAL
SET OParam = 100;
cs2: BEGIN
DECLARE Condition1 CONDITION FOR SQLSTATE '21000';
DECLARE CONTINUE HANDLER FOR SQLSTATE '22012'
BEGIN
RESIGNAL Condition1;
…
END;
SET IOParam = 0;
SET OParam = 20 / IOParam;
…
END cs2;
END cs1;
BTEQ> CALL resignalsp5 (0, OParam);
例3
次の例は、 RESIGNAL 文でのシ グナル値 と シ グナル情報の使用法を示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中、 RESIGNAL 文は条件域 1 内の MESSAGE_TEXT を
'Sampling error' で更新 し 、 MESSAGE_LENGTH が暗黙的に 14 に設定 さ れます。
シ グナル値は RESIGNAL 文で指定 さ れてい る ため、 診断域の既存の条件域がプ ッ
シ ュ ・ ダ ウ ン さ れ、 診断域には RETURNED_SQLSTATE を 'T7473'、
CONDITION_NUMBER を 1 と す る 新 し い条件域が追加 さ れます。
CREATE PROCEDURE setsignalsp3(OUT OPar CHAR(100))
cs1: BEGIN
…
cs2: BEGIN
DECLARE samp_error CONDITION;
DECLARE CONTINUE HANDLER FOR samp_error
RESIGNAL SQLSTATE 'T7473'
SET MESSAGE_TEXT = 'Sampling error';
…
SIGNAL samp_error;
…
END cs2;
END cs1;
BTEQ> .COMPILE FILE setsignalsp3.spl
BTEQ> CALL setsignalsp3(OPar);
例4
次の例は、 元の例外をハン ド ラ ーか ら 外側に伝搬す る 方法を示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中に、 プ ロ シージ ャ 定義内の最後の INSERT 文で重
複行例外が発生 し 、 SQLSTATE '23505' に対 し て宣言 さ れたハン ド ラ ーが呼び出 さ れ
ます。
SQLSTATE、 CURRENT_TIMESTAMP、 'spSample1'、 お よ び 'Failed to Insert record' を
挿入す る ハン ド ラ ー ・ ア ク シ ョ ン文は、 SQLSTATE '42000' で別の例外 と な り 、 汎用
の SQLEXCEPTION ハン ド ラ ーが始動 し ます。
236
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
ハン ド ラ ーは、 そのハン ド ラ ーが処理す る はずだっ た元の例外で RESIGNAL 文を
発行 し ます。
診断域が ク リ ア さ れ、 ハン ド ラ ーが呼び出 さ れた と き の元の状態に復元 さ れます。
こ れで、 条件域 1 には、 元の例外 SQLSTATE '42000' が復元 さ れ る こ と にな り ます。
RESIGNAL 文にはシグナル情報が指定 さ れてい る ので、 条件域 1 の MESSAGE_TEXT
が 'Table does not exist' に更新 さ れます。
MESSAGE_LENGTH は 20 に暗黙的に設定 さ れます。 次に、 プ ロ シージ ャ 定義内の
最初の条件ハン ド ラ ーが呼び出 さ れて、 例外 SQLSTATE '42000' を処理 し ます。
ハン ド ラ ー ・ ア ク シ ョ ン文が正常完了 し た後、 制御は NSERT ハン ド ラ ー ・ ア ク
シ ョ ン文の次の文に戻 り ます。
CREATE PROCEDURE spSample3(IN pName
CHAR(30),
IN pAmt
INTEGER,
Osqlstate CHAR(5),
Omsg
CHAR(30))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
GET DIAGNOSTICS EXCEPTION 1
Osqlstate = RETURNED_SQLSTATE, Omsg = MESSAGE_TEXT;
L1: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DELETE FROM tab1;
RESIGNAL SET MESSAGE_TEXT = 'Table does not exist';
END;
INSERT INTO Proc_Error_Tbl
VALUES (SQLSTATE, CURRENT_TIMESTAMP, 'spSample1',
'Failed to Insert record');
…
END;
INSERT INTO tab1 VALUES (pName, pAmt);
INSERT INTO tab1 VALUES (pName, pAmt); -- Duplicate row error
…
END L1;
…
END;
BTEQ> .COMPILE FILE nblk3.spl
BTEQ> CREATE SET TABLE tab1(c1 CHAR(30), c2 INTEGER);
BTEQ> DROP TABLE Proc_Error_Tbl;
BTEQ> CALL spSample3('Richard', 100, OSqlstate, OMsg);
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
237
第 6 章 : 条件処理
RESIGNAL
例5
次の例は、 呼び出 し 元の ス ト ア ド ・ プ ロ シージ ャ が、 例外条件で終了 し た呼び出 し
先の ス ト ア ド ・ プ ロ シージ ャ か ら 返 さ れた条件を処理す る 方法を示 し ます。
外側の ス ト ア ド ・ プ ロ シージ ャ resignalsp1 の実行中に、 CALL 文が内側の ス ト ア
ド ・ プ ロ シージ ャ resignalsp2 を呼び出 し ます。
resignalsp2 では、 SIGNAL 文で完了条件 SQLSTATE '02000' が発生 し ます。
SIGNAL 文は まず、 診断域を ク リ ア し ます。 次に、 ス テー ト メ ン ト ( 文 ) 式が更新
さ れ、 RETURNED_SQLSTATE '02000' で条件域 1 が追加 さ れます。 こ の条件に対 し
て、 CONTINUE HANDLER が呼び出 さ れます。
RESIGNAL 文でユーザー定義条件 nodata が発生 し ます。
ス テー ト メ ン ト ( 文 ) 域が、 RESIGNAL 文の詳細を使っ て更新 さ れます。
条件域 1 は、 診断域で条件域 2 と し てプ ッ シ ュ ・ ダ ウ ン さ れ、 nodata に対応 し て新
し い条件域 1 が追加 さ れます。
こ のユーザー定義条件に対す る ハン ド ラ ーはな く 、 ま た、 resignalsp2 は例外条件
ERRRTSNOCOND (SQLCODE 7603 お よ び SQLSTATE '45000') で終了 し ます。
resignalsp1 では、 CALL 文が cs2 で SQLSTATE '45000' を処理す る よ う に宣言 さ れた
条件ハン ド ラ ーに よ っ て処理 さ れ る 例外 ERRRTSNOCOND を報告 し ます。
GET DIAGNOSTICS 文が診断域か ら 条件域 1 を取得 し 、 'nodata' を condname に割当
て ます。
RESIGNAL 文でユーザー定義条件 nodata を発生 し 、 こ の条件は内側のプ ロ シー
ジ ャ で nodata に対 し て定義 さ れたハン ド ラ ーに よ っ て処理 さ れます。
CALL 文は、 OParam1 = 0、 pcondno = 1、 お よ び count = 0 を返 し ます。
外側の ス ト ア ド ・ プ ロ シージ ャ は次の よ う に定義 さ れてい ます。
CREATE PROCEDURE resignalsp1 (OUT
OParam1 INTEGER,
INOUT pcondno INTEGER,
OUT
count
INTEGER)
cs1: BEGIN
DECLARE nodata CONDITION;
DECLARE cnt INTEGER DEFAULT VALUE 0;
DECLARE CONTINUE HANDLER FOR nodata
SET count = 0;
cs2: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '45000'
BEGIN
GET DIAGNOSTICS EXCEPTION pcondno
condname = CONDITION_IDENTIFIER;
IF (condname = 'nodata') THEN
RESIGNAL 'nodata';
END IF;
END;
SET OParam1 = 0;
CALL resignalsp2(cnt); /* returns exception '45000' */
END cs2;
END cs1;
238
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
内側の ス ト ア ド ・ プ ロ シージ ャ は次の よ う に定義 さ れてい ます。
CREATE PROCEDURE
cs1: BEGIN
DECLARE cnt
cs2: BEGIN
DECLARE
DECLARE
resignalsp2 (OUT OParam1 INTEGER)
INTEGER DEFAULT VALUE 0;
nodata CONDITION;
CONTINUE HANDLER FOR SQLSTATE '02000'
RESIGNAL nodata;
SET OParam1 = 0;
SELECT COUNT(*) INTO cnt FROM tab1;
IF (cnt = 0) THEN
SIGNAL SQLSTATE '02000';
…
ELSE
SET OParam1 = cnt;
END IF;
END cs2;
END cs1;
BTEQ> CREATE SET TABLE
tab1 (c1 INTEGER);
BTEQ> CALL resignalsp1(OParam1, 1, condname);
例6
次の例は、 ユーザー定義条件が RESIGNAL 文で指定 さ れて い る と き に、 条件域
2 に対応す る 情報の取得方法を示 し てい ます。
ス ト ア ド ・ プ ロ シージ ャ の実行中に、 SELECT…INTO 文で完了条件 SQLSTATE
'02000' が発生 し ます。
ス テー ト メ ン ト ( 文 ) 域には、 SELECT…INTO 文の詳細が入 り 、 診断域には条件域
が追加 さ れて完了条件に関す る 情報が入 り ます。
SQLSTATE '02000' のハン ド ラ ーが呼び出 さ れ、 完了条件 SQLSTATE '02000' を処理
し ます。
ハ ン ド ラ ー ・ ア ク シ ョ ン内の RESIGNAL 文でユーザー定義条件 nodata が発生 し
ま す。
条件域 1 は、 診断域内でプ ッ シ ュ ・ ダ ウ ン さ れて条件域 2 と な り 、 ユーザー定義条
件 nodata に対応 し て新 し い条件域 1 が追加 さ れます。
ユーザー定義条件 nodata は、 外側の複合文に伝搬 さ れます。
複合文 cs1 内の nodata ハン ド ラ ーがユーザー定義条件 nodata を処理 し ます。
GET DIAGNOSTICS 文が条件域 1 を取得 し 、 CONDITION_IDENTIFIER か ら 得た
'nodata' を condid に割当て ます。
第 2 の GET DIAGNOSTICS 文は条件域 2 を取得 し 、 RETURNED_SQLSTATE か ら 得
た SQLSTATE '02000' を sqlstate1 に割当て ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
239
第 6 章 : 条件処理
RESIGNAL
END cs2 よ り 前の処理が終了 し た ら 、 ス ト ア ド ・ プ ロ シージ ャ の実行が再開 さ れま
す。 CALL 文は、 OParam1 = 0、 pcondno = 2、 お よ び sqlstate1 = '02000' を返 し ます。
CREATE PROCEDURE resig6 (OUT
OParam1 INTEGER,
INOUT pcondno INTEGER,
OUT
sqlstate1 CHAR(5),
OUT
condid CHAR(10))
cs1: BEGIN
DECLARE nodata CONDITION;
DECLARE CONTINUE HANDLER FOR nodata
BEGIN
GET DIAGNOSTICS EXCEPTION 1
condid = CONDITION_IDENTIFIER;
GET DIAGNOSTICS EXCEPTION pcondno
sqlstate1 = RETURNED_SQLSTATE;
END;
cs2: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
BEGIN
RESIGNAL nodata;
…
END;
SET OParam1 = 0;
SELECT c1
INTO OParam1 FROM tab1; -- Returns warning NO DATA FOUND
…
END cs2;
END cs1;
BTEQ> CREATE SET TABLE
tab1 (c1 INTEGER);
BTEQ> CALL resig6(OParam1,2,sqlstate1, condid);
例7
次の例は、 診断域がい っぱいにな っ た場合に、 条件域 16 がプ ッ シ ュ ア ウ ト さ れて
次の条件を受け入れ る こ と を示 し てい ます。 RESIGNAL 文で SQLSTATE が指定 さ
れます。
ス ト ア ド ・ プ ロ シージ ャ の実行中に、 cs16 内の SELECT…INTO 文で完了条件
SQLSTATE '02000' が発生 し ます。
ス テー ト メ ン ト ( 文 ) 域に、 SELECT…INTO 文の詳細が入 り 、 条件域 1 が診断域に
追加 さ れます。
完了条件 SQLSTATE '02000' に対 し て cs16 内のハ ン ド ラ ーが呼び出 さ れ ま す。
cs16 内の RESIGNAL 文で条件 '23505' が発生 し ます。
診断域で既存の条件域がプ ッ シ ュ ・ ダ ウ ン さ れ、 条件番号が 1 大 き く な り ます。
ス テー ト メ ン ト ( 文 ) 域が更新 さ れ、 条件番号 1 の新 し い条件域が診断域に追加 さ
れます。
条件は、 cs15 内で定義 さ れたハン ド ラ ーに よ り 処理 さ れます。 cs15 内の
RESIGNAL 文で条件 SQLSTATE '23505' が発生 し ます。
240
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
RESIGNAL
診断域では、 既存の条件域がプ ッ シ ュ ・ ダ ウ ン さ れます。 条件域 2 は条件域 3 にな
り 、 SQLSTATE '23505' に対 し 新 し い条件域 1 が追加 さ れます。 条件域をず ら し て新
し い条件域を追加す る 動作は、 すべての RESIGNAL 文について発生 し ます。
最後に、 cs2 内の RESIGNAL 文で条件 SQLSTATE '23505' が発生 し 、 診断域の最上
部に新 し い条件域 1 が追加 さ れ、 その他の条件域はすべて 1 つプ ッ シ ュ ・ ダ ウ ン さ
れます。
条件は、 cs1 内のハン ド ラ ーに よ っ て処理 さ れ、 cs1 内の RESIGNAL 文では条件
SQLSTATE '23505' が発生 し ます。
こ こ で、 診断域内の条件の合計数は、 格納で き る 条件域の最大数の限度で あ る
16 に到達 し ま し た。
条件域 16 は診断域か ら 出 さ れ、 他の全ての条件域が 1 つプ ッ シ ュ ・ ダ ウ ン さ れ、
新 し い条件が条件域 1 と し て追加 さ れます。
ス テー ト メ ン ト ( 文 ) 域の NUMBER は 16 の ま ま で、 MORE が Y に設定 さ れます。
発生 し た条件は cs0 の CONTINUE ハン ド ラ ーに よ っ て処理 さ れます。
cs0 内の GET DIAGNOSTICS 文が条件域 16 か ら RETURNED_SQLSTATE '23505' を
取得 し 、 それを sqlstate1 に割当て ます。 ハン ド ラ ー ・ タ イ プが CONTINUE なので、
ス ト ア ド ・ プ ロ シージ ャ は cs16 内の SET 文か ら 処理を続行 し ます。
CALL 文は、 OParam1 = 0 お よ び sqlstate1 = '23505' を返 し ます。
CREATE PROCEDURE resig6 (OUT OParam1 INTEGER,
OUT sqlstate1 CHAR(5))
cs0: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
GET DIAGNOSTICS EXCEPTION 16
sqlstate1 = RETURNED_SQLSTATE;
cs1: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs2: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs3: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs4: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs5: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs6: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs7: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs8: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs9: BEGIN
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
241
第 6 章 : 条件処理
RESIGNAL
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs10: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs11: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs12: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs13: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs14: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs15: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
RESIGNAL SQLSTATE '23505';
cs16:BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
RESIGNAL SQLSTATE '23505';
SELECT c1 INTO OParam1 from tab1;
-- Returns warning NO DATA FOUND
SET OParam1 = 0;
END cs16;
END cs15;
END cs14;
END cs13;
END cs12;
END cs11;
END cs10;
END cs9;
END cs8;
END cs7;
END cs6;
END cs5;
END cs4;
END cs3;
END cs2;
END cs1;
END cs0;
BTEQ> CREATE SET TABLE
tab1 (c1 INTEGER);
BTEQ> CALL resig6(OParam1, sqlstate1);
242
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
GET DIAGNOSTICS
GET DIAGNOSTICS
目的
GET DIAGNOSTICS は、 診断域か ら 成功条件、 例外条件、 完了条件に関す る 情報を
取得 し ます。
呼出 し
実行可能プ ロ グ ラ ム。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
,
GET DIAGNOSTICS
parameter_name
variable_name
= statement_information_item
EXCEPTION condition_number
;
,
parameter_name =condition_information_item
variable_name
1101A636
説明
構文要素
指定内容
parameter_name
パ ラ メ ー タ 。 値には、 statement_information_item に含ま れ る 値が設定 さ れます。
variable_name
変数。 値には、 statement_information_item に含ま れ る 値が設定 さ れます。
EXCEPTION
診断域の条件域か ら 情報を返す こ と を示す言語要素。
condition_number
情報を取 り だす条件域の番号を解決す る 番号、 パ ラ メ ー タ 、 ま たは変数。
parameter_name |
variable_name
指定 し た条件域か ら 取得 し た condition_information_item の割当て先 と な る 出力パ ラ
メ ー タ ま たは変数。
condition_
information_item
条件情報 を 取 り 出す条件域 フ ィ ール ド の名前。 有効 な 条件情報の項目名の リ ス ト
につい て は、 「SIGNAL」 (219 ページ ) に記載 さ れてい る 構文表の condition_name 構文
要素を参照 し て く だ さ い。
statement_
information_item
診断域の ス テー ト メ ン ト ( 文 ) 域か ら 得 ら れ る 、 次の表に示 さ れてい る フ ィ ール ド 名
の 1 つ。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
243
第 6 章 : 条件処理
GET DIAGNOSTICS
文情報名
説明
COMMAND_FUNCTION
実行 さ れ る SQL 文を識別す る テ キ ス ト 文字列。
デー タ ・ タ イ プ : VARCHAR(128) CHARACTER SET LATIN
デフ ォ ル ト : ヌ ル
COMMAND_FUNCTION_CODE
各 コ マ ン ド 関数を固有に識別す る 番号。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
MORE
SQL 文の実行中に発生 し たすべての条件が診断域に格納 さ れてい る か ど う
か を示す コ ー ド 。
デー タ ・ タ イ プ : CHARACTER(1) CHARACTER SET LATIN
デフ ォ ル ト : N
N は、 SQL 文の実行中に発生 し たすべての条件が診断域に格納 さ れてい る
こ と を意味 し ます。
NUMBER
こ の前の SQL 文の実行の結果、 診断域に格納 さ れ て い る 完了条件の例
外数。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
ROW_COUNT
検索 DELETE 要求、 INSERT 要求、 MERGE 要求、 検索 UPDATE 要求の実
行に よ っ て、 ま たは、 こ の前の SQL 文の実行の直接の結果、 影響を受けた
行数。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
TRANSACTION_ACTIVE
ト ラ ンザ ク シ ョ ンが現在ア ク テ ィ ブか ど う か を示す コ ー ド 。
デー タ ・ タ イ プ : INTEGER
デフ ォ ル ト : 0
0 は、 ト ラ ンザ ク シ ョ ンが現在ア ク テ ィ ブではない こ と を意味 し ます。
使用上の注意
GET DIAGNOSTICS 文で文情報項目を指定す る と 、 Teradata Database は要求 さ れた
情報を ス テー ト メ ン ト ( 文 ) 域か ら 取得 し 、 単純 タ ーゲ ッ ト 指定に入れます。
GET DIAGNOSTICS 文で EXCEPTION を指定す る と 、 Teradata Database は要求 さ れ
た条件情報項目を、 診断域の条件番号に対応す る 条件域か ら 取得 し 、 単純 タ ーゲ ッ
ト 指定に入れます。
GET DIAGNOSTICS 文は、 診断域の内容は変更 し ません 。 GET DIAGNOSTICS で例
外条件が発生す る と 、 ス テー タ ス変数 SQLSTATE、 SQLCODE、 お よ び
ACTIVITY_COUNT のみが設定 さ れます。
244
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
GET DIAGNOSTICS
ルール
次のルールが、 GET DIAGNOSTICS に適用 さ れます。
• GET DIAGNOSTICS 文で EXCEPTION を指定 し 、 条件番号の値が次の定数の う
ちのいずれかの場合、 文は コ ンパ イ ル中にアボー ト し 、 エ ラ ーを返 し ます。
• NULL
•
値<1
• 値 >16。 16 は、 診断域に格納で き る 条件域の最大数です。
• GET DIAGNOSTICS 文で EXCEPTION を指定 し 、 条件番号の値が次のいずれか
の場合、 文は実行時にアボー ト し 、 エ ラ ーを返 し ます。
• NULL
•
•
値<1
値 > GET DIAGNOSTICS 文の実行時に診断域に格納 さ れてい る 条件数
• GET DIAGNOSTICS 文で EXCEPTION を指定 し 、 前記のルールのいずれに も 違
反 し ない場合、 Teradata Database では指定の条件番号を持つ条件域か ら 情報を取
得 し ます。 「例 2」 (248 ページ ) では、 こ のルールについて説明 し てい ます。
• GET DIAGNOSTICS 文内の文情報項目の右側には、 次の ス テー ト メ ン ト ( 文 ) 域
フ ィ ール ド 名のいずれか を指定す る 必要があ り ます。
• COMMAND_FUNCTION
• NUMBER
• COMMAND_FUNCTION_CODE • ROW_COUNT
• MORE
• TRANSACTION_ACTIVE
GET DIAGNOSTICS 文内の条件情報項目の右側は、 次の条件域フ ィ ール ド 名の
いずれかでなければな り ません。
• CLASS_ORIGIN
• MESSAGE_TEXT
• CONDITION_IDENTIFIER
• RETURNED_SQLSTATE
• CONDITION_NUMBER
• SUBCLASS_ORIGIN
• MESSAGE_LENGTH
それ以外の場合、 コ ン パ イ ル中に要求 を ア ボー ト し 、 要求側にエ ラ ー を 返 し
ま す。
• 診断域が空 ( こ の状態は、 GET DIAGNOSTICS が ク ラ イ ア ン ト が呼び出すス ト
ア ド ・ プ ロ シージ ャ 内の最初の文で、 そ こ で文情報を要求 し た場合に発生す る )
の場合、 要求 さ れた文情報項目のデフ ォ ル ト 値が返 さ れます。 「例 5」 (250 ペー
ジ ) では、 こ のルールについて説明 し てい ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
245
第 6 章 : 条件処理
GET DIAGNOSTICS
• 文で指定 さ れてい る value や条件情報項目の宣言デー タ ・ タ イ プは、 対応す る 文
ま たは条件情報項目名のデー タ ・ タ イ プ と 互換性がなければな り ません。
それ以外の場合、 コ ンパ イ ル中に要求を アボー ト し 、 エ ラ ーを返 し ます。
次のページの表では、 value 指定の有効なデー タ ・ タ イ プに適用 さ れ る 互換性の
ルールについて説明 し ます。 セルに √ マー ク があれば、 その組み合わせは互換
性があ る こ と を示 し 、 空白のセルはその組み合わせに互換性が ない こ と を示 し
ます。
246
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
CHARACTER
VARCHAR
CHARACTER
√
√
VARCHAR
√
√
DECIMAL
(n,0)
NUMERIC
(n,0)
INTEGER
BYTEINT
SMALLINT
BIGINT
INTEGER
√
√
√
√
√
√
BYTEINT
√
√
√
√
√
√
SMALLINT
√
√
√
√
√
√
BIGINT
√
√
√
√
√
√
DECIMAL(n,0)
√
√
√
√
√
√
NUMERIC(n,0)
√
√
√
√
√
√
247
第 6 章 : 条件処理
GET DIAGNOSTICS
例1
次の例は、 GET DIAGNOSTICS 文での文情報項目フ ィ ール ド ROW_COUNT の使用
法を示 し てい ます。 プ ロ シージ ャ の実行中、 GET DIAGNOSTICS 文は rowcount パ ラ
メ ータ を 0 に設定し ます。 CALL 文は、 OParam = 0 および rowcount = 0 を返し ます。
CREATE PROCEDURE getdiag1 (OUT
OParam
INTEGER,
INOUT rowcount INTEGER)
BEGIN
SELECT c1 INTO OParam FROM tab1; -- Returns warning
GET DIAGNOSTICS rowcount = ROW_COUNT;
IF (rowcount = 0) THEN
SET OParam = 0;
END IF;
END;
BTEQ> CREATE SET TABLE
NODATA FOUND
tab1 (c1 INTEGER);
BTEQ> CALL getdiag1(OParam, NULL);
例2
次の例は、 文情報項目フ ィ ール ド RETURNED_SQLSTATE を使用 し て、 診断域の
完了条件に関連す る 情報を取得す る 方法を示 し てい ます。 こ れは ま た、 条件番号
pcondno が こ の例では ヌ ルではない こ と を示 し てい ます。
プ ロ シージ ャ の実行中に、 SELECT…INTO は実行前に診断域を ク リ ア し 、 完了条件
SQLSTATE '02000' を発行 し ます。
ス テー ト メ ン ト ( 文 ) 域が更新 さ れ、 診断域では完了条件に関連す る 情報を使っ て
条件域が追加 さ れます。
SQLSTATE '02000 は外側の複合文に伝搬 さ れます。 複合文 cs1 内の CONDITION
HANDLER が SQLSTATE '02000' での完了条件を処理 し ます。
GET DIAGNOSTICS 文は診断域か ら 条件域 1 を取得 し 、 RETURNED_SQLSTATE 値
'02000' を sqlstate1 に割当て ます。
CALL 文は、 OParam1 = 0、 pcondno = 1、 お よ び sqlstate1 = '02000' を返 し ます。
CREATE PROCEDURE getdiag5 (OUT
OParam1
INTEGER,
INOUT pcondno
INTEGER,
OUT
sqlstate1 CHARACTER(5))
cs1: BEGIN
DECLARE nodata CONDITION FOR SQLSTATE '02000';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
GET DIAGNOSTICS EXCEPTION pcondno
sqlstate1 = RETURNED_SQLSTATE;
cs2: BEGIN
SET OParam1 = 0;
SELECT c1 INTO OParam1 FROM tab1;
-- Returns warning NO DATA FOUND
END cs2;
END cs1;
BTEQ> CREATE SET TABLE
tab1 (c1 INTEGER);
BTEQ> CALL getdiag5(OParam1,1,sqlstate1);
248
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 6 章 : 条件処理
GET DIAGNOSTICS
例3
次の例は、 Teradata セ ッ シ ョ ン ・ モー ド の GET DIAGNOSTICS 文での文情報項目
フ ィ ール ド TRANSACTION_ACTIVE の使用法を示 し てい ます。
こ の例では、 プ ロ シージ ャ は Teradata セ ッ シ ョ ン ・ モー ド で作成 さ れてい ます。
実行中、 2 番目の INSERT 行に よ っ て重複行例外が発生する ので、 シ ス テムが ト ラ ン
ザ ク シ ョ ン を ロ ールバ ッ ク し ます。
CONTINUE HANDLER が呼び出 さ れ、 GET DIAGNOSTICS 文は文情報項目フ ィ ー
ル ド TRANSACTION_ACTIVE と COMMAND_FUNCTION を診断域の ス テー ト メ ン
ト ( 文 ) 域か ら 取得 し ます。
プ ロ シージ ャ の実行が終了す る と 、 OParam の値は 0 にな っ てい ます。 こ れは、
GET DIAGNOSTICS 文が発行 さ れ、 Stmt に文字列 'INSERT' が入っ た時点ではア ク
テ ィ ブな ト ラ ンザ ク シ ョ ンがないか ら です。
CREATE PROCEDURE getdiag3 (OUT OParam INTEGER,
OUT Stmt
CHARACTER(40))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
GET DIAGNOSTICS OParam = TRANSACTION_ACTIVE,
Stmt = COMMAND_FUNCTION;
INSERT INTO Tab1 VALUES(100);
INSERT INTO Tab1 VALUES(100);
END;
BTEQ> CREATE SET TABLE
tab1 (c1 INTEGER);
BTEQ> CALL getdiag3(OParam, Stmt);
例4
次の例は、 ANSI セ ッ シ ョ ン ・ モー ド で作成 さ れたプ ロ シージ ャ の場合の、 GET
DIAGNOSTICS 文での文情報項目フ ィ ール ド TRANSACTION_ACTIVE の使用法を
示 し てい ます。
プ ロ シージ ャ の実行中、 2 番目の INSERT 文に よ っ て発生し た重複行例外は、 ト ラ ン
ザ ク シ ョ ン を ロ ールバ ッ ク し ません。 ANSI セ ッ シ ョ ン ・ モー ド では行の重複は許
可 さ れてい る か ら です。
CONTINUE HANDLER が呼び出 さ れ、 GET DIAGNOSTICS 文は Oparam に ス テー
ト メ ン ト ( 文 ) 域か ら 取 り 出 し た TRANSACTION_ACTIVE フ ィ ール ド の値を設定
し ま す。
プ ロ シージ ャ の実行が終了す る と 、 OParam の値は 1 に な っ て い ま す。 GET
DIAGNOSTICS 文の発行時に ト ラ ン ザ ク シ ョ ン が ア ク テ ィ ブに な っ て い る か ら
です。
CREATE PROCEDURE getdiag4 (OUT OParam INTEGER)
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
GET DIAGNOSTICS OParam = TRANSACTION_ACTIVE;
INSERT INTO Tab1 VALUES(100);
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
249
第 6 章 : 条件処理
GET DIAGNOSTICS
INSERT INTO Tab1 VALUES(100);
END;
BTEQ> CALL getdiag4(OParam);
例5
次の例は、 診断域が空で、 文情報項目 ( こ の場合 ROW_COUNT) が要求 さ れた と き
の GET DIAGNOSTICS 文の動 き を示 し てい ます。
プ ロ シージ ャ の実行中、 実行 さ れ る 最初の文は GET DIAGNOSTICS 文です。 診断
域は、 ク ラ イ ア ン ト が呼び出 し た ス ト ア ド ・ プ ロ シージ ャ の実行開始時には空なの
で、 rowcount には ROW_COUNT のデフ ォ ル ト 値、 すなわちゼ ロ が設定 さ れます。
CREATE PROCEDURE getdiag3 (OUT rowcount INTEGER)
BEGIN
GET DIAGNOSTICS rowcount = ROW_COUNT;
…
END;
BTEQ> CALL getdiag3(rowcount);
250
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第7章:
ホス ト 変数 と 複文要求
こ の章では、 特殊な ト ピ ッ ク 、 お よ び埋め込み SQL アプ リ ケーシ ョ ンでのみ使用
さ れ る SQL 文について説明 し ます。
他の埋め込み SQL に関連 し た情報は、 以下の章を参照 し て く だ さ い。
• 第 2 章 : 「SQL カー ソ ル」
• 第 4 章 : 「結果 コ ー ド 変数」
• 第 11 章 : 「 ク ラ イ ア ン ト - サーバー接続文」
• 第 12 章 : 「埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ」
ホ ス ト 構造
定義
ホ ス ト 構造 と は、 使用 し てい る 埋め込み SQL アプ リ ケーシ ョ ンのホ ス ト 言語の
SQL の外部で宣言 さ れた、 ホ ス ト 変数の配列です。
例
以下の、 埋め込み SQL SELECT 文が COBOL アプ リ ケーシ ョ ン用に作成 さ れてい る
場合を考慮 し てみま し ょ う 。 こ の文の目的は、 会社に よ っ て雇用 さ れてい る 最初の
100 人の従業員の人種統計の レ ポー ト を作成す る こ と です。
EXEC SQL
SELECT EmpNo, LastName, Ethnicity, BirthDate, SSN, DeptNo
INTO :EmpNo, :LastName, :Ethnicity, :BirthDate, :SSN, :DeptNo
FROM Employee
WHERE EmpNo < ‘100’
END-EXEC
6 つのホ ス ト 変数の名前を入力す る 代わ り に、 :EmpNo、 :LastName、 :Ethnicity、
:BirthDate、 :SSN、 お よ び :DeptNo を配列の個々の要素 と す る 名前付 き ホ ス ト 構造を
作成 し て、 それか ら その問い合わせの名前を個々のホ ス ト 変数に置 き 換え る こ と が
で き ます。
同 じ COBOL の例は、 次の よ う に書 き 直 し て、 :FounderEmployeeInfo を、 ホ ス ト 変
数 :EmpNo、 :LastName、 :Ethnicity、 :BirthDate、 :SSN、 お よ び :DeptNo を含むホ ス ト
構造の名前 と す る こ と も で き ます。
EXEC SQL
SELECT EmpNo, LastName, Ethnicity, BirthDate, SSN, DeptNo
INTO :FounderEmployeeInfo
FROM Employee
WHERE EmpNo < ‘100’
END-EXEC
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
251
第 7 章 : ホ ス ト 変数 と 複文要求
ホ ス ト 変数
ホス ト 構造は ANSI セ ッ シ ョ ン ・ モー ド ではサポー ト さ れない
ANSI セ ッ シ ョ ン ・ モー ド では配列をサポー ト し ません。 し たがっ て、 ホ ス ト 構造
も 、 修飾 さ れた ホ ス ト 変数 も サポー ト さ れません。
ホス ト 構造は Teradata セ ッ シ ョ ン ・ モー ド ではサポー ト さ れる
Teradata セ ッ シ ョ ン ・ モー ド は、 IBM 形式のホ ス ト 構造を最大 2 レベル ま でサポー
ト し ます。
Teradata セ ッ シ ョ ン ・ モー ド は、 ホ ス ト 構造内の フ ィ ール ド を参照す る 、 修飾 さ れ
た ホ ス ト 変数 も サポー ト し ます。
埋め込み SQL 文内の完全修飾 さ れた ホ ス ト 変数参照は、 完全修飾 さ れた SQL 列参
照 と 同 じ 方法で表現 さ れます。 つま り 、 FULLSTOP 文字に よ っ て異な る レベルの修
飾が区切 ら れます。
こ の構文は、 サポー ト さ れ る すべてのホ ス ト 言語で有効です。
こ の例では、 要点を説明す る ために COBOL を使用 し て、
:SHIPMENT-RECORD.WEIGHT を完全修飾ホ ス ト 変数 と し て使用 し てい ます。
ADD 5 TO WEIGHT OF SHIPMENT-RECORD.
EXEC SQL
DELETE FROM SHIPMENT_TABLE
WHERE WEIGHT > :SHIPMENT-RECORD.WEIGHT
END-EXEC.
ホ ス ト 変数
定義
ホ ス ト 変数 と は、 埋め込み SQL 文で参照 さ れ る 次の項目のいずれかです。
• そのホ ス ト 言語の文で直接定義 さ れてい る 、 ホ ス ト 言語変数
• Preprocessor2 に よ っ て生成 さ れ、 SQL 内か ら 間接的に定義 さ れてい る 、 ホ ス ト
言語 SQL ベース構成
USING 要求修飾子内の コ ロ ン接頭辞付 き 変数、 お よ びス ト ア ド ・ プ ロ シージ ャ の
ロ ーカル変数 と パ ラ メ ー タ は、 埋め込み SQL ホ ス ト 変数 と 同様に機能 し ます。
<SQL デー タ 操作言語 > の 「USING 要求修飾子」 と 、 「 ロ ーカル変数」 (124 ページ )
お よ び 「パ ラ メ ー タ 」 (125 ページ ) を参照 し て く だ さ い。
ホス ト 変数の目的
ホ ス ト 変数では、 SQL 文に入力値を提供 し ( 「入力ホ ス ト 変数」 (256 ページ ) を参
照 )、 ま た SQL 要求か ら出力値を受け取 り ます ( 「出力ホ ス ト 変数」 (258 ページ ) を
参照 )。 それ ら は、 埋め込み式 SQL 文内の名前に よ っ て識別 さ れます ( た と えば、
Value-Var ま たは HostIn-Var)。
252
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
ホ ス ト 変数
埋め込み SQL 文内のホ ス ト 変数には、 SQL BEGIN DECLARE SECTION 文 と END
DECLARE SECTION 文 と の間で、 アプ リ ケーシ ョ ンのホ ス ト 言語で宣言 さ れた同 じ
名前のホ ス ト 変数 と 、 1 対 1 の関係があ り ます。
ホス ト 変数の分類
ホ ス ト 変数は、 メ イ ン ・ カ テ ゴ リ と 標識カ テ ゴ リ に分類 さ れます。
ホス ト
こ のホ ス ト 変数の機能
メ イ ン変数
Teradata Database と のデー タ の送受信に使用 さ れ ます。
標識変数
次のいずれか を示 し ます。
• メ イ ン変数の入力が ヌ ル
• メ イ ン変数の出力が ヌ ル
• 文字ま たはバ イ ト ・ デー タ の場合、 出力が短縮
ホス ト 変数の処理
実行時に、 Preprocessor2 は指定 し た ホ ス ト 入力変数か ら 値を取 り 出 し 、 処理す る
SQL 文 と と も にそれ ら を Teradata Database に送信 し ます。 こ の機能は、 関連デー タ
があ る Teradata の対話型 SQL USING 句や、 パ ラ メ ー タ があ る マ ク ロ 用の Teradata
SQL EXEC 文 と 似てい ます。
Teradata Database が、 デー タ を返す SQL 文の結果を ク ラ イ ア ン ト ・ ア プ リ ケー
シ ョ ン ・ プ ロ グ ラ ムに返す場合、 Preprocessor2 は対応す る 値を、 INTO 句で リ ス ト
さ れ、 コ ン マに よ っ て区切 ら れてい る 指定 さ れた ホ ス ト 出力変数に送 り ます。
ホ ス ト ・ メ イ ン変数は、 ホ ス ト 標識変数 と 関連付け る こ と も で き ます。 ホ ス ト 標識
変数についての詳細は、 「標識変数」 (263 ページ ) を参照 し て く だ さ い。
ホス ト 変数の使用の規則
ホ ス ト 変数の使用には、 い く つかの規則が当ては ま り ます。 こ れ ら の規則のい く つ
かは、 ホ ス ト 変数が使用 さ れ る 埋め込み SQL 文には依存 し てい ません。
文に依存 し ない規則のい く つか を以下に示 し ます。
• すべてのホ ス ト 変数は コ ロ ン文字で始ま ら なければな り ません。
コ ロ ン文字を指定 し て、 変数 と 表列参照 と を区別 し ます。 例 1:
SELECT * FROM table
INTO :intofield1
WHERE COL1 = :hostvar1
こ れが実行 さ れ る と 、 hostvar1 の値は、 定数が指定 さ れたかの よ う に WHERE 句
に置 き 換え て入れ ら れます。
例 2:
SELECT :hostvar1,
COL1, COL2 + :hostvar2
INTO :intofield1,
:intofield2 INDICATOR :indvar1,
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
253
第 7 章 : ホ ス ト 変数 と 複文要求
ホ ス ト 変数
:intofield3 INDICATOR :indvar2
FROM table
WHERE COL3 = 'ABC'
実行時には、 hostvar1 お よ び hostvar2 の値は、 定数が指定 さ れていたかの よ う に
SELECT リ ス ト に置 き 換え て入れ ら れます。
Teradata モー ド では、 ホ ス ト 変数 ( た と えば intofieldn) の前に コ ロ ン文字を付け
る か ど う かは任意ですが、 強 く 推奨 さ れてい ます。
• 次の例で、 標識ホ ス ト 変数 (indvar1 お よ び indvar2) を指定す る と き は、 最初の
コ ロ ン文字が必須です。
こ の使用は、 デー タ を返す文の INTO 句ま たはカー ソ ル関連 FETCH 文 と 必ず関
連付け ら れます。
SELECT column_1,
column_2
INTO :intofield1 INDICATOR :indvar1,
:intofield2 INDICATOR :indvar2
FROM table
WHERE column_3 = 'ABC'
アプ リ ケーシ ョ ンでの ヌルの処理についての詳細は、 「標識変数」 (263 ページ ) を
参照 し て く だ さ い。
:indvarn は、 関連付け ら れた :intofieldn が ヌ ルか ど う か を示 し 、 文字お よ びバ イ
ト 列デー タ の場合は、 Teradata Database サーバー ・ デー タ を フ ィ ール ド に戻す場
合に切 り 捨てが行なわれ る か ど う か を示 し ます。
:intofieldn には、 文の実行時に column_n の値が入 り ます。 column_n が ヌ ルの場
合、 :intofieldn の値は不確定です。
•
コ ロ ン文字の前後の埋め込み文字は任意指定。 ホ ス ト 変数での コ ロ ン文字の使
用法については、 <SQL デー タ 操作言語 > の 「SQL デー タ 操作言語文の構文規
則」 と い う 章で個々の文に関 し て説明 し てい ます。
•
ホ ス ト 変数名は先頭が数値であ っ てはな り ません。
•
ホ ス ト 変数名はプ ロ グ ラ ム内で固有にす る 必要があ り ます。 こ れは、 C で作成
さ れた アプ リ ケーシ ョ ンの場合は必須であ り 、 COBOL お よ び PL/I で作成 さ れ
たアプ リ ケーシ ョ ンの場合 も 強 く 推奨 さ れます。
• WHERE 句では、 ホ ス ト 変数を使用 し て、 検索条件の値の指定や検索式の リ テ
ラ ルの置換を行ない ます。
標識変数 ( 「標識変数」 (263 ページ ) を参照 ) は、 WHERE 句で使用で き ます。
• SELECT リ ス ト 内のホ ス ト 変数は、 式の一部 と し て、 ま たはその も のが単一の
列を表わす よ う に使用す る こ と がで き ます。
• 標識変数 ( 「標識変数」 (263 ページ ) を参照 ) は、 SELECT リ ス ト では使用で き
ません。
• ホ ス ト 変数お よ び標識変数 ( 「標識変数」 (263 ページ ) を参照 ) は、 INSERT
文の VALUES 句ま たは UPDATE 文の SET 句で使用す る こ と がで き ます。
• ホ ス ト 変数を CHECKPOINT、 DATABASE、 お よ び LOGON 文で使用 し て、
コ マ ン ド を完成 さ せ る ( つま り SQL 文字列 と し て ) こ と がで き ます。
• ホ ス ト 変数は、 デー タ を返す文の出力を受け取 る アプ リ ケーシ ョ ン格納領域を
識別す る ために使用す る こ と がで き ます。
254
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
ホ ス ト 変数
ホス ト 変数でのコ ロ ン文字の使用
ANSI/ISO SQL 規格では、 すべてのホ ス ト 変数で コ ロ ン文字を先行 さ せて、 SQL 列
参照 と 区別す る よ う に規定 し てい ます。 そ う し ない と 、 あい ま いにな る 可能性があ
る ためです。
Teradata SQL で は、 い く つか の状況で先行の コ ロ ン 文字が必要ですが、 すべ て
の場合で必要なわけではあ り ません ( 詳細は 「Teradata モー ド で必須の コ ロ ン文字
の使用」 (255 ページ ) お よ び 「Teradata モー ド で任意指定の コ ロ ン文字の使用」
(255 ページ ) を参照 )。
最善の方法は、 た と えセ ッ シ ョ ン を Teradata モー ド で実行す る 場合で も 、 すべての
ホ ス ト 変数の最初に コ ロ ン文字を使用す る こ と です。
Teradata モー ド で必須のコ ロ ン文字の使用
Teradata モー ド での以下の条件下では、 SQL 文でのホ ス ト 変数参照に コ ロ ン文字が
先行 し てい る こ と が必要です。
•
ホ ス ト 変数名が SQL 予約語であ る 。
•
ホ ス ト 変数が標識変数 と し て使用 さ れ る ( 「標識変数」 (263 ページ ) を参照 )。
• 構文の使用があい ま いで、 名前が列参照ま たはホ ス ト 変数参照のいずれに も な
り 得る。
た と えば、 WHERE 句の WHERE column_1 = field_1 で、 field_1 は表ま たはホ ス
ト 変数の ど ち ら の列に も な り 得 る 。
• 参照が DATABASE 文にあ る ( つま り DATABASE :var1)。
• 参照が SET CHARSET 文のオブジ ェ ク ト であ る 。
• 参照が Teradata Database 関数の引数であ る 。 た と えば、 ABS(:var_1)。
• 入力変数 と し て使用す る 予定の COBOL 変数名の先頭 ( 数値定数が予期 さ れてい
る ) が数字 (0-9) であ る 。
• 参照が、 「Teradata モー ド で任意指定の コ ロ ン文字の使用」 (255 ページ ) に リ ス
ト さ れた項目の どれに も 該当 し ない場所にあ る 。
• UPDATE 文の SET 句ま たは WHERE 句で指定 さ れ る ホ ス ト 変数、 お よ び
MERGE 文の match_condition、 SET、 ま たは INSERT 句で指定 さ れ る ホ ス ト 変数
については、 先行の コ ロ ン文字が必須。
Teradata モー ド で任意指定のコ ロ ン文字の使用
Teradata モー ド での以下の条件下では、 SQL 文でのホ ス ト 変数参照に コ ロ ン文字を
先行 さ せ る こ と は任意指定です。
• INTO 句
• CONNECT 文の ID ま たはパ ス ワー ド 変数のいずれか
• DESCRIBE 文ま たは PREPARE 文の FOR STATEMENT 句
• EXECUTE 文ま たは OPEN 文の USING 句
• EXECUTE 文、 FETCH 文、 ま たは OPEN 文の DESCRIPTOR 句
• LOGON 文のオブジ ェ ク ト
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
255
第 7 章 : ホ ス ト 変数 と 複文要求
入力ホ ス ト 変数
• EXECUTE IMMEDIATE 文のオブジ ェ ク ト
• INSERT 文の VALUES 句
• POSITION 文の TO STATEMENT 句
最善の方法は、 た と え Teradata ト ラ ンザ ク シ ョ ン ・ モー ド でセ ッ シ ョ ン を実行
す る 場合で も 、 すべての ホ ス ト 変数の最初に コ ロ ン文字を使用す る こ と です。
動的 SQL のホス ト 変数
動的 SQL のホ ス ト 変数のサポー ト は、 静的 SQL でサポー ト さ れ る 場合 と 同 じ では
あ り ません。 代わ り に、 動的 SQL は、 パ ラ メ ー タ ・ マーカー と も 呼ばれ る 、 疑問
符 (?) プ レース ホルダー ・ ト ー ク ン を使用 し ます。
こ の違い を例示す る 、 以下の 2 つの例を考慮 し て く だ さ い。
最初に、 ホ ス ト 変数を使用す る 静的 SQL INSERT があ り ます。 2 番目の も のは同 じ
文ですが、 ホ ス ト 変数の代わ り にパ ラ メ ー タ ・ マーカーを使用す る 動的 SQL 文 と
し て実行 さ れます。
INSERT INTO parts
VALUES (:part_no, :part_desc)
INSERT INTO parts
VALUES (?, ?)
動的 SQL 文でのプ レース ホルダーの使用についての詳細は、 「PREPARE」 (362 ペー
ジ ) を参照 し て く だ さ い。
入力ホ ス ト 変数
ホ ス ト 変数入力を含む SQL 文が、 処理のために Teradata Database ク ラ イ ア ン ト に送
信 さ れ る と 、 Preprocessor2 はその入力値を、 対応す る ホ ス ト 入力変数か ら 取 り 出
し 、 それを処理のために Teradata Database に送信 し ます。
ス ト ア ド ・ プ ロ シージ ャ では、 ホ ス ト 入力変数は IN パ ラ メ ー タ と 言われます。 ス
ト ア ド ・ プ ロ シージ ャ の別の種類のパ ラ メ ー タ の INOUT は、 プ ロ シージ ャ にデー
タ を渡 し た り 、 プ ロ シージ ャ か ら デー タ を取 り 出すのに使用 さ れます。 「パ ラ メ ー
タ 」 (125 ページ ) お よ び 「IN、 OUT、 お よ び INOUT パ ラ メ ー タ の規則」 (126 ペー
ジ ) を参照 し て く だ さ い。
規則
• 入力 メ イ ン ・ ホ ス ト 値が、 WHERE 句の式で、 ま たは SELECT リ ス ト の一部 と
し て使用 さ れ る と き は、 ホ ス ト 変数のデー タ ・ タ イ プ と 式のデー タ ・ タ イ プは、
同 じ ド メ イ ンか ら 取 り 出 さ れなければな り ません。
こ の よ う に使用 さ れ る 入力 メ イ ン ・ ホ ス ト 変数 と し て、 標識ホ ス ト 変数を指定
す る こ と は で き ません。
256
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
入力ホ ス ト 変数
• 入力 メ イ ン ・ ホ ス ト 値を、 INSERT ま たは UPDATE にデー タ を提供す る ために
使用す る 場合、 ホ ス ト 変数のデー タ ・ タ イ プ と 式のデー タ ・ タ イ プは、 同 じ ド
メ イ ンか ら 取 り 出 さ れなければな り ません。
Teradata SQL では、 文字 タ イ プ と 数字 タ イ プの混在を許可 し てい ます。
こ の よ う に使用 さ れ る 入力 メ イ ン ・ ホ ス ト 変数 と し て、 標識ホ ス ト 変数を指定
す る こ と は 可能 です。 こ のデー タ ・ タ イ プの規則は、 関連付け ら れた標識ホ
ス ト 変数 ( 「標識変数」 (263 ページ ) を参照 ) が指定 さ れ、 かつ標識変数が
NULL を示す場合は、 入力 メ イ ン ・ ホ ス ト 変数には適用 さ れません。
• 標識変数 ( 「標識変数」 (263 ページ ) を参照 ) が、 ヌ ル受け入れ不能の表の列に
対応す る 入力 メ イ ン ・ ホ ス ト 変数に指定 さ れてい る 場合、 標識変数は必ず
NULL でない こ と を示 さ なければな り ません。
• CHARACTER ホ ス ト 変数を VARCHAR フ ィ ール ド への入力 と し て使用す る 場合
には、 注意が必要です。
シ ス テ ムでは、 すべての後続ブ ラ ン ク を ホ ス ト 値か ら 除去 し ます。 こ れはホ ス
ト 変数に含まれてい る 単一ブ ラ ン ク も 対象 と な り ます。
例えば、 CHARACTER(3) で タ イ プ指定 さ れた値 A('A ') のホ ス ト 変数が
VARCHAR(10) で タ イ プ指定 さ れた Teradata Database フ ィ ール ド に ロ ー ド さ れ る
と 、 結果 と し て、 可変長が 1 と 設定 さ れた値 A('A') にな り ます。 末尾の 2 つの埋
め込み文字は失われます。
同様に、 ホ ス ト 変数の長 さ が 1 で フ ィ ール ド の値がブ ラ ン ク の場合、 VARCHAR
フ ィ ール ド はブ ラ ン ク で も ヌ ルで も な く 、 長 さ が 0 の文字列です。
こ の特徴は、 VARCHAR フ ィ ール ド に渡すすべての埋め込み文字を保存す る 他
のシ ス テ ム と は異な り ます。 VARCHAR フ ィ ール ド で埋め込み文字を保存す る
には、 長 さ が number_of_characters + number_of_pad_characters( 文字数プ ラ ス埋
め込み文字数 ) であ る VARCHAR フ ィ ール ド と し て ホ ス ト 変数を定義 し て く だ
さ い。 例えば、 'A ' を含んでい る フ ィ ール ド は、 CHARACTER(3) ではな く
VARCHAR(3) で定義す る 必要があ り ます。
静的要求の入力ホス ト 変数
静的 SQL 要求で使用す る 入力変数は、 SQL 文の適切な場所で変数名を参照す る こ
と に よ っ て指定 し ます。
以下の文は、 入力ホ ス ト 変数を使用 し た静的要求の例です。
EXEC SQL
SELECT field1
FROM table1
WHERE field2 = :var1
:var1 は、 表か ら 選択 さ れ る 行を判別す る ために使用 さ れ る 、 適切に定義 さ れた ホ ス
ト 変数を表わ し ます。
アプ リ ケーシ ョ ンは、 var1 の値を、 複数の SQL 文の実行の合間に変更す る こ と が
で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
257
第 7 章 : ホ ス ト 変数 と 複文要求
出力ホ ス ト 変数
動的要求の入力ホス ト 変数
入力変数は、 以下の タ イ プの動的要求でのみ使用 し ます。
• 動的カー ソ ルの OPEN 文を使用 し て実行 さ れ る も の
• EXECUTE 文を使用 し て実行 さ れ る も の
入力ホ ス ト 変数を EXECUTE IMMEDIATE で使用す る こ と はで き ません。
要求内の入力ホ ス ト 変数は、 パ ラ メ ー タ ・ マーカー と 呼ばれ る 疑問符 (?) ト ー ク ン
に よ っ て表わ さ れます。
SQL 文が実行 さ れ る と 、 Preprocessor2 は、 疑問符 (?) ト ー ク ン の適切な ホ ス ト 変
数を以下のいずれかの方法で置 き 換え ます。
•
ホ ス ト 変数名の使用に よ っ て
• 変数を記述す る 入力 SQLDA の使用に よ っ て
た と えば、 以下の文が、 動的名 S1 を使用 し て正常に準備 さ れてい る と 仮定 し
ま す。
DELETE FROM table1
WHERE field1 = ?
疑問符 (?) に置 き 換え る 変数を指定す る ために、 アプ リ ケーシ ョ ン ・ コ ー ド には
以下の文のいずれか 1 つが含まれます。
EXEC SQL
EXECUTE S1 USING :var1
ま たは
EXEC SQL
EXECUTE S1 USING DESCRIPTOR INPUTDA
こ こ で INPUTDA は、 プ ロ グ ラ マ定義の SQLDA 構造です。
文が実行 さ れ る と き に、 Preprocessor2 はホ ス ト 変数か ら 値を取 り 出 し 、 それを
Teradata Database に、 疑問符 (?) パ ラ メ ー タ ・ マーカー ・ ト ー ク ンに代わ る も の
と し て渡 し ます。
出力ホ ス ト 変数
デー タ を返す SQL 文の結果を Teradata Database か ら 受け取 る と 、 Preprocessor2 は
値を取 り 出 し 、 それを対応す る ホ ス ト 出力変数に格納 し ます。
有効なデー タ ・ タ イ プの組み合わせ
出力 メ イ ン ・ ホ ス ト 変数を使用 し てデー タ を FETCH ま たは SELECT 文か ら 受け取
る 場合、 特定の SELECT リ ス ト の要素 と ホ ス ト 変数のデー タ ・ タ イ プ と の組み合わ
せだけが許可 さ れます。
有効な組み合わせを以下の表に示 し ま す。 こ れ以外に有効な組み合わせはあ り ま
せん。
258
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
出力ホ ス ト 変数
他の組み合わせの大半は、 デー タ ・ タ イ プ ・ ホ ス ト 変数 と 互換性が あ る デー タ ・
タ イ プへの変更を表の列に対 し て強制す る こ と に よ り 使用で き ます。
「ホ ス ト 変数のデー タ ・ タ イ プ」 列に リ ス ト さ れてい る デー タ ・ タ イ プは汎用の も
のです。
Teradata Database の列デー タ ・ タ イ プ
ホ ス ト 変数のデー タ ・ タ イ プ
BYTE(m)
VARBYTE(m)
BYTE(n)
VARBYTE(n)
CHARACTER(n)
VARCHAR(n)
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL
NUMERIC
FLOAT
REAL
DOUBLE PRECISION
GRAPHIC(n)
VARGRAPHIC(n)
CHARACTER(m)
VARCHAR(m)
CHARACTER(n)
VARCHAR(n)
DATE (Teradata)
CHARACTER(n)
VARCHAR(n)
INTEGER
BIGINT
DECIMAL
NUMERIC
FLOAT
REAL
DOUBLE PRECISION
DATE (ANSI)
TIME
TIMESTAMP
INTERVAL
CHARACTER(n)
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL
NUMERIC
FLOAT
REAL
DOUBLE PRECISION
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL
NUMERIC
FLOAT
REAL
DOUBLE PRECISION
GRAPHIC(m)
VARGRAPHIC(m)
GRAPHIC(n)
VARGRAPHIC(n)
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
259
第 7 章 : ホ ス ト 変数 と 複文要求
出力ホ ス ト 変数
Teradata Database の列デー タ ・ タ イ プ
UDT
ホ ス ト 変数のデー タ ・ タ イ プ
現在はサポー ト さ れてい ません。
UDT の CREATE TRANSFORM 文に よ っ て定
義 さ れた fromsql 変換 タ ーゲ ッ ト ・ デー タ ・
タ イ プ。
詳細は、 <SQL デー タ 定義言語 > の
「 CREATE TRANSFORM 」 を 参照 し て く だ
さ い。
割 り 当て規則
次の表は、 出力ホ ス ト 変数の割 り 当て規則についての説明です。
デー タ ・ タ イ プ
BYTE
条件
説明
m<n
m バ イ ト のデー タ がホ ス ト 変数に移 さ れ、 (n - m) バ イ
ト の x'00' が追加 さ れ る 。
m=n
m バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。
m>n
n バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。 標識を使
用す る 場合 m に設定 さ れ る 。 SQLCA 内の SQLWARN1
は 'W' に設定 さ れ る 。
m はデー タ の長 さ を表わす。
n はホ ス ト 変数の長 さ を表わす。
BYTEINT、 SMALLINT、 INTEGER は、 それぞれ 1、
2、 4 の暗黙指定の長 さ を持つ。
DECIMAL は、 1 ~ 16 バ イ ト の長 さ を 持つ こ と が で
き る。
FLOAT は、 single (4 バ イ ト ) ま たは double (8 バ イ ト )
の ど ち ら にす る こ と も で き る 。
BYTE フ ィ ール ド がホ ス ト 変数に割 り 当て ら れた と き
は、 デー タ 変換は実行 さ れない。 返 さ れた値の処理は
アプ リ ケーシ ョ ン の責任であ る 。
260
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
出力ホ ス ト 変数
デー タ ・ タ イ プ
VARBYTE
条件
説明
m <= n
m バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。
m>n
n バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。 標識を使
用す る 場合 m に設定 さ れ る 。 SQLCA 内の SQLWARN1
は 'W' に設定 さ れ る 。
m は現在のデー タ の長 さ を表わす。
n はホ ス ト 変数の最大長を表わす。
BYTEINT、 SMALLINT、 INTEGER は、 それぞれ 1、
2、 4 の暗黙指定の長 さ を持つ。
DECIMAL は、 1 ~ 16 バ イ ト の長 さ を 持つ こ と がで
き る。
FLOAT は、 single (4 バ イ ト ) ま たは double (8 バ イ ト )
の ど ち ら にす る こ と も で き る 。
BYTE フ ィ ール ド がホ ス ト 変数に割 り 当て ら れた と き
は、 デー タ 変換は実行 さ れない。 返 さ れた値の処理は
アプ リ ケーシ ョ ンの責任であ る 。
CHARACTER
m<n
m バ イ ト のデー タ がホ ス ト 変数に移 さ れ、 (n - m) バ イ
ト のブ ラ ン ク (EBCDIC 環境では x'40'、 ASCII 環境で
は x'20') が追加 さ れ る 。
m=n
m バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。
m>n
n バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。 標識を使
用す る 場合 m に設定 さ れ る 。 SQLCA 内の SQLWARN1
は 'W' に設定 さ れ る 。
m はデー タ の長 さ を表わす。
n はホ ス ト 変数の長 さ を表わす。
VARCHAR
m <= n
m バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。
m>n
n バ イ ト のデー タ がホ ス ト 変数に移 さ れ る 。 標識を使
用す る 場合 m に設定 さ れ る 。 SQLCA 内の SQLWARN1
は 'W' に設定 さ れ る 。
m はデー タ の現在の長 さ を表わす。 n はホ ス ト 変数の
最大長を表わす。
DATE (Teradata)
CHARACTER フ ィ ール ド 内で : Teradata Database 形式
が要求 さ れ る 場合、 n は最低 8 バ イ ト でなければな ら
ない。 その他のすべての形式で n は最低 10 バ イ ト に
す る 必要があ る 。 残 り のバ イ ト はブ ラ ン ク に設定 さ れ
る (EBCDIC 環境では x'40'、 ASCII 環境では x'20')。
ホ ス ト 変数が、 要求 さ れたデー タ 形式 を 含む こ と が
で き な い場合、 SQLCA の SQLCODE は -304 に設定
される。
数値フ ィ ール ド 内で : 値は、 指定 さ れた タ イ プで表示
で き なければな ら ず、 先頭の数字が欠落 し てはな ら な
い。 ホ ス ト 変数がデー タ を含む こ と がで き ない場合、
SQLCA の SQLCODE は -304 に設定 さ れ る 。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
261
第 7 章 : ホ ス ト 変数 と 複文要求
ホ ス ト 変数 と し ての SQL 文字列
デー タ ・ タ イ プ
条件
説明
DATE (ANSI)
TIME
TIMESTAMP
INTERVAL
Teradata Database 形式が要求 さ れ る 場合、 n は最低 8 バ
イ ト でなければな ら ない。 その他のすべての形式で n
は最低 10 バ イ ト にす る 必要があ る 。 残 り のバ イ ト は
ブ ラ ン ク に設定 さ れ る (EBCDIC 環境では x'40'、 ASCII
環境では x'20')。 ホ ス ト 変数が、 要求 さ れたデー タ 形
式を含む こ と がで き ない場合、 SQLCA の SQLCODE
は -304 に設定 さ れ る 。
BYTEINT
SMALLINT
INTEGER
BIGINT
DECIMAL
NUMERIC
FLOAT
REAL
DOUBLE
PRECISION
値は、 指定 さ れた タ イ プで表示で き なければな ら ず、
先頭の数字が欠落 し てはな ら ない。 ホ ス ト 変数がデー
タ を含む こ と がで き ない場合、 SQLCA の SQLCODE
は -304 に設定 さ れ る 。
ホ ス ト 変数 と し ての SQL 文字列
Preprocessor2 は、 SQL 文字列を、 入力で も 出力で も ない第 3 のホ ス ト 変数 と し て扱
い ます。
定義
SQL 文字列は、 埋め込み SQL 文 を 完成 さ せ る た めに使用す る 一連の文字の集 り
です。 こ れは、 表の行内の フ ィ ール ド に対応 し ていないので、 入力変数で も 出力
変数で も あ り ません。
ホス ト 変数 と し ての SQL 文字列
SQL 文字列は、 い く つかのホ ス ト 言語がそれ ら に対 し て特別な規則を適用す る の
で、 独立 し た カ テ ゴ リ のホ ス ト 変数です。 こ れ ら の規則は、 <Teradata PreProcessor2
埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > の言語ご と の章で詳 し く 説明 さ れてい ます。
文字列が埋め込み SQL 文で参照 さ れ る 場合は、 文字列の先頭に コ ロ ン文字を付け
る 必要があ る 場合があ り ます。 詳細は、 <SQL デー タ 操作言語 > の 「構文規則」 と 、
こ の章の個々の文の構文規則を参照 し て く だ さ い。
262
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
標識変数
文字列を ホス ト 変数 と し て使用する文
以下の表は、 SQL 文字列を ホ ス ト 変数 と し て使用す る 埋め込み SQL 文を リ ス ト し
てい ます。
SQL 文
ホ ス ト 変数 と し て使用す る SQL 文字列
CHECKPOINT
チ ェ ッ ク ポ イ ン ト ・ ラ ベルを ホ ス ト 変数 と し て表わす場合
DATABASE
デー タ ベース名を ホ ス ト 変数 と し て表わす場合
EXECUTE IMMEDIATE
SQL 文の文字列を ホ ス ト 変数 と し て表わす場合
LOGON
ロ グオ ン文字列の場合
PREPARE
SQL 文の文字列を ホ ス ト 変数 と し て表わす場合
SET CHARSET
文字セ ッ ト 名を ホ ス ト 変数 と し て表わす場合
標識変数
必要に応 じ て、 標識ホ ス ト 変数を メ イ ン ・ ホ ス ト 変数 と 関連付け る こ と がで き ま
す。 標識変数の値は、 ク ラ イ ア ン ト ・ サーバー間のデー タ 交換で、 ホ ス ト 変数が ヌ
ルであ る か ど う か を受信エージ ェ ン ト に通知す る ために、 送信エージ ェ ン ト ( ク ラ
イ ア ン ト ・ アプ リ ケーシ ョ ンか ら Teradata Database、 ま たは Teradata Database か ら
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン ) に よ っ て設定 さ れます。
構文
: indicator_variable_name
host_variable_name
:
INDICATOR
FF07D237
説明
構文要素
指定内容
host_variable_name
indicator_variable_name が関連す る ホ ス ト 変数の名前
INDICATOR
indicator_variable_name を host_variable_name と 区別す る のを
助け る ための任意指定のキー ワー ド
indicator_variable_name
標識変数の名前
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
263
第 7 章 : ホ ス ト 変数 と 複文要求
標識変数
標識変数の規則 と 指針
• すべての標識変数は、 それに関連付け ら れてい る メ イ ン ・ ホ ス ト 変数に コ ロ ン
文字が先行 し てい る か ど う かにかかわ り な く 、 コ ロ ン文字が先行 し ていなけれ
ばな り ません。
• 標識ホ ス ト 変数は、 それが関連付け ら れてい る メ イ ン ・ ホ ス ト 変数の直後に指
定 し ます ( た と えば、 :MainVar:IndVar ま たは :HostMainVar:HostIndVar)。
混乱を避け る ためには、 標識変数に語 INDICATOR を先行 さ せます ( つま り 、
:MainVar INDICATOR :IndVar)。
• 標識変数は、 WHERE 句条件で も 使用す る こ と がで き ます。
標識変数を ホス ト 変数 と と も に使用する方法
入力ホ ス ト 変数の場合、 ア プ リ ケーシ ョ ン ・ プ ロ グ ラ ム は標識変数を使用 し て、
ホ ス ト 変数が ヌ ルであ る か ど う かを Teradata Database に通知 し ます。
出力ホ ス ト 変数の場合、 Teradata Database は標識変数を使用 し て、 ホ ス ト 変数が ヌ
ルであ る か ど う か、 ま たは値がホ ス ト 変数に送 ら れた と き に切 り 捨て ら れたか ど う
か を アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムに通知 し ます。
以下の表は、 標識変数値 と 入力ホ ス ト 変数 と の間の関係を定義 し てい ます。
標識変数の値
関連付け ら れた入力ホ ス ト 変数についての報告
-n
ヌ ル。
n は通常は 1
0
非 ヌ ルで、 正常に出力ホ ス ト 変数に戻 さ れた。
+n
切 り 捨て ら れてい る 。
こ の標識変数に関連のあ る メ イ ン変数に文字ま たはバ イ ト 列が返 さ
れ る と き 、 切 り 捨てが行なわれます。
値 n は、 切 り 捨て前の元の列長を報告 し ます。
標識変数の処理
Teradata Database は、 標識変数を以下の よ う に処理 し ます。
• 1 つの標識変数が、 応答行の各デー タ 項目 ( フ ィ ール ド ) に対応す る 。
• 各標識変数は、 1 ビ ッ ト の領域を占め る 。
• n のデー タ フ ィ ール ド が あ る 場合に、 応答行の最初の (n + 7)/8 バ イ ト の中に、
その行のデー タ に対す る 標識変数が含まれ る 。
た と えば、 応答行に 19 個のデー タ 項目が含まれ る 場合に、 (19 + 7)/8 = 3 バ イ ト
の中にその行に対す る 標識変数が含まれ る 。
• 標識変数は、 それ ら を格納す る ために必要な 8 ビ ッ ト ・ バ イ ト の最小個数で保
持 さ れてい ます。
未使用の ビ ッ ト はバ イ ナ リ のゼ ロ に設定 さ れます。
264
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
標識変数
標識変数の内部処理
内部的には Teradata Database は CLIv2 標識モー ド を使用 し て、 ク ラ イ ア ン ト ・ シ ス
テ ムの使用す る 内部フ ォーマ ッ ト で Record パーセルの Data フ ィ ール ド の
NULLIndicators フ ィ ール ド にデー タ を返 し ます。
最初の応答行の直前に来 る も のは、 返 さ れ る 列の合計、 デー タ ・ タ イ プ、 お よ び各
列の長 さ に関す る 情報を含む DataInfo パーセルです。
各応答行は、 その行内のそれぞれのデー タ 項目に対応す る 標識変数で始ま り ます。
標識変数および DateTime と Interval デー タ
DateTime お よ び Interval の値は CharFix と し て キ ャ ス ト さ れ、 標識変数の出力のた
めに作成 さ れ る DataInfo パーセルは、 INTEGERDATE (Teradata Database ス タ イ ルの
DATE) モー ド の DATE 値の例外に関す る 規則に従い ます。
IndicData モー ド で値を エ ク ス ポー ト し て、 続いて USING 句を イ ン ポー ト ・ レ コ ー
ド 内の適切な タ イ プの DateTime ま たは Interval 値に組み込んで、 Data モー ド で イ ン
ポー ト し ます。
エ ク ス ポー ト さ れた値が INSERT ま たは UPDATE 文のためのデー タ と し て使われ る
場合、 Teradata Database は、 CharFix であ り 、 かつ タ ーゲ ッ ト の DateTime ま たは
Interval 型に対 し て正 し い長 さ を持つ USING 句の値を暗黙にキ ャ ス ト し ます。
<SQL デー タ 操作言語 > の 「USING 要求修飾子」 を参照 し て く だ さ い。
例1
こ の例では、 標識変数の値が -1 の場合、 従業員番号ま たは部署番号は ヌ ルに設定
さ れます。
標識変数が 0 の場合、 従業員番号ま たは部署番号は、 ホ ス ト 変数に報告 さ れた値に
設定 さ れます。
EXEC SQL
INSERT INTO EMPLOYEE
VALUES (:EMPNO INDICATOR :EMPNO-INDIC,:DEPTNO INDICATOR
:DEPTNO-INDIC)
END-EXEC.
例2
こ の例では、 部署番号は ヌ ルに設定 さ れます。
MOVE -1 TO DEPTNO-INDIC.
EXEC SQL
UPDATE EMPLOYEE
SET DEPARTMENT_NUMBER = :DEPTNO
INDICATOR :DEPTNO-INDIC
END-EXEC.
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
265
第 7 章 : ホ ス ト 変数 と 複文要求
埋め込み SQL での複文要求
埋め込み SQL での複文要求
カ ー ソ ルを必要 と する複文要求
複文要求は、 たびたび複数行の応答を返 し ます。 要求内のそれぞれの文は、 固有の
結果を生成 し ( 成功 / 失敗、 ア ク テ ィ ビ テ ィ ・ カ ウ ン ト な ど )、 それ ら はアプ リ ケー
シ ョ ン ・ プ ロ グ ラ ムに返 さ れます。
複文要求の結果表は複数の応答を返すので、 結果を取 り 出 し て操作す る カー ソ ルを
宣言す る こ と は必須です。
関連付け る も の
必須事項
静的複文要求 と 要求カー ソ ル
要求カー ソ ルに対 し て DECLARE CURSOR 文を出す。
動的複文要求 と 動的カー ソ ル
PREPARE 文を、 複文要求を含む文文字列 と と も に使
用す る 。
動的要求は、 次に動的カー ソ ル と 関連付け ら れ ます。
PREPARE および DESCRIBE での FOR STATEMENT 句の使用
PREPARE お よ び DESCRIBE の構文を、 FOR STATEMENT 句を使っ て拡張す る こ と
がで き ます。 FOR STATEMENT に よ っ て、 複文要求の ど の文を記述す る か を指定す
る こ と がで き ます。
複文要求のすべての文を記述す る ために、 DESCRIBE 文を、 その要求内のデー タ を
返す文それぞれに対 し て複数回実行 し なければな り ません。
出力 SQLDA には列記述はあ り ませんが、 デー タ を返 さ ない文に DESCRIBE を実行
す る こ と は必ず有効です。
詳細は、 「COMMENT ( 戻 り 形式 )」 (329 ページ ) および 「PREPARE」 (362 ページ ) を
参照 し て く だ さ い。
SQLDA を使用 し た文の状況の追跡
複文要求か ら の出力を処理す る 際には、 各文が成功 し たか失敗 し たか、 いつ 1 つの
要求か ら の出力が終了 し 、 次の要求か ら の出力が開始 さ れたか を把握 し てい る 必要
があ り ます。
以下の表に よ っ て説明 さ れてい る メ カ ニズ ムは、 単文要求に使用 さ れ る も の と 似て
お り 、 次の こ と を達成す る ための フ レーム ワ ー ク を提供 し ます。
266
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 7 章 : ホ ス ト 変数 と 複文要求
埋め込み SQL での複文要求
以下の よ う な場合
その場合
要求カー ソ ルがオープン し てい る
SQLCA 内の SQLCODE は、 要求の最初の文の成功、
ま たは要求の失敗 (IMPLICIT ROLLBACK 発生 と し
て定義 さ れた失敗 ) を エ ン テ ィ テ ィ と し て反映す る
よ う に設定 さ れ ます。
失敗条件は、 成功レ ポー ト をオーバー ラ イ ド し ます。
成功 し た場合、 ア ク テ ィ ビ テ ィ ・ カ ウ ン ト が、
SQLCA 内の 3 番目の SQLERRD 要素でアプ リ ケー
シ ョ ンに レ ポー ト さ れます。
文がエ ラ ー ( 非暗黙 ROLLBACK
と し て定義 さ れたエ ラ ー )
次の FETCH が該当す る 以下のエ ラ ー ・ コ ー ド を返
し ます。 SQLCA 内の SQLCODE は < 0、 お よ び
SQLERRD の最初の要素のエ ラ ー ・ コ ー ド 。
行が返 さ れな い、 ま たは特定の
文に対 し て返 さ れ る 文が尽 き た
SQLCODE は、 単文要求の場合 と 同 じ よ う に、
FETCH か ら の返 し に +100 を設定 し ます。
ア プ リ ケ ー シ ョ ン を 次の ( ま た
は任意の ) 要求の文に置 く 必要
があ る
POSITION 文を使用 し ます。
POSITION は、 要求の指定 さ れた文の出力に制御を
移 し 、 OPEN 要求の成功ま たは失敗に基づいて
SQLCA 情報を設定 し ます。
次に、 プ ロ グ ラ ム は FETCH を 使用 し て、 文の出
力 を 検索 し ます。
アプ リ ケーシ ョ ン を要求のすべて
の出力の先頭に置 く 必要があ る
REWIND 文を使用 し ます。
REWIND 文は、 POSITION…TO STATEMENT 1 と
ま っ た く 同等です。
REWIND は、 要求の指定 さ れた文の出力に制御を
移 し 、 OPEN 要求の成功ま たは失敗に基づいて
SQLCA 情報を設定 し ます。
次に、 プ ロ グ ラ ム は FETCH を 使用 し て 、 文の出
力 を 検索 し ます。
現在の文に対 し て +100 SQL
CODE を受け取 る
POSITION ま たは REWIND を使用 し て、 別の ( ま た
は同 じ ) 文の結果にア ク セ ス し ます。
+100 を受け取 る ま で待機す る 必要はあ り ません。
POSITION ま たは REWIND 文はいつで も 出す こ と
がで き ます。
複文要求での カー ソ ルの使用につい て の詳細は、 「 DECLARE CURSOR」 (44 ペー
ジ ) を 参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
267
第 7 章 : ホ ス ト 変数 と 複文要求
埋め込み SQL での複文要求
複文要求の例
複文要求の例を以下に示 し ます。 SQL 先頭子お よ び終了子は省略 し てい ます。
こ の例では、 要求内の文が正常に完了 し た と 仮定 し てい ます。
DECLARE curs CURSOR FOR
’SELECT ent1,ent2,ent3 FROM tabx;
UPDATE ...;SELECT entt FROM tabl’
OPEN curs {SQLCA gets first SELECT result}
WHENEVER NOT FOUND GOTO updstmt
selstmt1:
FETCH curs INTO :vara,:varb,:varc
.
.
GOTO selstmt1
updstmt:
WHENEVER NOT FOUND CONTINUE
POSITION curs TO STATEMENT 2 {SQLCA gets UPDATE
result}
FETCH curs
.
.
WHENEVER NOT FOUND GOTO reread
POSITION curs TO STATEMENT 3 {SQLCA gets second
SELECT result}
selstmt2:
FETCH curs INTO :vars
.
.
GOTO selstmt2
reread:
REWIND curs {SQLCA gets first SELECT result}
WHENEVER NOT FOUND GOTO alldone
selstmt1x:
FETCH curs INTO :varaa,:varbb,:varcc
.
.
GOTO selstmt1x
alldone:
CLOSE curs
268
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第8章:
SQL 制御文
こ の章では、 SQL を完全な コ ン ピ ュ ー タ 用言語 と す る 、 SQL ス ト ア ド ・ プ ロ シー
ジ ャ の制御フ ロ ー文について説明 し ます。
こ れ ら の制御文は ス ト ア ド ・ プ ロ シージ ャ 内でのみ有効です。 そのため、 こ れ ら は
どれ も 対話方式で使用 し た り 、 埋め込み SQL アプ リ ケーシ ョ ン内で使用 し た り す
る こ と はで き ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
269
第 8 章 : SQL 制御文
BEGIN … END
BEGIN … END
目的
ス ト ア ド ・ プ ロ シージ ャ 内の複合文を区切 り ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
BEGIN
label_name :
A
local_declaration
A
cursor_declaration
END
condition_handler
statement
;
label_name
YS6BE001
説明
構文要素
指定内容
label_name
BEGIN…END 複合文の任意選択の ラ ベル。
開始 ラ ベルは コ ロ ン (:) で終わ っ てい る 必要があ り ます。 最後の ラ ベ
ルは必須ではあ り ません。 ただ し 、 最後の ラ ベルを指定す る 場合は、
それ と 同等の開始 ラ ベル も 指定す る 必要があ り ます。
BEGIN…END 文の ラ ベルは、 こ の文に含まれ る ど の文で も 再使用で
き ません。
ス ト ア ド ・ プ ロ シージ ャ 内に入れ子の複合文を指定す る 場合は、
各 BEGIN…END 文に ラ ベル名を使用す る こ と が推奨 さ れます。
local_declaration
DECLARE 文を使用 し て宣言 さ れた ロ ーカル変数、 ま たは、
DECLARE HANDLER 文を使用 し て宣言 さ れた条件。
入れ子の複合文の場合、 外側の複合文で宣言 さ れた変数お よ び条件は
内側の複合文で再使用で き ます。
ロ ーカル変数には、 その変数が宣言 さ れた複合文の ラ ベルを付け る こ
と がで き ます。 こ れは、 入れ子に さ れた複合文で ロ ーカル変数を再使
用 し た と き に混乱が生 じ ない よ う にす る のに役立ち ます。
cursor_declaration
DECLARE CURSOR 文を使用 し て宣言 さ れた カー ソ ル。
入れ子の複合文の場合、 外側の複合文で宣言 さ れた カー ソ ルは内側の
複合文で再使用で き ます。
270
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
BEGIN … END
構文要素
指定内容
condition_handler
DECLARE HANDLER 文を使用 し て宣言 さ れた条件ハン ド ラ ー。
condition_handler の中では、 条件ハン ド ラ ーのア ク シ ョ ンの文を囲む
ために、 BEGIN…END 複合文を使用す る こ と がで き ます。
statement
次のいずれか。
•
ス ト ア ド ・ プ ロ シージ ャ でサポー ト さ れ る DML、 DDL、 ま たは
DCL 文。 こ れには、 動的 SQL 文が含まれます。
• 制御文、 BEGIN…END を含む。
ANSI 準拠
BEGIN…END は ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
LEAVE および ITERATE で参照 さ れる ラ ベル
ラ ベル付け さ れた BEGIN…END 文内の LEAVE 文ま たは ITERATE 文に関連付け ら
れた ラ ベルで、 BEGIN…END ブ ロ ッ ク の ラ ベルを参照す る 場合は、 次の規則が適
用 さ れます。
文
実行内容
LEAVE
実行時に ラ ベルが関連付け ら れていた BEGIN…END 文が終了 し ます。 終了
し たブ ロ ッ ク の次にあ る 文に制御権が移動 し ます。
プ ロ シージ ャ に 1 つの BEGIN…END 文だけが存在す る 場合や、 終了 し たブ
ロ ッ ク が ス ト ア ド ・ プ ロ シージ ャ 本体の最後の文だ っ た場合、 こ の種の終
了は、 ス ト ア ド ・ プ ロ シージ ャ の正常完了 と 見な さ れ ます。 LEAVE 文につ
いての詳細は、 「LEAVE」 (308 ページ ) を参照 し て く だ さ い。
ITERATE
ス ト ア ド ・ プ ロ シージ ャ の作成中の ス ト ア ド ・ プ ロ シージ ャ 本体の構文解
析時に構文エ ラ ーを戻 し ます。
ITERATE 文につい て の詳細は、 「ITERATE」 (304 ページ ) を 参照 し て く だ
さ い。
宣言の順序
BEGIN-END 複合文では、 任意の数の宣言、 お よ び メ イ ン ・ タ ス ク を実行す る ため
の文を指定で き ます。 こ れ ら はすべて任意選択で指定す る も のですが、 指定す る 場
合には、 以下に示す BEGIN-END ブ ロ ッ ク 内の順序に従 う 必要があ り ます。
1
ロ ーカル変数 と 条件宣言。 「DECLARE」 (285 ページ ) お よ び 「DECLARE
CONDITION」 (187 ページ ) を参照 し て く だ さ い。
2
カー ソ ル宣言。 「カー ソ ル宣言」 (138 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
271
第 8 章 : SQL 制御文
BEGIN … END
3
条件ハン ド ラ ーの宣言。 「DECLARE HANDLER ( 基本構文 )」 (192 ページ ) お よ
び後続の 「DECLARE HANDLER」 セ ク シ ョ ン を参照 し て く だ さ い。
4
以下の う ちの 1 つ。
•
単一の静的ま たは動的 SQL 文、 も し く は制御文
•
文の リ ス ト を収容 し た複合文
「ス ト ア ド ・ プ ロ シージ ャ の DDL 文」 (132 ページ ) を参照 し て く だ さ い。
各 タ イ プの宣言は、 それぞれに ま と めて指定 し て く だ さ い。 同 じ ブ ロ ッ ク の中に別
の タ イ プの宣言や別の文を混ぜ る こ と はで き ません。
複合文が入れ子にな っ てい る 場合は、 宣言のい く つか、 あ る いはすべて を BEGINEND ブ ロ ッ ク で指定で き ます。 あ る いは、 BEGIN-END ブ ロ ッ ク を使用 し な く て も
構い ません。
規則
• 必須ではあ り ませんが、 ス ト ア ド ・ プ ロ シージ ャ の定義には、 通常 1 つの
BEGIN…END 文が含まれます。 ス ト ア ド ・ プ ロ シージ ャ 内の他のすべての文は、
こ の複合文の中で指定 さ れなければな り ません。
• ま た、 condition_handler 宣言に BEGIN…END 文を使用 し て、 ハン ド ラ ー ・ ア ク
シ ョ ンの文の リ ス ト を囲む こ と も で き ます。
• BEGIN…END 複合文は、 入れ子にす る こ と が可能です。 入れ子の レベルに制限
はあ り ません。
• BEGIN 文は、 すべて キーワー ド END で終わ ら なければな り ません。
• BEGIN…END 文には、 ラ ベルを付け る こ と がで き ます。 BEGIN…END 文に関連
付け ら れた ラ ベルの適用範囲は、 その文全体です。
•
こ れには、 入れ子に さ れたすべての複合文が含まれますが、 複合文や入れ子に
さ れた複合文の中で宣言 さ れたハン ド ラ ーは含まれません。
ス ト ア ド ・ プ ロ シージ ャ は、 BEGIN…END 文の中か ら 実行で き ます。
• 複合文の中で宣言 さ れた ロ ーカル変数、 条件、 パ ラ メ ー タ 、 お よ びカー ソ ルの
適用範囲は、 入れ子に さ れたすべての複合文を含む、 複合文全体です。
• 内側の複合文の ロ ーカル変数、 条件、 パ ラ メ ー タ 、 ま たはカー ソ ルの名前が外
側の複合文にあ る 名前 と 同 じ にな っ た場合、 実行時には、 内側の複合文にあ る
ロ ーカル変数、 条件、 パ ラ メ ー タ 、 ま たはカー ソ ルの名前が外側の複合文 よ り
も 優先 さ れます。 「例 2」 (274 ページ ) を参照 し て く だ さ い。
• ハン ド ラ ー ・ ア ク シ ョ ンの文以外の文に よ っ て複合文の中に発生 し た例外条件、
完了条件、 お よ びユーザー定義条件は、 複合文の中で処理 さ れます。
内側の複合文の条件に使用で き る 適切なハン ド ラ ーがない場合は、 その条件を
外側の複合文に伝え て適切なハン ド ラ ーを検索 し ます。
•
272
ア ク シ ョ ンの句で発生 し た例外条件、 完了条件、 お よ びユーザー定義条件は、
ア ク シ ョ ン句の中に定義 さ れてい る ハン ド ラ ーで処理で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
BEGIN … END
ハン ド ラ ー ・ ア ク シ ョ ンで発生す る 条件がア ク シ ョ ン句の中で処理 さ れない場
合、 その条件は適切なハン ド ラ ーの検索のために外側に伝搬 さ れ る こ と はあ り
ません。 こ れは、 処理 さ れない ま ま にな り ます。 唯一の例外は、 RESIGNAL 文
です。 その条件は、 ハン ド ラ ー内の複合文のア ク シ ョ ン句の外に伝搬 さ れます。
以下の表では、 処理 さ れない例外条件、 完了条件、 ユーザー定義条件を比較 し
てい ます。
処理 さ れない条件の種類
その場合
例外条件ま たはユーザー定
義条件
ハン ド ラ ーが終了 し 、 そのハン ド ラ ーを呼び出 し た
元々の条件が、 適切なハン ド ラ ーを探すために外側に
伝搬 さ れ ます。
元の条件に対す る 適当なハン ド ラ ーが存在 し ない場合、
ス ト ア ド ・ プ ロ シージ ャ は終了 し ます。
完了条件
条件は無視 さ れ、 ハン ド ラ ー ・ ア ク シ ョ ンは次の文へ
続行 さ れ ます。
例1
次の例は、 入れ子の複合文を含む有効な ス ト ア ド ・ プ ロ シージ ャ を示す も のです。
CREATE PROCEDURE spAccount(OUT p1 CHARACTER(30))
L1: BEGIN
DECLARE i INTEGER;
DECLARE DeptCursor CURSOR FOR
SELECT DeptName from Department;
DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '23505'
L2: BEGIN
SET p1='Failed To Insert Row';
END L2;
L3: BEGIN
INSERT INTO table_1 VALUES(1,10);
IF SQLCODE <> 0 THEN LEAVE L1;
END L3;
INSERT INTO table_2 VALUES(2,20);
END L1;
こ の例のプ ロ シージ ャ 本体には、 L1 と い う ラ ベルの付いたブ ロ ッ ク があ り ます。
こ のブ ロ ッ ク には、 ロ ーカル変数の宣言、 カー ソ ル宣言、 条件ハン ド ラ ーの宣言、
L3 と い う ラ ベルの付い た入れ子のブ ロ ッ ク 、 お よ びそ の他の文が収容 さ れ て い
ま す。
1 つ目の INSERT 文 と IF 文は、 L3 と ラ ベル付け さ れた内側の複合文に属 し 、 2 つ目
の INSERT 文 と IF 文は、 L1 と ラ ベル付け さ れた外側のブ ロ ッ ク に属 し ます。
L2 と ラ ベル付け さ れた BEGIN…END ブ ロ ッ ク は、 ハン ド ラ ーの宣言の一部です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
273
第 8 章 : SQL 制御文
BEGIN … END
例2
次の例は、 複合文の ラ ベルで変数を修飾す る こ と に よ っ て、 内側の複合文で外側の
複合文の変数を使用す る 様子を示 し てい ます。
CREATE PROCEDURE spSample1(INOUT IOParam1 INTEGER,
OUT OParam2 INTEGER)
L1: BEGIN
DECLARE K INTEGER DEFAULT 10;
L2: BEGIN
DECLARE K INTEGER DEFAULT 20;
SET OParam2 = K;
SET IOParam1 = L1.K;
END L2;
...
END L1;
K は、 外側の複合文 L1 で宣言 さ れた ロ ーカル変数で、 こ れを内側の複合文 L2 で再
使用 し ます。
ス ト ア ド ・ プ ロ シージ ャ の実行の後、 パ ラ メ ー タ OParam2 は、 L2 で定義 さ れた
K のデフ ォ ル ト 値 20 を と り ます。 こ れは、 内側のブ ロ ッ ク で行なわれた変数の
ロ ーカル定義の方が、 外側のブ ロ ッ ク の定義 よ り も 優先 さ れ る ためです。
一方、 IOParam1 は、 L1 で定義 さ れた方の K のデフ ォル ト 値 10 を と り ます。 こ れは、
2 番目の SET 文が外側の複合文の ラ ベル L1 で修飾 さ れてい る ためです。
例3
次の例では、 ロ ーカル変数 と 条件ハン ド ラ ーの宣言を備えた有効な ス ト ア ド ・ プ ロ
シージ ャ を作成 し ます。 こ の ス ト ア ド ・ プ ロ シージ ャ の作成の前に table1 が削除 さ
れた と 想定 し て く だ さ い。
ス ト ア ド ・ プ ロ シージ ャ 本体の INSERT ス テー ト メ ン ト で '42000' の例外条件が発
生 し 、 EXIT ハン ド ラ ーが呼び出 さ れます。 ハン ド ラ ー ・ ア ク シ ョ ン句内の DROP
TABLE 文は、 別の '42000' 例外を生成 し ます。 こ れは、 CONTINUE ハン ド ラ ーで処
理 さ れます。
CREATE PROCEDURE spSample3(OUT p1 CHARACTER(80))
BEGIN
DECLARE i INTEGER DEFAULT 20;
DECLARE EXIT HANDLER
FOR SQLSTATE '42000'
BEGIN
DECLARE i INTEGER DEFAULT 10;
DECLARE CONTINUE HANDLER
FOR SQLEXCEPTION
SET p1 = 'Table does not exist';
DROP TABLE table1;
CREATE TABLE table1 (c1 INTEGER);
INSERT INTO table1 (i);
END;
INSERT INTO table1 VALUES(1000,'aaa');
/* table1 does not exist */
END;
274
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
BEGIN … END
例4
次の例は、 入れ子にな っ ていない複合文で、 同 じ SQLSTATE コ ー ド の ロ ーカル変数
と 条件ハン ド ラ ーを再使用す る 、 有効な方法を示 し てい ます。
CREATE PROCEDURE spSample (OUT po1 VARCHAR(50),
OUT po2 VARCHAR(50))
BEGIN
DECLARE i INTEGER DEFAULT 0;
L1: BEGIN
DECLARE var1 VARCHAR(25) DEFAULT 'ABCD';
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
SET po1 = "Table does not exist in L1';
INSERT INTO tDummy (10, var1);
-- Table Does not exist
END L1;
L2: BEGIN
DECLARE var1 VARCHAR(25) DEFAULT 'XYZ';
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
SET po2 = "Table does not exist in L2';
INSERT INTO tDummy (i, var1);
-- Table Does not exist
END L2;
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
275
第 8 章 : SQL 制御文
CASE
CASE
目的
指定 さ れた条件式ま たは 2 つのオペ ラ ン ド の等価性に基づいた、 文の条件付 き の実
行の手段 と な り ます。
CASE 文は、 式の結果を戻す SQL CASE 式 と は異な り ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文 1
CASE
operand_1
WHEN
operand_2
A
THEN
END CASE
ELSE
A
statement
;
statement
1148A001
構文 2
CASE
conditional_expression
WHEN
A
THEN
END CASE
ELSE
A
statement
;
statement
1148A002
statement
SQL_statement
compound statement
assignment statement
condition statement
iteration statement
label_name :
label_name
ITERATE
label_name
LEAVE
label_name
YS6CP01B
276
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
CASE
compound statement
A
BEGIN
label_name :
local_declaration
cursor_declaration
A
END
statement
condition_handler
label_name
;
1101B383
local_declaration
DECLARE
,
variable_name
data_type
;
DEFAULT
literal
NULL
condition_name
CONDITION
FOR SQLSTATE
sqlstate_code
VALUE
1101A613
cursor_declaration
DECLARE
CURSOR
cursor_name
A
SCROLL
NO SCROLL
B
A
WITHOUT RETURN
WITH RETURN
ONLY
TO
CALLER
CLIENT
B
FOR
;
cursor_specification
FOR
READ ONLY
UPDATE
statement_name
1101A614
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
277
第 8 章 : SQL 制御文
CASE
cursor_specification
,
column_name
SELECT
A
correlation_name
AS
*
expression
correlation_name
AS
,
table_name
FROM
A
B
table_name
INNER
JOIN
table_name
ON
condition
OUTER
LEFT
RIGHT
FULL
B
WHERE clause
other SELECT clauses
1101B384
condition_handler
DECLARE
HANDLER
CONTINUE
FOR
A
EXIT
,
A
sqlstate_code
SQLSTATE
handler_action _statement
;
VALUE
condition_name
,
SQLEXCEPTION
SQLWARNING
NOT FOUND
1101A563
assignment statement
SET
assignment_target =
assignment_source
1101A380
278
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
CASE
condition statement
operand_1
CASE
WHEN
operand_2
WHEN
conditional_expression
A
statement ;
THEN
A
END CASE
statement ;
ELSE
IF
statement ;
THEN
conditional_expression
THEN
statement ;
B
B
C
ELSEIF
conditional_expression
THEN
statement ;
END IF
C
ELSE
statement ;
1101B381
iteration statement
conditional_expression
WHILE
statement ;
LOOP
for_loop_variable
FOR
statement ;
DO
END LOOP
AS
A
cursor_name
A
REPEAT
cursor_specification
statement ;
END WHILE
UNTIL
DO
CURSOR FOR
statement ;
conditional_expression
END FOR
END REPEAT
1101B382
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
279
第 8 章 : SQL 制御文
CASE
説明
構文要素
指定内容
operand_1
operand_2
値式ま たは算術式お よ び列の式。
ス ト ア ド ・ プ ロ シージ ャ の ロ ーカル変数、 ス テー タ ス変数、 IN ま
たは INOUT パ ラ メ ー タ 、 リ テ ラ ル、 お よ び FOR ループ列の名前
と 相関名を値式内に指定す る こ と がで き ます。
OUT パ ラ メ ー タ と 副問い合わせは使え ません。
operand_1 と operand_2 のデー タ ・ タ イ プは、 互いに互換性がなけ
ればな り ません。
statement
次のいずれか。
•
ス ト ア ド ・ プ ロ シージ ャ で使用で き る DML、 DDL、 ま たは
DCL 文。 こ れには、 動的 SQL 文が含まれ ます。
• 制御文、 BEGIN…END を含む。
conditional_expression
THEN 句内の 1 つ以上の文を実行す る か ど う か を決め る ために使
用 さ れ る ブール条件。
ス ト ア ド ・ プ ロ シージ ャ の ロ ーカル変数、 ス テー タ ス変数、 IN ま
たは INOUT パ ラ メ ー タ 、 リ テ ラ ル、 お よ び FOR ループ列の名前
と 相関名を conditional_expression 内に指定で き ます。
OUT パ ラ メ ー タ と 副問い合わせは使え ません。
条件 リ ス ト に ロ ーカル変数、 パ ラ メ ー タ 、 ま たはカー ソ ル別名が
含ま れてい る 場合は、 IN お よ び NOT IN 演算子を使用す る こ と は
で き ません。
ANSI への準拠
CASE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
CASE 文 と CASE 式 と の意味上の相違点
ス ト ア ド ・ プ ロ シージ ャ の CASE 文 と 通常の対話式 SQL の CASE 式の意味は異な
り ます。 例えば、 式には値を保持で き ますが、 文には値を保持で き ません。 式は
実行で き ませんが、 文は実行で き ます。 式は他の式 と 組み合わせ る こ と がで き ます
が、 文は組み合わせ る こ と がで き ません。 <SQL 関数、 演算子、 式お よ び述語 > の
「CASE 式」 を参照 し て く だ さ い。
280
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
CASE
CASE 文の形式
形式
文の条件付 き 実行の基準
単純
オペ ラ ン ド が等価か ど う か。
「構文 1」 (276 ページ ) を参照 し て く だ さ い。
い く つかの値の う ちのいずれかに式が一致す る か ど う かがテ ス ト さ れ
てか ら 、 結果に応 じ て分岐が行なわれ ます。
検索
条件式の評価。
「構文 2」 (276 ページ ) を参照 し て く だ さ い。
CASE 文を使 う 代わ り に、 IF-THEN-ELSEIF-ELSE 文を使 う こ と も で き ます。
「IF」 (297 ページ ) を参照 し て く だ さ い。
一般的に、 複数の条件ま たは値を検査す る のに望ま し い文は CASE 文のほ う です。
単純な CASE 文
こ の形式の条件付 き 文では、 operand_1 ( 値式 ) が operand_2 ( 値式 ) に等 し いか ど う
かに応 じ て、 最大限 1 つの WHEN 句ま たは ELSE 句に関連 し た SQL 制御文な ど の
SQL 文の リ ス ト を実行す る こ と がで き ます。
WHEN 句は、 CASE 文内に指定 さ れてい る 順序で評価 さ れます。 評価のプ ロ セ ス は
次の と お り です。
1
最初の WHEN 句が評価 さ れます。
•
CASE 句で指定 さ れてい る 値式 (operand_1) が WHEN 句内の値式 (operand_2)
に等 し ければ、 その WHEN 句の文が実行 さ れます。
•
ス ト ア ド ・ プ ロ シージ ャ 内の次の文に制御権が渡 さ れます。
値式が等 し く ない場合に、 次の WHEN 句が存在すればその句が評価 さ れます。
2
後続のすべての WHEN 句は、 ス テ ッ プ 1 で説明 し た方法で評価 さ れます。
3
評価す る WHEN 句がな く な っ た場合に、 ELSE 句が存在すればそれが新たな対
象 と さ れ、 その ELSE 句の文が実行 さ れます。
ス ト ア ド ・ プ ロ シージ ャ 内の次の文に制御権が渡 さ れます。
4
ELSE 句が な い場合に CASE 句内の値式が、 WHEN 句の ど れに も 一致 し な け
れば。
•
実行時例外 ( 「Case not found for CASE statement」 , SQLSTATE = '20000',
SQLCODE = 7601) が発生 し ます。
•
CASE 文の実行が終了 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
281
第 8 章 : SQL 制御文
CASE
検索 CASE 文
こ の形式の CASE 文は、 WHEN 句内の条件式の評価が真 と な る と 文の リ ス ト を実行
し ます。 最大限 1 つの WHEN 句ま たは ELSE 句に関連 し た文を実行で き ます。
WHEN 句は、 CASE 文内に指定 さ れてい る 順序で評価 さ れます。 評価のプ ロ セ ス は
次の と お り です。
1
最初の WHEN 句が評価 さ れます。
•
WHEN 句に指定 さ れてい る 条件式が真であれば、 その WHEN 句の文が実行
さ れます。
•
ス ト ア ド ・ プ ロ シージ ャ 内の次の文に制御権が移動 し ます。
値式が真では ない場合、 次の WHEN 句が存在すればその句が評価 さ れます。
2
後続のすべての WHEN 句は、 ス テ ッ プ 1 で説明 し た方法で評価 さ れます。
3
評価す る WHEN 句が も う な く な っ た場合に、 ELSE 句が存在すればそれが新た
な対象 と さ れ、 その ELSE 句の文が実行 さ れます。
ス ト ア ド ・ プ ロ シージ ャ 内の次の文に制御権が移動 し ます。
4
ELSE 句がない場合に、 ど の WHEN 句内の条件式の評価 も 真 と な ら なかっ た と
き は。
•
実行時例外 ( 「Case not found for CASE statement」 , SQLSTATE = '20000',
SQLCODE = 7601) が発生 し ます。
•
CASE 文の実行が終了 し ます。
CASE 文での例外処理
WHEN 句ま たは ELSE 句の後に続 く 文で例外が生 じ た場合に例外条件を処理す る
ハン ド ラ ーが ス ト ア ド ・ プ ロ シージ ャ 内に備え ら れてい る と き の処置行動は、 IF ま
たは WHILE 文内で発生 し た例外の場合 と 同 じ です。
こ の例 と 、 例外条件に適用 さ れ る 規則については、 「文固有の条件処理」 (182 ペー
ジ ) を参照 し て く だ さ い。
CASE 文の値式ま たは条件式が例外を生 じ た場合に例外条件を処理す る CONTINUE
ハン ド ラ ーが ス ト ア ド ・ プ ロ シージ ャ に備え ら れてい る と き は、 条件ハン ド ラ ーの
処置が正常に完了 し た後で、 END CASE の後に続 く 文に制御権が移動 し ます。
例 1: 単純な CASE
以下の ス ト ア ド ・ プ ロ シージ ャ には単純な CASE 文が組み込まれてい ます。
CREATE PROCEDURE spSample(IN pANo
INTEGER,
IN pName
CHARACTER(30),
OUT pStatus CHARACTER(50))
BEGIN
DECLARE vNoOfAccts INTEGER DEFAULT 0;
SELECT COUNT(*) INTO vNoOfAccts FROM Accounts;
CASE vNoOfAccts
WHEN 0 THEN
INSERT INTO Accounts (pANo, pName);
WHEN 1 THEN
282
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
CASE
UPDATE Accounts
SET aName = pName WHERE aNo = pANo;
ELSE
SET pStatus = 'Total ' || vNoOfAccts || 'customer
accounts';
END CASE;
END;
上記の例では、 ロ ーカル変数 vNoAccts の値に応 じ て、 WHEN 句の該当す る SET
文が実行 さ れます。
vNoAccts の値
一致す る 句
実行 さ れ る 文
0
最初の WHEN 句
INSERT INTO Accounts (pANo,
pName);
1
2 番目の WHEN 句
UPDATE Accounts
SET aName = pName
WHERE aNo = pANo;
その他の数値
ELSE 句
SET pStatus = 'Total ' || vNoAccts
|| ' customer accounts';
例 2: 検索 CASE
以下の ス ト ア ド ・ プ ロ シージ ャ には検索 CASE 文が組み込まれてい ます。
CREATE PROCEDURE spSample (IN pANo INTEGER,
IN pName CHARACTER(30), OUT pStatus CHARACTER(50))
BEGIN
DECLARE vNoAccts INTEGER DEFAULT 0;
SELECT COUNT(*) INTO vNoAccts FROM Accounts;
CASE
WHEN vNoAccts = 0 THEN
INSERT INTO Accounts (pANo, pName);
WHEN vNoAccts = 1 THEN
UPDATE Accounts
SET aName = pName WHERE aNo = pANo;
WHEN vNoAccts > 1 THEN
SET pStatus = 'Total ' || vNoAccts || ' customer
accounts';
END CASE;
END;
上記の例では、 ロ ーカル変数 vNoAccts の値に応 じ て、 WHEN 句の該当す る SET
文が実行 さ れます。
vNoAccts の値
真 と な る 条件式を持つ句
実行 さ れ る 文
0
最初の WHEN 句
INSERT INTO Accounts (pANo,
pName);
1
2 番目の WHEN 句
UPDATE Accounts
SET aName = pName
WHERE aNo = pANo;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
283
第 8 章 : SQL 制御文
CASE
vNoAccts の値
真 と な る 条件式を持つ句
実行 さ れ る 文
>1
3 番目の WHEN 句
SET pStatus = ’Total’ ||
vNoAccts || ’customer accounts’;
vNoAccts の値が ヌ ルの場合に ELSE 句がない と 、 ス ト ア ド ・ プ ロ シージ ャ で実行
時例外 ( 「Case not found for CASE statement」 , SQLSTATE = '20000', SQLCODE =
7601) が発生 し ます。 ただ し 、 こ の例の値設定の よ う に vNoAccts を ヌ ルに設定す
る こ と はで き ません。
例 3: 検索 CASE
以下の例は、 検索 CASE 文の条件式で FOR ループ別名を使用す る 様子を示 し てい
ます。
CREATE PROCEDURE spSample()
Label1:BEGIN
FOR RowPointer AS
c_employee CURSOR FOR
SELECT DeptNo AS c_DeptNo,
employeeid AS c_empid FROM Employee
DO
CASE
WHEN RowPointer.c_DeptNo > 10 THEN
INSERT INTO Dept VALUES (RowPointer.c_DeptNo,
RowPointer.c_empid) ;
WHEN RowPointer.c_DeptNo <= 10 THEN
UPDATE Employee
SET DeptNo = RowPointer.c_DeptNo + 10 ;
INSERT INTO Dept VALUES (RowPointer.c_DeptNo,
RowPointer.c_empid)
END CASE;
END FOR;
END Label1;
284
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
DECLARE
DECLARE
目的
1 つま たは複数の ロ ーカル変数を宣言 し ます。
呼び出 し
実行可能形式ではない制御の宣言。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
,
DECLARE
variable_name
A
predefined_data_type
UDT_name
attribute
;
A
DEFAULT
literal
NEW
constructor_name
SYSUDTLIB.
NULL
1101A372
説明
構文要素
指定内容
variable_name
宣言す る SQL ロ ーカル変数の名前。
こ れは、 有効な Teradata SQL 名でなければな り ません。 予約語や、
ス テー タ ス変数名 と し て予約 さ れてい る 語を使用す る こ と はで き
ません。
実行時には、 次に示すよ う に文が ラベル付け さ れていれば、 変数を、
変数が宣言 さ れてい る BEGIN…END 文の ラ ベルで修飾で き ます。
label.variable_name
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
285
第 8 章 : SQL 制御文
DECLARE
構文要素
指定内容
predefined_data_type |
UDT_name
宣言す る ロ ーカル変数のデー タ ・ タ イ プ。
こ れは事前定義デー タ 型か UDT のいずれかにす る こ と がで き ます
が、 VARIANT_TYPE UDT デー タ ・ タ イ プは除 き ます。
各パ ラ メ ー タ の data_type の後には、 文字デー タ ・ タ イ プのパ ラ
メ ー タ に CHARACTER SET を指定で き ます。
CHARACTER SET が指定 さ れない場合、 文字セ ッ ト は、 デフ ォ ル
ト に よ り 、 ス ト ア ド ・ プ ロ シージ ャ を作成 / コ ンパ イ ルす る ユー
ザーの文字セ ッ ト に設定 さ れます。
data_type では、 CASESPECIFIC や NOT CASESPECIFIC を指定す
る こ と も 可能です。
DEFAULT literal
ロ ーカル変数のデフ ォ ル ト 値。
指定 さ れ る 場合、 こ の値は定数でなければな ら ず、 指定 さ れた
デー タ ・ タ イ プ と の互換性がなければな り ません。 し か し 、 デ
フ ォ ル ト の DateTime 値が指定 し た DateTime デー タ ・ タ イ プ と は
異な る 場合は、 Teradata Database は暗黙の変換を行ない ます。 詳細
は、 <SQL 関数、 演算子、 式お よ び述語 > の 「デー タ ・ タ イ プの変
換」 を参照 し て く だ さ い。
ロ ーカル変数の宣言にデフ ォ ル ト 値を指定す る と 、 そのデフ ォ ル
ト は リ ス ト 内のすべての変数に割 り 当て ら れます。
DEFAULT 句に式を含め る こ と はで き ません。
変数のデフ ォ ル ト を指定 し ない場合、 NULL に初期設定 さ れ ます。
ANSI への準拠
DECLARE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
変数の宣言の規則
•
ロ ーカル変数は、 BEGIN…END 複合文の中でのみ宣言す る こ と がで き ます。
• 各 BEGIN…END 複合文では、 ロ ーカル変数の宣言を い く つで も 指定す る こ と
がで き ます。 それぞれの宣言には、 末尾にセ ミ コ ロ ン文字を付け る 必要があ り
ます。
• 各宣言では、 任意の数の ロ ーカル変数を コ ン マ区切 り の リ ス ト に し て指定で き
ます。
• 複合文内のすべての ロ ーカル変数お よ び条件の宣言は、 必ず、 いかな る カー ソ
ル宣言、 条件ハン ド ラ ー、 その他の文 よ り も 前に指定 し て く だ さ い。
• ロ ーカル変数の適用範囲は、 その変数が宣言 さ れた BEGIN…END 複合文 と 、
そ こ に入れ子にな っ てい る すべての複合文です。
286
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
DECLARE
• 1 つの複合文で宣言 さ れた 2 つの変数に、 同 じ 名前 を 使用す る こ と はで き ま
せん。
ただ し 、 入れ子の複合文では、 変数名の再使用が可能です。
• 各々の ロ ーカル変数の宣言は、 次の要素か ら 成っ てい ます。
• ロ ーカル変数名 ( 必須 )
•
•
有効なデー タ ・ タ イ プ ( 必須 )
ロ ーカル変数のデフ ォ ル ト 値 ( オプシ ョ ン )
デフ ォ ル ト 値には、 宣言 さ れ る デー タ ・ タ イ プ と の互換性がなければな り ま
せん。 し か し 、 デフ ォ ル ト の DateTime 値が指定 し た DateTime デー タ ・ タ イ
プ と は異な る 場合は、 Teradata Database は暗黙の変換を行ない ます。 詳細は、
<SQL 関数、 演算子、 式お よ び述語 > の 「デー タ ・ タ イ プの変換」 を参照 し
て く だ さ い。
例1
宣言は完全に指定 さ れてい ます。
DECLARE hErrorMsg CHARACTER(30) DEFAULT ’NO ERROR’;
例2
1 つの宣言文の中で、 同 じ デー タ ・ タ イ プの ロ ーカル変数を複数指定す る こ と が可
能です。
次の宣言では、 hAccountNo と tempAccountNo の両方を INTEGER で宣言 し ま す。
ど ち ら の変数に も デフ ォ ル ト は指定 さ れていないので、 いずれの変数に も 、 デフ ォ
ル ト と し て NULL が割 り 当て ら れます。
DECLARE hAccountNo, tempAccountNo INTEGER;
次の文では、 hLastName お よ び hFirstName のデー タ ・ タ イ プ を CHARACTER(30) と
し て宣言 し ます。
DECLARE hFirstName, hLastName CHARACTER(30);
例3
デフ ォ ル ト 値は、 宣言で指定 さ れたそれぞれの ロ ーカル変数に割 り 当て る こ と がで
き ます。
次の例では、 'NO ERROR' のデフ ォ ル ト 値を明示的に hNoErrorMsg と hErrorMsg に
割 り 当ててい ます。
DECLARE hNoErrorMsg, hErrorMsg CHARACTER(30) DEFAULT ’NO ERROR’;
例4
次の DECLARE 文は、 変数 MyCircle(STRUCTURED 型 UDT タ イ プ CircleUdt を
持つ ) を宣言 し 、 circle と い う 名前の、 入力パ ラ メ ータ に 1、 1、 そ し て 9 を持つコ ン
ス ト ラ ク タ 外部ルーチンに よ っ てデフ ォ ル ト 値が決定 さ れ る よ う に し ます。
DECLARE MyCircle CircleUdt DEFAULT NEW circle(1,1,9);
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
287
第 8 章 : SQL 制御文
DECLARE
例5
次の文では、 hBirthdate をデフ ォ ル ト 値 '1998-01-06' の DATE デー タ ・ タ イ プ と し て
宣言 し ます。
DECLARE hBirthdate DATE DEFAULT '1998-01-06';
288
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
FOR
FOR
目的
表か ら 取 り 出 し た各行ご と に文を実行 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
FOR
for_loop_variable
A
A
AS
label_name :
cursor_name
cursor_specification
DO
statement
CURSOR FOR
END FOR
;
label_name
1148A006
cursor_specification
,
SELECT
column_name
A
correlation_name
AS
*
expression
correlation_name
AS
A
FROM
,
table_name
table_name
B
INNER
JOIN
table_name
ON
condition
OUTER
LEFT
RIGHT
FULL
B
WHERE clause
other SELECT clauses
1101B384
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
289
第 8 章 : SQL 制御文
FOR
statement
SQL_statement
compound statement
assignment statement
condition statement
iteration statement
label_name :
label_name
ITERATE
label_name
LEAVE
label_name
YS6CP01B
compound statement
A
BEGIN
label_name :
local_declaration
cursor_declaration
A
END
condition_handler
label_name
;
statement
1101B383
local_declaration
DECLARE
,
variable_name
data_type
;
DEFAULT
literal
NULL
condition_name
CONDITION
FOR SQLSTATE
sqlstate_code
VALUE
290
1101A613
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
FOR
cursor_declaration
DECLARE
CURSOR
cursor_name
A
SCROLL
NO SCROLL
B
A
WITHOUT RETURN
WITH RETURN
ONLY
TO
CALLER
CLIENT
B
FOR
;
cursor_specification
FOR
READ ONLY
UPDATE
statement_name
1101A614
condition_handler
DECLARE
HANDLER
CONTINUE
FOR
A
EXIT
,
A
sqlstate_code
SQLSTATE
handler_action _statement
;
VALUE
condition_name
,
SQLEXCEPTION
SQLWARNING
NOT FOUND
1101A563
assignment statement
SET
assignment_target =
assignment_source
1101A380
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
291
第 8 章 : SQL 制御文
FOR
condition statement
operand_1
CASE
WHEN
operand_2
WHEN
conditional_expression
A
statement ;
THEN
A
END CASE
statement ;
ELSE
conditional_expression
IF
statement ;
THEN
THEN
statement ;
B
B
C
ELSEIF
conditional_expression
THEN
statement ;
END IF
C
ELSE
statement ;
1101B381
iteration statement
conditional_expression
WHILE
statement ;
LOOP
for_loop_variable
FOR
statement ;
DO
END LOOP
AS
A
cursor_name
A
cursor_specification
REPEAT
END WHILE
statement ;
DO
UNTIL
CURSOR FOR
statement ;
conditional_expression
END FOR
END REPEAT
1101B382
説明
構文要素
指定内容
label_name
FOR 文の任意選択 ラ ベル。
終了 ラ ベルが指定 さ れてい る場合、 終了 ラ ベル と 同等の開始ラ ベルを
指定す る 必要があ り ます。 開始 ラ ベルは コ ロ ン (:) で終わっ てい る 必
要があ り ます。
BEGIN…END 複合文の ラ ベル名は繰返 し 文内で再使用で き ま せん。
1 つの ラ ベル名を入れ子の FOR 文の一グループ内で再利用す る こ と
はで き ませんが、 入れ子にな っ ていない別個の繰返 し 文内では再利
用で き ます。
for_loop_variable
ループの名前。
cursor_name
カー ソ ルの名前。
WHERE CURRENT OF 句の目的語 と し て、 更新可能カー ソ ルで使用
し ます。
292
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
FOR
構文要素
指定内容
cursor_specification
カー ソ ル と し て使用 さ れ る 1 つの SELECT 文。
読み取 り 専用カー ソ ルの場合、 1 つの SELECT 文に 1 つの SELECT を
組み込む こ と も 、 UNION、 INTERSECT、 MINUS の よ う な集合演算
子を使用 し た複数の SELECT を組み込む こ と も で き ます。
更新可能カー ソ ルでは、 集合演算子を使用で き ません。
statement
1 つ以上の DML 文、 DDL 文、 DCL 文 ( 動的 SQL 文を含む )、 ま たは
制御文 (BEGIN…END 複合文を含む )。
ANSI への準拠
FOR は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
FOR には、 以下の権限が必要です。
• 特定の cursor_specification で参照 さ れ る デー タ ベース ・ オブジ ェ ク ト に対す る
SELECT 権限。
•
カー ソ ルが更新可能の場合は、 UPDATE ま たは DELETE 権限。
DECLARE CURSOR 文 と FOR 文
FOR 文には、 DECLARE CURSOR 文が含まれます。
DECLARE CURSOR 文 と FOR 文の違いについては、 「DECLARE CURSOR 文お よ び
FOR 文のカー ソ ル」 (26 ページ ) を参照 し て く だ さ い。
LEAVE および ITERATE
FOR ブ ロ ッ ク 内では LEAVE お よ び ITERATE 文を実行す る こ と がで き ます。
詳細は、 「ITERATE」 (304 ページ ) お よ び 「LEAVE」 (308 ページ ) を参照 し て く だ
さ い。
カ ー ソ ル指定のための相関名の使用
カー ソ ル内の列や式の別名を、 標準の object AS correlation_name 構文に よ っ て定義
す る こ と がで き ます。 別名のあ る オブジ ェ ク ト をループ内で参照す る 場合は、 その
オブジ ェ ク ト を for_loop_variable 名で修飾す る 必要があ り ます。
別名のないカー ソ ル式をループ内で参照す る こ と はで き ません。
更新可能カ ー ソ ル と 読み取 り 専用カ ー ソ ル
更新可能 ( 位置指定 ) カー ソ ルは、 問い合わせのためにアプ リ ケーシ ョ ンに よ っ て
定義 さ れた カー ソ ルであ り 、 結果行を更新す る ために も 使用で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
293
第 8 章 : SQL 制御文
FOR
FOR ループ内でカー ソ ルを参照す る 少な く と も 1 つの位置指定 さ れた DELETE ま
たは位置指定 さ れた UPDATE が存在すれば、 そのカー ソ ルは更新可能です。
更新可能カー ソ ル と 読み取 り 専用カー ソ ルを ス ト ア ド ・ プ ロ シージ ャ で使用す る 場
合の違いは以下の と お り です。
更新可能な カー ソ ル
読み取 り 専用カー ソ ル
ANSI ト ラ ンザ ク シ ョ ン ・ モー ド でのみ使
用可能です。
ANSI ト ラ ン ザ ク シ ョ ン ・ モー ド と
Teradata ト ラ ン ザ ク シ ョ ン ・ モー ド で使用
可能です。
位置指定 さ れた DELETE ま たは UPDATE
文を使用で き ます。 こ れ ら の文内の表名
は、 カー ソ ル指定で使用 し た も の と 同 じ で
なければな り ません。
位置指定 さ れた DELETE ま たは UPDATE
文は使用で き ません。
• 定位置 UPDATE では、 カー ソ ルの現在
行を複数回更新す る こ と がで き ます。
• 位置指定 さ れた DELETE では、 複数回
更新 し た カー ソ ルの現在行を削除す る こ
と がで き ます。
FOR ループ内の SQL 文の規則
• すべての DML 文 (CALL、 位置指定 さ れた UPDATE、 お よ び位置指定 さ れた
DELETE な ど ) を指定す る こ と がで き ます。
• すべての制御文を指定す る こ と がで き ます。
• ト ラ ンザ ク シ ョ ン文は、 読み取 り 専用カー ソ ルでのみ使用で き ます。 更新可能
カー ソ ルでは指定で き ません。
• SQL 文で参照 さ れ る それぞれの ロ ーカル変数、 パ ラ メ ー タ 、 列、 相関名、 ま た
は ス テー タ ス変数は、 事前に宣言 さ れてい る 必要があ り ます。
FOR カ ー ソ ルの規則
• ABORT、 COMMIT、 お よ び ROLLBACK 文は、 更新可能な カー ソ ルでは使用で
き ません。
•
こ れ ら の文のいずれか を実行 し よ う と す る と 、 実行時エ ラ ーが戻 さ れます。
カー ソ ル指定では、 警告 コ ー ド 3999 を戻す こ と はで き ません。
•
カー ソ ル指定に WITH…BY 句を含め る こ と はで き ません。
• カー ソ ルの指定に UNION 演算子が含まれ る 場合、 参照 さ れ る 相関名や列名は、
最初の SQL SELECT 文で使用 さ れてい る 相関名 ま たは列名でな ければな り ま
せん。
294
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
FOR
FOR ループ変数の規則
• 入れ子の FOR 繰返 し ループで使用す る 場合、 FOR ループ変数の名前は固有でな
ければな り ません。
• FOR ループ変数の名前は、 FOR 繰返 し 文内のカー ソ ル名や相関名 と 同 じ にす る
こ と がで き ます。
• 繰返 し 文内の制御文以外の SQL 文で FOR ループ変数を使用す る 場合は、 その先
頭に コ ロ ン (:) 文字をつけ る 必要があ り ます。
• FOR ループ内の未修飾記号は、 変数名ま たはパ ラ メ ー タ 名 と みな さ れます。
FOR ループ相関名の規則
• 相関名は、 FOR 繰返 し 文内で固有でなければな り ません。 ただ し 、 入れ子の
FOR 繰返 し 文 と 入れ子でない も のに同 じ 相関名を使用す る こ と がで き ます。
• 相関名は、 FOR 繰返 し 文内の FOR ループ変数お よ びカー ソ ルの名前 と 同 じ にす
る こ と がで き ます。
• 列 と 相関名は、 繰返 し 文内の制御文を含む SQL 文で参照 さ れ る 場合、 FOR ルー
プ変数で修飾す る 必要があ り ます。
• 列ま たは相関名が修飾 さ れていない と 、 列お よ び相関名の参照はパ ラ メ ー タ ま
たは ロ ーカル変数の ど ち ら であ る か を検査 さ れます。
• FOR 繰返 し 文の相関名の有効範囲は文の本文です。
FOR ループ ・ カ ー ソ ル名の規則
• 入れ子の FOR 繰返 し 文で使用す る 場合、 カー ソ ル名は固有で な ければな り ま
せん。
• カー ソ ル名は、 FOR 文内の FOR ループ変数 と 同 じ にす る か、 ま たは相関名あ る
いは列名 と 同 じ にす る こ と がで き ます。
• カー ソ ル名の適用範囲は、 それが定義 さ れてい る FOR 文に限定 さ れます。 FOR
文が入れ子にな っ てい る 場合、 入れ子の外の FOR 文に関連づけ ら れてい る カー
ソ ル名は、 内側の FOR 文にあ る 文で参照す る こ と がで き ます。
例1
L1:
FOR CustCursor AS c_customer CURSOR FOR
SELECT CustomerNumber AS Number
,CustomerName AS Name
,(Amount + 10000) a
FROM customer
DO
SET hCustNbr = CustCursor.Number;
SET hCustName = CustCursor.Name;
SET hAmount = CustCursor.a + CustCursor.a * 0.20;
INSERT INTO Cust_temp VALUES (hCustNbr, hCustName);
END FOR L1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
295
第 8 章 : SQL 制御文
FOR
例2
FOR CustCursor AS c_customer CURSOR FOR
SELECT CustomerNumber
,CustomerName
FROM Customer
DO
SET hCustNbr = CustCursor.CustomerNumber;
SET hCustName = CustCursor.CustomerName;
DELETE FROM Customer WHERE CURRENT OF c_customer;
END FOR;
例3
L1:
FOR CustCursor AS c_customer CURSOR FOR
SELECT CustomerNumber AS Number
,CustomerName AS Name
,(Amount + 10000) a
FROM Customer
DO
SET hCustNbr = CustCursor.Number;
SET hCustName = CustCursor.Name;
SET hAmount = CustCursor.a + CustCursor.a * 0.20;
IF hAmount > 50000 THEN
hAmount = 500000;
END IF;
UPDATE customer
SET amount = hAmount WHERE CURRENT OF c_customer;
INSERT INTO Cust_temp VALUES (hCustNbr,
hCustName);
END FOR;
296
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
IF
IF
目的
条件に対す る 真の値に基づいた条件付 き 実行の手段 と な り ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
IF
conditional_expression
THEN
A
statement
A
B
ELSEIF
conditional_expression
THEN
END IF
B
ELSE
statement
statement
;
1148A007
statement
SQL_statement
compound statement
assignment statement
condition statement
iteration statement
label_name :
label_name
ITERATE
label_name
LEAVE
label_name
YS6CP01B
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
297
第 8 章 : SQL 制御文
IF
compound statement
A
BEGIN
label_name :
local_declaration
cursor_declaration
A
END
statement
condition_handler
label_name
;
1101B383
local_declaration
DECLARE
,
variable_name
data_type
;
DEFAULT
literal
NULL
condition_name
CONDITION
FOR SQLSTATE
sqlstate_code
VALUE
1101A613
cursor_declaration
DECLARE
CURSOR
cursor_name
A
SCROLL
NO SCROLL
B
A
WITHOUT RETURN
WITH RETURN
ONLY
TO
CALLER
CLIENT
B
FOR
;
cursor_specification
FOR
READ ONLY
UPDATE
statement_name
1101A614
298
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
IF
cursor_specification
,
column_name
SELECT
A
correlation_name
AS
*
expression
correlation_name
AS
A
FROM
,
table_name
B
table_name
INNER
JOIN
table_name
ON
condition
OUTER
LEFT
RIGHT
FULL
B
WHERE clause
other SELECT clauses
1101B384
condition_handler
DECLARE
HANDLER
CONTINUE
FOR
A
EXIT
,
A
sqlstate_code
SQLSTATE
handler_action _statement
;
VALUE
condition_name
,
SQLEXCEPTION
SQLWARNING
NOT FOUND
1101A563
assignment statement
SET
assignment_target =
assignment_source
1101A380
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
299
第 8 章 : SQL 制御文
IF
condition statement
operand_1
CASE
WHEN
operand_2
WHEN
conditional_expression
A
statement ;
THEN
A
END CASE
statement ;
ELSE
conditional_expression
IF
statement ;
THEN
THEN
statement ;
B
B
C
ELSEIF
conditional_expression
THEN
statement ;
END IF
C
statement ;
ELSE
1101B381
iteration statement
conditional_expression
WHILE
statement ;
LOOP
for_loop_variable
FOR
statement ;
DO
END LOOP
AS
A
cursor_name
A
REPEAT
cursor_specification
statement ;
END WHILE
UNTIL
DO
CURSOR FOR
statement ;
conditional_expression
END FOR
END REPEAT
1101B382
説明
構文要素
指定内容
conditional_expression
IF ブ ロ ッ ク に組み込 ま れて い る 1 つ以上の文 を 実行す る か ど
う か を 評価す る ために使用 さ れ る ブール条件。
条件 リ ス ト に ロ ーカル変数、 パ ラ メ ー タ 、 ま たはカー ソ ル別名
が含まれてい る 場合は、 IN お よ び NOT IN 演算子を使用す る こ
と はで き ません。
conditional_expression で OUT パ ラ メ ー タ を使用す る こ と はで き
ません。
statement
次のいずれか。
•
ス ト ア ド ・ プ ロ シージ ャ で使用で き る DML、 DDL、 ま たは
DCL 文。 こ れには、 動的 SQL 文が含まれ ます。
• 制御文、 BEGIN…END 複合文を含む。
300
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
IF
ANSI への準拠
IF は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
ELSEIF の規則
IF 文の中に ELSEIF 句を い く つ指定 し て も か ま い ませんが、 それぞれが、 最初の IF
句の場合 と 同 じ 条件を関連付け ら れなければな り ません。
IF 文の有効な形式
• IF-THEN-END IF
• IF-THEN-ELSE-END
• IF-THEN-ELSEIF-END
• IF-THEN-ELSEIF-THEN-ELSE-END
IF-THEN-END IF
conditional_expression が真 と 評価 さ れ る と 、 こ の形式の IF は、 IF と END IF 内の
文を実行 し ます。
次の文は IF-THEN-END IF の例です。
IF hNoAccts = 1 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'One Customer');
END IF;
IF-THEN-ELSE-END IF
conditional_expression が真 と 評価 さ れ る と 、 こ の形式の IF は、 IF と ELSE 内の文を
実行 し ます。 それ以外の場合は、 ELSE と END IF 内の文が実行 さ れます。
次の例では、 hNoAccts の値に応 じ て、 指定 さ れた INSERT 文の う ちの 1 つだけが
実行 さ れます。
IF hNoAccts = 1 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'One customer');
ELSE
INSERT INTO temp_table VALUES (hNoAccts, 'More than one customer');
END IF;
IF-THEN-ELSEIF-END の動作
1
IF の評価が真であ る 場合、 IF か ら ELSEIF ま での間の文が実行 さ れます。
その後、 制御は END IF に続 く 文に渡 さ れます。
2
それぞれの ELSEIF に関連 し た文について、 真の値が評価 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
301
第 8 章 : SQL 制御文
IF
3
ELSEIF に関連 し た文が真 と 評価 さ れ る 場合、 そのブ ロ ッ ク 内の文が実行 さ れ
ま す。
それ以降の ELSEIF 文節は実行 さ れません。
4
IF/END IF ブ ロ ッ ク 内の文が どれ も 真でない場合、 ど の文 も 実行 さ れません。
次の例では、 hNoAccts の値に応 じ て、 ELSEIF 句の 1 つだけが、 関連 し てい る
DML 文を実行す る か、 ま たは何 も 実行 し ません。
IF hNoAccts = 1 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'One customer');
ELSEIF hNoAccts = 0 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'No customer');
END IF;
次の例では、 hNoAccts の値に応 じ て、 ELSEIF 句の 1 つだけが、 関連 し てい る
DML 文を実行す る か、 ま たは何 も 実行 し ません。
IF hNoAccts = 1 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'One customer');
ELSEIF hNoAccts = 0 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'No customer');
ELSEIF hNoAccts < 0 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'Unknown customer');
END IF;
IF-THEN-ELSEIF-ELSE-END の動作
1
IF の評価が真であ る 場合、 IF か ら ELSEIF ま での間の文が実行 さ れます。
その後、 制御は END IF に続 く 文に渡 さ れます。
2
それぞれの ELSEIF に関連 し た文について、 真の値が評価 さ れます。
3
ELSEIF に関連 し た文が真 と 評価 さ れ る 場合、 そのブ ロ ッ ク 内の文が実行 さ れ
ま す。
それ以降の ELSEIF 文節は、 評価が真であ っ て も 実行 さ れません。
4
IF/ELSEIF ブ ロ ッ ク 内の文が どれ も 真 と 評価 さ れない場合、 ELSE 句に関連 し て
い る 文が実行 さ れます。
次の例では、 hNoAccts の値に応 じ て、 ELSEIF ま たは ELSE 句に関連 し てい る
DML 文の 1 つだけ を実行 し ます。
IF hNoAccts = 1 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'One customer');
ELSEIF hNoAccts = 0 THEN
INSERT INTO temp_table VALUES (hNoAccts, 'No customer');
ELSE
INSERT INTO temp_table VALUES (hNoAccts, 'More than one customer');
END IF;
302
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
IF
次の例では、 hNoAccts の値に応 じ て、 ELSEIF ま たは ELSE 句に関連 し てい る
DML 文の 1 つだけ を実行 し ます。
IF hNoAccts = 1 THEN
INSERT INTO temp_table
ELSEIF hNoAccts = 0 THEN
INSERT INTO temp_table
ELSEIF hNoAccts < 0 THEN
INSERT INTO temp_table
ELSE
INSERT INTO temp_table
END IF;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
VALUES (hNoAccts, 'One customer');
VALUES (hNoAccts, 'No customer');
VALUES (hNoAccts, 'Nonvalid customer');
VALUES (hNoAccts, 'More than one customer');
303
第 8 章 : SQL 制御文
ITERATE
ITERATE
目的
繰返 し SQL 文を終了 し 、 ループ内の次の繰返 し 文を開始 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
ITERATE
label_name
;
YS6ITER01
説明
構文要素
指定内容
label_name
実行 さ れ る 繰返 し の ラ ベル名。
ANSI 準拠
ITERATE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
アクシ ョ ン
ITERATE は、 参照 さ れ る 繰返 し 文に応 じ て、 以下に示すア ク シ ョ ン を実行 し ます。
ITERATE が指定
す る ラ ベル
FOR 文
その場合
カー ソ ルに次の行が存在す る 場合には、 FOR ループの次の文で実
行が続行 さ れ ます。
カー ソ ルに次の行が存在 し ない場合には、 カー ソ ルが閉 じ て、
FOR ループの対応す る END FOR 終了子の外にあ る 次の文で実行
が続行 さ れます。
304
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
ITERATE
ITERATE が指定
す る ラ ベル
その場合
LOOP 文
LOOP ブ ロ ッ ク の内側にあ る 最初の文は無条件で実行 さ れ る 。
REPEAT 文
UNTIL 句 を 評価 し な い で REPEAT ループ内の最初の文の実行に
移る。
WHILE 文
WHILE 文の条件式が TURE に評価 さ れ る 場合、 WHILE ループ内
の最初の文で実行が続行 さ れ ます。
WHILE 文の条件式が TRUE に評価 さ れな い場合には、 ループの
対応す る END WHILE 終了子の外に あ る 次の文で実行が続行 さ
れ ま す。
規則
• ITERATE は独立 し た文ではあ り ません。 FOR、 LOOP、 REPEAT ま たは WHILE
繰返 し 文 と 一緒に し か使用で き ません。
• 文 ラ ベルは ITERATE キーワ ー ド の直後に続け る 必要があ り ます。
• ITERATE 文では、 その ITERATE が組み込まれてい る BEGIN…END 複合文に関
連付け ら れてい る ラ ベルを参照す る こ と はで き ません。
• 文 ラ ベルは、 ITERATE が組み込まれてい る 繰返 し 文に関連づけ ら れてい る 必要
があ り ます。
• 入れ子の FOR ループの内側に ITERATE を指定 し 、 外側の繰返 し 文に関連づけ
ら れてい る ラ ベルを参照す る 場合、 外側の繰返 し 文内でオープン さ れてい る す
べてのカー ソ ルは、 次の繰返 し を実行す る 前に ク ロ ーズ さ れます。
例1
次の例は、 ITERATE を使用 し て WHILE 文を繰 り 返す方法を示 し てい ます。
SELECT minNum INTO hminNum FROM limits
WHERE LIMIT_TYPE = ’HIGHNUM’;
L1:
WHILE hCounter > 0 DO
INSERT INTO transaction (trans_num, account_num)
VALUES (hCounter, hAccountNum);
SET hCounter = hCounter - 1;
IF hCounter >= hminNum THEN
ITERATE L1;
END IF;
-- The following two statements perform only when
-- hCounter < hminNum
UPDATE limit SET minNum = hCounter;
SET hminNum = hCounter;
END WHILE L1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
305
第 8 章 : SQL 制御文
ITERATE
例2
次の例は、 ITERATE 文を使用 し て外側のループを繰 り 返す方法を示 し てい ます。
LOOP1:
WHILE hCounter > 0 DO
SELECT highNum INTO maxNum FROM limits
WHERE LIMIT_TYPE = 'HIGHNUM';
L1:
LOOP
INSERT INTO transaction (trans_num,
account_num) VALUES (hCounter, hAccountNum);
SET hCounter = hCounter - 1;
IF (hCounter = 10) THEN
IF (hOnceIterated = 0) THEN
SET hOnceIterated = 1);
ITERATE LOOP L1;
END IF;
END IF;
-- The following statement performs only if
-- hCounter <> 10 or hOnceIterated <> 0
SET hNum = hNum + 10;
END LOOP L1;
IF hCounter >= MaxNum THEN
ITERATE LOOP1;
END IF;
-- The following statement performs only if
-- hCounter < MaxNum.
INSERT INTO transaction (trans_num,
account_num) VALUES (hCounter, hAccountNum);
END WHILE LOOP1;
UPDATE transaction
SET account_num = hAccountNum + 10;
例3
次の例は、 ITERATE を使用 し て外側の FOR ループ を繰 り 返す方法を示 し てい ます。
取 り 出 さ れ る 行がな く な る と 、 カー ソ ルは ク ロ ーズ さ れ、 制御は FOR ループの外
側を繰 り 返 し ます。
L1:
LOOP
INSERT INTO transaction (trans_num, account_num)
VALUES (hCounter, hAccountNum);
SET hCounter = hCounter - 1;
FOR RowPointer AS c_customer CURSOR FOR
SELECT CustomerNumber AS Number
,CustomerName AS Name
,(Amount + 10000) a
FROM customer
DO
SET hCustNum = RowPointer.Number;
IF hCustNum >= 100 THEN
ITERATE L1;
END IF;
-- The following statements perform only if
-- hCustNum < 100; else the cursor closes before
-- iterating outside the FOR loop block.
306
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
ITERATE
SET hCustName = RowPointer.Name;
SET hAmount = RowPointer.a +
RowPointer.a * 0.20;
INSERT INTO Cust_temp VALUES (hCustNum,
:hCustName);
END FOR;
SET hNum = hNum + 10;
END LOOP L1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
307
第 8 章 : SQL 制御文
LEAVE
LEAVE
目的
ラ ベルの付け ら れた繰返 し ま たは複合文を停止 し 、 繰返 し 文の外側の部分を続けて
実行 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
LEAVE
label_name
;
YS6LEA01
説明
構文要素
指定内容
label_name
LEAVE に よ っ て終了 さ れ る 繰返 し 文ま たは BEGIN…END ブ ロ ッ ク の
ラ ベル名。
ANSI への準拠
LEAVE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
アクシ ョ ン
• LEAVE 文が複合文に関連 し た ラ ベルを参照す る と 、 その複合文の実行は終了 さ
れます。
こ のア ク シ ョ ンは、 ラ ベルが ス ト ア ド ・ プ ロ シージ ャ 内の最 も 外側ま たは唯一
の複合文に関連付け ら れてい る 場合にのみ、 ス ト ア ド ・ プ ロ シージ ャ の正常な
終了 と し て扱われます。
• LEAVE が繰返 し 文 (FOR、 LOOP、 REPEAT、 ま たは WHILE) の ラ ベルを参照す
る 場合、 その繰返 し は停止 し 、 制御は ラ ベルの外側にあ る 次の文に渡 さ れます。
• LEAVE は、 参照 さ れる繰返し文に応じ て、 以下に示すア ク シ ョ ン を実行し ます。
308
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
LEAVE
LEAVE が指定す る ラ ベル
その場合
すべての文
LEAVE は、 関連す る 繰返 し 文、 お よ びその中に入れ
子にな っ てい る すべての繰返 し 文の実行を終了す る 。
FOR 文
カー ソ ルを ク ロ ーズ し てか ら 、 参照 し た繰返 し 文の
外側にあ る 次の文に制御を渡す。
1 つ以上の FOR 文の入っ た外
側の繰返 し 文
繰返 し 文に指定 さ れてい る すべてのオープ ン ・ カー
ソ ルを ク ロ ーズ し てか ら 、 その繰返 し 文の次の文に
制御を渡す。
LEAVE が置かれてい る
BEGIN…END 複合文
その複合文で宣言 さ れてい る 開かれたすべてのカー
ソ ルが閉 じ ら れ、 制御がその複合文の呼び出 し 元の
次の文に渡 さ れ、
プ ロ シージ ャ が終了す る 。
正常終了ま たは 「ok」 応答がプ ロ シージ ャ に戻 さ れ
ます。
•
カー ソ ルを ク ロ ーズす る と き に発生す る エ ラ ー条件は、 ス テー タ ス変数に反映
さ れます。
例:
SQLCODE=7600, SQLSTATE=’T7600’, ACTIVITY_COUNT=0.
規則
• 参照 さ れ る ラ ベルの有効範囲内であればど の位置で も LEAVE を指定で き ます。
• ラ ベルは、 以下のいずれかに関連 し てい る 必要があ り ます。
•
•
繰返 し 文
LEAVE 文を組み込んだ BEGIN…END 複合文
例1
以下の例は、 LEAVE を正 し く 使用 し て ス ト ア ド ・ プ ロ シージ ャ の実行を終了す る
方法を示 し てい ます。
CREATE PROCEDURE spSample()
SPLABEL:
BEGIN
DECLARE vCount INTEGER DEFAULT 0;
WHILE vCount <= 10
DO
UPDATE table_1
SET table_1.column_1 = vCount
WHERE table_1.column_2 > 10;
IF ACTIVITY_COUNT = 0 THEN
LEAVE SPLABEL;
END IF;
END WHILE;
END;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
309
第 8 章 : SQL 制御文
LEAVE
例2
以下の例は、 繰返 し 文 と と も に LEAVE を使用す る 正 し い方法を示 し てい ます。
LABEL1:
WHILE i < 10 DO
UPDATE table_1
SET table_1.column_1 = i
WHERE table_1.column_2 > 10;
IF ACTIVITY_COUNT > 1 THEN
LEAVE LABEL1;
END IF;
SET i = i+1;
END WHILE LABEL1;
310
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
LOOP
LOOP
目的
定義 さ れてい る 繰返 し 文内に組み込まれてい る 1 つま たは複数の文を繰 り 返 し 実行
し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
LOOP
statement
END LOOP
;
label_name :
label_name
1148A008
statement
SQL_statement
compound statement
assignment statement
condition statement
iteration statement
label_name :
label_name
ITERATE
label_name
LEAVE
label_name
YS6CP01B
compound statement
A
BEGIN
label_name :
local_declaration
cursor_declaration
A
END
condition_handler
statement
;
label_name
1101B383
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
311
第 8 章 : SQL 制御文
LOOP
local_declaration
DECLARE
,
variable_name
data_type
;
DEFAULT
literal
NULL
condition_name
CONDITION
FOR SQLSTATE
sqlstate_code
VALUE
1101A613
cursor_declaration
DECLARE
CURSOR
cursor_name
A
SCROLL
NO SCROLL
B
A
WITHOUT RETURN
WITH RETURN
ONLY
TO
CALLER
CLIENT
B
FOR
;
cursor_specification
FOR
READ ONLY
UPDATE
statement_name
1101A614
cursor_specification
,
SELECT
column_name
A
correlation_name
AS
*
expression
correlation_name
AS
A
FROM
,
table_name
table_name
B
INNER
JOIN
table_name
ON
condition
OUTER
LEFT
RIGHT
FULL
B
WHERE clause
other SELECT clauses
1101B384
312
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
LOOP
condition_handler
DECLARE
HANDLER
CONTINUE
FOR
A
EXIT
,
A
handler_action _statement
sqlstate_code
SQLSTATE
;
VALUE
condition_name
,
SQLEXCEPTION
SQLWARNING
NOT FOUND
1101A563
assignment statement
SET
assignment_target =
assignment_source
1101A380
condition statement
operand_1
CASE
WHEN
WHEN
operand_2
conditional_expression
A
statement ;
THEN
A
END CASE
statement ;
ELSE
IF
statement ;
THEN
conditional_expression
THEN
statement ;
B
B
C
ELSEIF
conditional_expression
THEN
statement ;
END IF
C
ELSE
statement ;
1101B381
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
313
第 8 章 : SQL 制御文
LOOP
iteration statement
conditional_expression
WHILE
statement ;
LOOP
for_loop_variable
FOR
statement ;
DO
END LOOP
AS
A
cursor_name
A
REPEAT
cursor_specification
statement ;
END WHILE
DO
UNTIL
CURSOR FOR
statement ;
conditional_expression
END FOR
END REPEAT
1101B382
説明
構文要素
指定内容
label_name
LOOP 文の任意指定 ラ ベル。
終了 ラ ベルが指定 さ れてい る 場合、 終了 ラ ベル と 同等の開始 ラ ベルを
指定す る 必要があ り ます。 開始 ラ ベルは コ ロ ン (:) で終わっ てい る 必要
があ り ます。
BEGIN…END 複合文の ラ ベル名は繰返 し 文内で再使用で き ま せん。
入れ子にな っ てい る LOOP 文のグループ内で 1 つの ラ ベル名を再使用
す る こ と はで き ませんが、 入れ子にな っ ていない別の繰返 し 文で再使
用す る こ と はで き ます。
statement
無条件で処理 さ れ る 文 リ ス ト リ ス ト には、 次の よ う な も のが含 ま れ
ま す。
• SQL DML、 DDL、 ま たは DCL 文 ( 動的 SQL も 含む )。
• 制御文、 BEGIN…END を含む。
ANSI 準拠
LOOP は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
LOOP 終了エ ラ ーの原因
• LOOP 内の文に例外条件が生 じ て も 、 その条件に対す る CONTINUE ハン ド ラ ー
が宣言 さ れていれば、 ス ト ア ド ・ プ ロ シージ ャ の実行は続け ら れます。
• EXIT ハン ド ラ ーが宣言 さ れてい る 場合、 文は ス ト ア ド ・ プ ロ シージ ャ の実行を
終了 し ます。
• LOOP 内の文に例外条件が生 じ 、 関連す る SQLSTATE コ ー ド がハン ド ラ ーに定
義 さ れていない場合、 ループ と ス ト ア ド ・ プ ロ シージ ャ の両方が終了 し ます。
314
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
LOOP
規則
• LOOP は文 ラ ベルで修飾で き ます。
LOOP 内に指定 さ れてい る LEAVE 文は繰返 し 文を終了 し 、 ラ ベルが指定 さ れて
い る 文の次の文に制御を渡 し ます。
• 文を必ず正常に終了 さ せ る ためには、 LOOP 文の内側に LEAVE 文を指定す る 必
要があ り ます。
指定 し ない と 、 ループが繰 り 返 さ れ、 非同期のアボー ト が生 じ る ま で停止で き
ません。
例
以下に示すのは正 し い LOOP 文です。
L1:
LOOP
INSERT INTO transaction (trans_num, account_num)
(hCounter, hAccountNum);
SET hCounter = hCounter - 1;
IF hCounter = 0 THEN
LEAVE L1;
END IF;
END LOOP L1;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
VALUES
315
第 8 章 : SQL 制御文
REPEAT
REPEAT
目的
指定 さ れた条件が真 と 評価 さ れ る ま で、 1 つ以上の文の実行を繰 り 返 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
REPEAT
statement
A
UNTIL
label_name :
A
conditional_expression
END REPEAT
;
label_name
YS6RPT01
説明
構文要素
指定内容
label_name
REPEAT 文の任意指定 ラ ベル。
終了 ラ ベルが指定 さ れてい る 場合、 終了 ラ ベル と 同等の開始 ラ ベ
ルを指定す る 必要があ り ます。 開始 ラ ベルは コ ロ ン (:) で終わ っ て
い る 必要があ り ます。
BEGIN…END 複合文の ラ ベル名は繰返 し 文内で再使用で き ません。
入れ子にな っ てい る REPEAT 文のグループ内で 1 つの ラ ベル名を
再使用す る こ と はで き ませんが、 入れ子にな っ ていない別の繰返
し 文で再使用す る こ と はで き ます。
statement
実行 さ れ る 文の リ ス ト 。
リ ス ト には、 次の よ う な も のが含まれます。
• DML、 DDL、 ま たは DCL 文 ( 動的 SQL も 含む )。
• 制御文、 BEGIN…END を含む。
conditional_expression
REPEAT ループに組み込まれてい る 1 つ以上の文を実行す る か ど
う か を評価す る ために使用 さ れ る ブール条件。
条件 リ ス ト に ロ ーカル変数、 パ ラ メ ー タ 、 ま たはカー ソ ル別名が
含ま れてい る 場合は、 IN お よ び NOT IN 演算子を使用す る こ と は
で き ません。
conditional_expression で OUT パ ラ メ ー タ を使用す る こ と はで き ま
せん。
316
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
REPEAT
ANSI への準拠
REPEAT は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
例外処理
REPEAT 文内の文ま たは UNTIL 句の条件式が例外を生じ た場合に、 その例外条件を
処理す る ハン ド ラ ーが ス ト ア ド ・ プ ロ シージ ャ 内に備え ら れてい る と き の処置行動
は、 WHILE 文内で発生 し た例外の場合 と 同 じ です。
例外に適用 さ れ る 規則については、 「文固有の条件処理」 (182 ページ ) を参照 し て
く だ さ い。
REPEAT と WHILE の相違
REPEAT - END REPEAT は WHILE - END WHILE 文 と 類似 し てい ますが、 次の よ う
な違いがあ り ます。
REPEAT
WHILE
無条件で最初の繰返 し を実行 し ます。
指定 さ れてい る 条件が真にな っ た場合の
み、 最初の繰返 し と その後の繰返 し を実行
し ます。
REPEAT は、 常に文シーケ ン ス を少な く と
も 1 回実行 し ます。
指定の条件が満 た さ れ る ま で文 を 実行 し
ま す。
指定の条件が満た さ れてい る 限 り 文を実行
し ます。
規則
REPEAT 文 を ラ ベル名で修飾す る こ と がで き ま す。 REPEAT に ラ ベル名 を 使用す
る と 、 次の よ う にな り ます。
• ブ ロ ッ ク 内の LEAVE 文でその ラ ベル名を使えば、 REPEAT 文を抜け出 る こ と が
で き ます。
• ブ ロ ッ ク 内に ITERATE 文を指定 し 、 し か も それが REPEAT に関連 し た ラ ベルを
参照 し てい る と 、 UNTIL 句で指定 し た条件式は評価 さ れないで、 REPEAT 文の
先頭か ら 実行が続行 さ れます。
例
REPEAT 文の使用例を以下に示 し ます。
CREATE PROCEDURE ProcessTrans(IN pAcctNum INTEGER
IN pStartTrans INTEGER,
IN pEndTrans INTEGER )
BEGIN
DECLARE vTransNum INTEGER;
SET vTransNum = pStartTrans;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
317
第 8 章 : SQL 制御文
REPEAT
...;
REPEAT
INSERT INTO trans (trans_num, acct_nbr)
VALUES (vTransNum, pAcctNum);
SET vTransNum = vTransNum + 1;
UNTIL vTransNum > pEndTrans
END REPEAT;
...;
END;
318
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
SET
SET
目的
ス ト ア ド ・ プ ロ シージ ャ 内の ロ ーカル変数ま たはパ ラ メ ー タ に値を割 り 当て ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
SET
assignment_target =
assignment_source
;
YS6SET01
説明
構文要素
指定内容
assignment_target
値を割 り 当て ら れ る 変数ま たはパ ラ メ ー タ の名前。
assignment_source
assignment_target に割 り 当て ら れ る 値。
ANSI 準拠
SET は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
規則
• 副問い合わせを備え た も のを除 く すべての有効な式を、 SET 文割 り 当て ソ ース
内で使用す る こ と がで き ます。
• 割 り 当ての タ ーゲ ッ ト と ソ ース の両方を指定す る 必要があ り ます。
• 割 り 当ての タ ーゲ ッ ト は、 常に SET 式の左側 (LHS) に置 き ます。
• 割 り 当ての ソ ース は、 常に SET 式の右側 (RHS) に置 き ます。
• 割 り 当ての ソ ース のデー タ ・ タ イ プは、 割 り 当ての タ ーゲ ッ ト に指定 さ れてい
る デー タ ・ タ イ プ と 互換性がな ければな り ま せん。 Teradata Database は、 ソ ー
ス のデー タ ・ タ イ プ と タ ーゲ ッ ト のデー タ ・ タ イ プが異な る 場合、 DateTime
デー タ ・ タ イ プについては暗黙的な変換を実行 し ま す。 詳細は、 <SQL 関数、
演算子、 式お よ び述語 > の 「デー タ ・ タ イ プの変換」 を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
319
第 8 章 : SQL 制御文
SET
SET 割 り 当ての
構成要素
有効な構成
無効な構成
割 り 当て タ ーゲ ッ ト
• ロ ーカル変数名
• OUT ま たは INOUT
パラ メ ータ名
• QUERY_BAND 変数名
• ス テー タ ス変数
• FOR ループ列名 と FOR
ループ相関名
• IN パ ラ メ ー タ
割 り 当て ソ ース
以下のいずれかが入っ た文
字列ま たは式
• OUT パ ラ メ ー タ
• ロ ーカル変数
• IN ま たは INOUT パ ラ
メ ータ
• SET 文が FOR 文の有効
範囲内にあ る 場合の FOR
ループ列名お よ び相関名
• 定数式
• ス テー タ ス変数
• UDT に評価す る 式
• SET 文が FOR 文の有効
範囲内にない場合の FOR
ループ列名お よ び相関名
例
以下に示すのは、 SET 文を使用 し て変数お よ びパ ラ メ ー タ に値を割 り 当て る 正 し い
例です。
SET hNoAccts = hNoAccts + 1;
SET hErrorText = 'SQLSTATE:'||sqlstate||
', SQLCODE:'||sqlcode||', ACTIVITY_COUNT:'
||activity_count;
320
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
WHILE
WHILE
目的
指定の条件が真にな る ま で、 文ま たは文の リ ス ト を繰 り 返 し 実行 し ます。
呼び出 し
実行可能形式。
ス ト ア ド ・ プ ロ シージ ャ のみ。
構文
WHILE
conditional_expression
A
DO
label_name :
A
statement
;
END WHILE
label_name
1148B009
statement
SQL_statement
compound statement
assignment statement
condition statement
iteration statement
label_name :
label_name
ITERATE
label_name
LEAVE
label_name
YS6CP01B
compound statement
A
BEGIN
label_name :
local_declaration
cursor_declaration
A
END
condition_handler
statement
;
label_name
1101B383
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
321
第 8 章 : SQL 制御文
WHILE
local_declaration
DECLARE
,
variable_name
data_type
;
DEFAULT
literal
NULL
condition_name
CONDITION
FOR SQLSTATE
sqlstate_code
VALUE
1101A613
cursor_declaration
DECLARE
CURSOR
cursor_name
A
SCROLL
NO SCROLL
B
A
WITHOUT RETURN
WITH RETURN
ONLY
TO
CALLER
CLIENT
B
FOR
;
cursor_specification
FOR
READ ONLY
UPDATE
statement_name
1101A614
cursor_specification
,
SELECT
column_name
A
correlation_name
AS
*
expression
correlation_name
AS
A
FROM
,
table_name
table_name
B
INNER
JOIN
table_name
ON
condition
OUTER
LEFT
RIGHT
FULL
B
WHERE clause
other SELECT clauses
1101B384
322
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
WHILE
condition_handler
DECLARE
HANDLER
CONTINUE
FOR
A
EXIT
,
A
handler_action _statement
sqlstate_code
SQLSTATE
;
VALUE
condition_name
,
SQLEXCEPTION
SQLWARNING
NOT FOUND
1101A563
assignment statement
SET
assignment_target =
assignment_source
1101A380
condition statement
operand_1
CASE
WHEN
WHEN
operand_2
conditional_expression
A
statement ;
THEN
A
END CASE
statement ;
ELSE
IF
statement ;
THEN
conditional_expression
THEN
statement ;
B
B
C
ELSEIF
conditional_expression
THEN
statement ;
END IF
C
ELSE
statement ;
1101B381
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
323
第 8 章 : SQL 制御文
WHILE
iteration statement
conditional_expression
WHILE
statement ;
LOOP
for_loop_variable
FOR
statement ;
DO
END LOOP
AS
A
cursor_name
A
REPEAT
cursor_specification
statement ;
END WHILE
UNTIL
DO
CURSOR FOR
statement ;
conditional_expression
END FOR
END REPEAT
1101B382
説明
構文要素
指定内容
label_name
WHILE 文の任意指定 ラ ベル。
終了 ラ ベルが指定 さ れてい る 場合、 終了 ラ ベル と 同等の開始 ラ ベ
ルを指定す る 必要があ り ます。 開始 ラ ベルは コ ロ ン (:) で終わ っ て
い る 必要があ り ます。
BEGIN…END 複合文の ラ ベル名は繰返 し 文内で再使用で き ません。
入れ子にな っ てい る WHILE 文のグループ内で 1 つの ラ ベル名を再
使用す る こ と はで き ませんが、 入れ子にな っ ていない別の繰返 し
文で再使用す る こ と はで き ます。
conditional_expression
WHILE ループに組み込まれてい る 1 つ以上の文を実行す る か ど う
か を評価す る ために使用 さ れ る ブール条件。
条件 リ ス ト に ロ ーカル変数、 パ ラ メ ー タ 、 ま たはカー ソ ル相関名
が含まれてい る 場合は、 IN お よ び NOT IN 演算子を使用す る こ と
はで き ません。
conditional_expression で OUT パ ラ メ ー タ を使用す る こ と はで き ま
せん。
statement
実行 さ れ る 文の リ ス ト 。
リ ス ト には、 次の よ う な も のが含まれます。
• DML、 DDL、 ま たは DCL 文 ( 動的 SQL も 含む )。
• 制御文、 BEGIN…END を含む。
ANSI への準拠
WHILE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
324
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 8 章 : SQL 制御文
WHILE
規則
• WHILE は ラ ベルで修飾で き ます。
• WHILE 文の中に LEAVE ま たは ITERATE 文を指定で き ます。
詳細は、 「ITERATE」 (304 ページ ) お よ び 「LEAVE」 (308 ページ ) を参照 し て く だ
さ い。
例1
WHILE hCounter > 0
DO
INSERT INTO transaction (trans_num, account_num)
VALUES (hCounter, hAccountNum);
SET hCounter = hCounter - 1;
END WHILE;
例2
WHILE hCounter > 0
DO
SELECT highNum INTO maxNum
FROM limits WHERE LIMIT_TYPE = ’HIGHNUM’;
IF hCounter >= MaxNum THEN
LEAVE LOOP1;
END IF;
INSERT INTO transaction (trans_num, account_num)
VALUES (hCounter, :hAccountNum);
SET hCounter = hCounter - 1;
END WHILE;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
325
第 8 章 : SQL 制御文
WHILE
326
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第9章:
静的埋め込み SQL 文
こ の章では、 宣言お よ び他の各種の静的埋め込み SQL 専用の文につい て説明 し
ま す。
定位置 カ ー ソ ルの文
埋め込み SQL お よ びス ト ア ド ・ プ ロ シージ ャ と 共に使用 さ れ る 以下の文は、 定位
置カー ソ ル と 共に使用 さ れます。 それ ら については、 第 2 章 : 「SQL カー ソ ル」 で
説明 さ れてい ます。
• 「DELETE ( 定位置形式 )」 (63 ページ )
• 「UPDATE ( 定位置形式 )」 (101 ページ )
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
327
第 9 章 : 静的埋め込み SQL 文
BEGIN DECLARE SECTION
BEGIN DECLARE SECTION
目的
C で作成 さ れた ア プ リ ケーシ ョ ン の埋め込み SQL 宣言セ ク シ ョ ン の開始点 を 示
し ま す。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
BEGIN DECLARE SECTION
GW01A001
ANSI への準拠
BEGIN DECLARE SECTION は ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
使用方法
C 言語で記述 さ れた アプ リ ケーシ ョ ンには、 BEGIN DECLARE SECTION 文お よ び
END DECLARE SECTION 文 ( 「END DECLARE SECTION」 (337 ページ ) を参照 ) が
必要です。
COBOL ま たは PL/I のアプ リ ケーシ ョ ンでそのいずれかの文がない場合は、
Preprocessor2 が警告を出 し ます。
こ の宣言セ ク シ ョ ンでは、 全てのホ ス ト 変数を定義 し なければな り ません。
SQL 接頭辞 と 終了子を含む完全な BEGIN DECLARE SECTION 文を、 単一行で指
定す る 必要が あ り ま す。 文の各語を区切 る ために使用で き る のは埋め込み文字だ
けです。
関連 ト ピ ッ ク
「END DECLARE SECTION」 (337 ページ ) を参照 し て く だ さ い。
328
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
COMMENT ( 戻 り 形式 )
COMMENT ( 戻 り 形式 )
目的
オブジ ェ ク ト に属 し てい る コ メ ン ト があれば、 その コ メ ン ト を返 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
COMMENT
object_kind
object_reference
INTO
A
ON
A
host_variable_name
B
:
B
:host_indicator_name
INDICATOR
1101B015
説明
構文要素
指定内容
object_kind
以下のオブジ ェ ク ト のいずれか 1 つ。
• COLUMN
• DATABASE
• FUNCTION
• MACRO
• PROCEDURE
• PROFILE
• ROLE
• TABLE
• TRIGGER
• USER
• VIEW
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
329
第 9 章 : 静的埋め込み SQL 文
COMMENT ( 戻 り 形式 )
構文要素
指定内容
object_reference
以下のオブジ ェ ク ト 参照のいずれか 1 つ。
•
•
•
•
•
•
•
•
•
•
•
host_variable_name
列名
デー タ ベース名
マ ク ロ名
プ ロ シージ ャ 名
プ ロ フ ァ イ ル名
ロ ール名
表名
ト リ ガー名
ユーザー名
ユーザー定義関数名
ビ ュ ー名
コ メ ン ト を配置す る ホ ス ト 変数の名前。
先行 コ ロ ン を使用す る か ど う かは任意ですが、 それは強 く 勧め ら
れてい ます。
コ ロ ン の前後にブ ラ ン ク を入れ る か ど う かは任意です。
名前の規則は、 ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ言語の規則に準拠
し ます。
host_indicator_name
ホ ス ト 標識変数の名前。
ANSI 準拠
COMMENT は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
デー タ を返す COMMENT
戻 り 形式の COMMENT は、 デー タ を返 し ます。
COMMENT の戻 り 形式の規則
• host_variable_name のデータ ・ タ イ プは、 VARCHAR(255) でなければな り ません。
• 指定のオ ブ ジ ェ ク ト に コ メ ン ト が存在 し な い場合は、 host_indicator_name は
ヌ ル を返 し ます。
• COMMENT 文は 1 つのデー タ 値 ( 要す る に、 1 つの列を含んだ 1 つの行 ) だけ を
返 し ま すが、 静的 COMMENT 文で選択カー ソ ル を 使用す る こ と も で き ま す。
そのカー ソ ル用に、 静的選択カー ソ ルの場合 と 同 じ 手順を実行 し て く だ さ い。
330
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
COMMENT ( 戻 り 形式 )
• 動的 COMMENT 文を実行す る 場合は、 デー タ が返 さ れ る ので動的カー ソ ルを使
用す る 必要があ り ます。 その場合は、 動的選択の場合 と 同 じ 手順を実行 し て く
だ さ い。
• COMMENT を カー ソ ル ま たは動的 SQL 文 と 併用す る 場合は、 INTO 句を省略 し
なければな り ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
331
第 9 章 : 静的埋め込み SQL 文
DATABASE
DATABASE
目的
デフ ォ ル ト のデー タ ベース を指定 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
DATABASE
database_name
:database_name_variable
1101B016
説明
構文要素
文で使用す る デー タ ベース名の形式
database_name
SQL 識別子。
database_name_variable
ホ ス ト 変数。
コ ロ ン が必要です。
ANSI への準拠
DATABASE は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
DATABASE の使用上の規則
• database_name ま たは database_name_variable の ど ち ら と し て指定す る に し て も 、
デー タ ベース名は有効な SQL 識別子でなければな り ません。
• database_name_variable 形式を使用す る 場合は、 ク ラ イ ア ン ト 言語の SQL 文字列
の規則に従っ て ホ ス ト 変数を指定す る 必要があ り ます。
• DATABASE の指定内容は、 必ず DATABASE ま たは -db の Preprocessor2 指定内
容 と 一致 し ていなければな り ません。
文 と オプシ ョ ンで同 じ デー タ ベース を指定す る 必要はない も のの、 アプ リ ケー
シ ョ ン ・ プ ロ グ ラ ム内の全ての非修飾オブジ ェ ク ト 参照は、 アプ リ ケーシ ョ ン
実行時に必ず、 プ リ コ ンパ イ ル時に解決 さ れ る オブジ ェ ク ト と 互換性のあ る オ
ブジ ェ ク ト に解決 さ れなければな り ません。
332
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
DATABASE
• 複数のデー タ ベース に存在す る オブジ ェ ク ト を参照す る 場合は、 完全修飾名を
使用す る よ う に し て く だ さ い。 複数のデー タ ベース に同 じ 名前の表やビ ュ ーが
存在 し てい る 場合に、 完全修飾名を使わずにそれ ら のオブジ ェ ク ト を参照す る
と 、 名前解決の問題が発生 し ます。 こ の よ う な名前解決の問題は、 同 じ 名前の
オブジ ェ ク ト 群自体を参照 し ていない場合で も 発生す る こ と があ り ます。
• Preprocessor2 に対 し て TRANSACT(2PC) を指定 し た場合は、 DATABASE が無効
にな り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
333
第 9 章 : 静的埋め込み SQL 文
DECLARE STATEMENT
DECLARE STATEMENT
目的
準備 さ れた動的 SQL 文の識別に使用 さ れ る 名前を宣言 し ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
,
DECLARE
statement_name
STATEMENT
GW01A013
説明
構文要素
指定内容
statement_name
以前に準備 さ れた文に関連付け ら れた名前。
複数の文の名前を宣言す る 場合、 それぞれの名前を コ ン マで区切 る 必
要があ り ます。
ANSI への準拠
DECLARE STATEMENT は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能
です。
許可
な し。
使用方法
DECLARE STATEMENT はプ ロ グ ラ ムの文書化専用です。
334
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
DECLARE TABLE
DECLARE TABLE
目的
アプ リ ケーシ ョ ン内の埋め込み SQL 文で使用 さ れ る 表を宣言 し ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
DECLARE
table_name
A
TABLE
view_name
,
A
( column_name
data_type
)
null_attribute
GW01R014
説明
構文要素
指定内容
table_name
宣言 さ れ る 表の名前を指定 し ます。
ユーザーのプ ロ グ ラ ム内の CREATE TABLE 文で同 じ 名前が使用 さ れ
てい る 場合、 CREATE TABLE 文 と DECLARE TABLE 文の表の記述は
同一でなければな り ません。
view_name
宣言す る ビ ュ ーの名前を指定 し ます。
ユーザーのプ ロ グ ラ ム内の CREATE TABLE 文で同 じ 名前が使用 さ れ
てい る 場合、 CREATE TABLE 文 と DECLARE TABLE 文の表の記述は
同一でなければな り ません。
column_name
表に宣言す る 列 ( 複数可 ) の名前。
data_type
column_name デー タ ・ タ イ プ。
null_attribute
column_name ヌ ル値設定の可否の指定。
null_attribute が NOT NULL の場合、 ヌ ルは許可 さ れず、 デフ ォ ル ト 値
は指定 さ れ ません。
null_attribute が NOT NULL WITH DEFAULT の場合、 ヌルは許可 さ れず、
デフ ォ ル ト 値が指定 さ れます。
null_attribute を指定 し ない と 、 ヌ ルが許可 さ れ ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
335
第 9 章 : 静的埋め込み SQL 文
DECLARE TABLE
ANSI への準拠
DECLARE TABLE は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
使用方法
DECLARE TABLE はプ ロ グ ラ ムの文書化に役立ち ます。 ただ し Preprocessor2 はそ
れを注釈 と し て扱い ます。
Preprocessor2 は構文の検査を行なわず、 以下の も のの順序の認識を除 き 、 フ ィ ール
ド 定義の正 し さ を検査 し ません。
336
1
DECLARE キー ワー ド
2
table_name ま たは view_name の存在
3
TABLE キー ワー ド
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
END DECLARE SECTION
END DECLARE SECTION
目的
C で作成 さ れた ア プ リ ケーシ ョ ン の埋め込み SQL 宣言セ ク シ ョ ン の終了 を 示 し
ま す。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
END DECLARE SECTION
GW01A016
ANSI 準拠
END DECLARE SECTION は ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
使用方法
C 言語で記述 さ れた アプ リ ケーシ ョ ンには、 BEGIN DECLARE SECTION 文お よ び
END DECLARE SECTION 文 ( 「BEGIN DECLARE SECTION」 (328 ページ ) を参照 )
が必要です。
COBOL ま たは PL/I のアプ リ ケーシ ョ ンでそのいずれかの文がない場合は、
Preprocessor2 が警告を出 し ます。
完全な END DECLARE SECTION 文 (SQL 接頭部 と 終了子を含む ) を、 単一行で指
定す る 必要があ り ます。 文の各語を区切 る ために使用で き る のは埋め込み文字だけ
です。
関連 ト ピ ッ ク
「BEGIN DECLARE SECTION」 (328 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
337
第 9 章 : 静的埋め込み SQL 文
END-EXEC 文終了子
END-EXEC 文終了子
目的
埋め込み SQL ク ラ イ ア ン ト の COBOL ア プ リ ケ ーシ ョ ン ・ プ ロ グ ラ ム 内で、
SQL 文を終了 さ せます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
END-EXEC
.
FF07D287
ANSI への準拠
END-EXEC は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
END-EXEC の使用上の規則
•
ク ラ イ ア ン ト の COBOL アプ リ ケーシ ョ ン ・ プ ロ グ ラ ム内に埋め込まれてい る
全ての SQL 文に、 END-EXEC が必要です。
C お よ び PL/I ア プ リ ケーシ ョ ン内に埋め込 ま れた SQL の文終了子は、 セ ミ コ
ロ ン文字です。
• END-EXEC を対話式 SQL 文 と 共に使用す る こ と はで き ません。
関連 ト ピ ッ ク
「EXEC SQL 文先頭子」 (340 ページ ) を参照 し て く だ さ い。
338
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
EXEC
EXEC
目的
SQL マ ク ロ を実行 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
EXEC
macro_name
(parameter_list )
1101B043
説明
構文要素
指定内容
macro_name
実行す る マ ク ロ の名前を指定 し ます。
parameter_list
SQL マ ク ロ ・ パ ラ メ ー タ 。
ANSI への準拠
EXEC は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
EXEC の使用上の規則
• 動的 SQL 文の EXECUTE と 区別す る ため、 こ の文の スペルは、 EXECUTE では
な く 、 EXEC に し なければな り ません 。
• macro_name で指定す る マ ク ロ には、 Teradata SQL 文を 1 つだけ置 く こ と がで き
ます。
• macro_name で指定す る マ ク ロ は、 デー タ を返す こ と はで き ません。
• 次の タ イ プのマ ク ロ を実行す る 場合は、 マ ク ロ ・ カー ソ ルを使用す る 必要があ
り ます。
• 複文
•
デー タ を返す
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
339
第 9 章 : 静的埋め込み SQL 文
EXEC SQL 文先頭子
EXEC SQL 文先頭子
目的
埋め込み SQL アプ リ ケーシ ョ ン内の SQL 文の始ま り を示 し ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
EXEC SQL
embedded_sql_statement
FOR
sql_statement_terminator
count_value
:
1101A396
説明
構文要素
指定内容
FOR
続 く SQL 文に対 し てパ ラ メ ー タ 配列がサポー ト さ れ る こ と を
指定 し ます。 繰 り 返 し サポー ト は、 複数 INSERT のためにの
み提供 さ れ ます。
([:]count_value)
実行 さ れ る 繰 り 返 し の数を指定す る 、 ユーザー定義の
INTEGER ホ ス ト 変数ま たは リ テ ラ ル INTEGER 定数。
embedded_sql_statement
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン ・ プ ロ グ ラ ム に よ り 実行 さ
れ る 埋め込み SQL 文。
sql_statement_terminator
ク ラ イ ア ン ト 言語用の SQL 文終了子。
COBOL の場合、 SQL 文終了子は END-EXEC です。
C お よ び PL/I の場合、 SQL 文終了子はセ ミ コ ロ ン (;) です。
ANSI への準拠
EXEC SQL は ANSI/ISO SQL:2011 準拠であ り 、 拡張機能が追加 さ れてい ます。
許可
な し。
340
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
EXEC SQL 文先頭子
EXEC SQL の使用上の一般規則
以下の規則が EXEC SQL に適用 さ れます。
•
アプ リ ケーシ ョ ン ・ コ ー ド を作成す る ために使用す る 言語に関係な く 、 ク ラ イ
ア ン ト ・ アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムに埋め込まれたそれぞれの SQL 文の前
に EXEC SQL が必要です。
• EXEC SQL 句は、 1 行で コ ーデ ィ ン グす る 必要があ り ます。
• 後続の SQL 文は、 EXEC SQL 句の直後に続け る こ と 、 新 し い行で始め る こ と も
で き ます。
• EXEC SQL を対話式 SQL 文 と 共に使用す る こ と はで き ません。
DML 配列を指定 し た EXEC SQL の使用上の規則
以下の規則は、 FOR 句を使用 し て配列を指定 し た EXEC SQL を使用す る 際に適用
さ れます。
• 繰 り 返 し サポー ト は、 単純な単ーの INSERT 文に対 し てのみ提供 さ れます。
以下の リ ス ト にあ る 、 その他の DML 文はサポー ト さ れません。
• DELETE
•
•
INSERT … SELECT
•
SELECT
•
UPDATE
ホ ス ト 変数ま たは リ テ ラ ル INTEGER 値を使用 し て count_value を指定す る こ と
がで き ます。
•
ホ ス ト 変数パ ラ メ ー タ の配列はすべて一次元でなければな り ません。
配列の配列は C 言語以外ではサポー ト さ れず、 シ ス テ ムは文字列の配列 し かサ
ポー ト し ません。
• count_value を含むホ ス ト 変数は、 使用す る 前にすべて設定 し ておかなければな
り ません。
• SQL ス ト リ ン グに埋め込まれてい る リ テ ラ ル定数は繰 り 返 さ れません。
代わ り に、 挿入 さ れた行ご と に伝搬 さ れます。
• 繰 り 返 し 文の中で使用 さ れてい る ホ ス ト 変数の集合は、 独立 し た並列配列 と し
て扱われます。
Preprocessor2 は、 FOR count_value の値を検査 し 、 それが配列のサ イ ズのいずれ
に対 し て も それ以下であ る か ど う か を判別 し ます。
カ ウ ン ト 値がいずれかの列について配列のサ イ ズ を上回 る 場合、 Preprocessor2
は要求を中断 し てエ ラ ー ・ メ ッ セージ を返 し ます。
• 同 じ ホ ス ト 変数を複数の フ ィ ール ド に指定す る こ と がで き ます。
いずれの繰 り 返 し について も 、 すべての配列に対 し て 1 つの索引 し かないため、
同 じ 値が使用 さ れます。
• ホ ス ト ・ プ ロ グ ラ ム structs の配列への参照はサポー ト さ れてい ません。 サポー
ト さ れ る のは、 変数の配列への参照のみです。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
341
第 9 章 : 静的埋め込み SQL 文
EXEC SQL 文先頭子
例 1: 単純な配列の例
こ れは、 SQL DML 配列を処理す る 単純な例です。 こ こ では、 count_value が
INTEGER リ テ ラ ル値 19 と し て指定 さ れてい ます。
EXEC SQL FOR 19
INSERT INTO table1
VALUES (:var1, :var2, :var3);
例 2: 動的 SQL の配列の例
こ の例では、 C で作成 さ れたプ ロ グ ラ ム内で、 動的 SQL を用いた SQL DML 配列処
理を使用す る 方法を示 し てい ます。 count_value が cNewEmployees と い う 名前のホ ス
ト 変数を使用 し て提供 さ れてい る こ と に注目 し て く だ さ い。
char empname[50][20];
integer empnum[50];
float empsal[50];
intc NewEmployees = 50;
VARCHAR stmtstr[100];
char
*ins001=
“INSERT INTO EMPLOYEE (EMPLOYEE_NUMBER, LAST_NAME, SALARY_AMOUNT)”
“VALUES (?, ?, ?);”;
strcpy(stmtstr.arr,ins001);
stmstr.len = strlen(ins001);
EXEC SQL
PREPARE insStmt FROM :stmtstr;’
EXEC SQL FOR :cNewEmployees
EXECUTE insStmt USING :empnum, :empname, :empsal;
関連 ト ピ ッ ク
「END-EXEC 文終了子」 (338 ページ ) を参照 し て く だ さ い。
342
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
INCLUDE
INCLUDE
目的
外部 ソ ース ・ フ ァ イ ルを アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムに組み入れます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
INCLUDE
include_file_name
1101B044
説明
構文要素
指定内容
include_file_
name
組み込む ソ ース ・ フ ァ イ ルの名前を指定 し ます。
text_name が SQLCA ま たは SQLDA の場合、 特殊な結果が得 ら れます。
INCLUDE SQLCA と INCLUDE SQLDA は INCLUDE の イ ン ス タ ン ス
ではな く 、 別個に定義 さ れてい ます ( 「INCLUDE SQLCA」 (345 ペー
ジ ) と 「INCLUDE SQLDA」 (347 ページ ) を参照 )。
ANSI への準拠
INCLUDE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
343
第 9 章 : 静的埋め込み SQL 文
INCLUDE
INCLUDE の使用上の規則
• Preprocessor2 はデ ィ レ ク ト リ ・ パ ス か ら 、 指定 さ れ た名前 と 言語特有の フ ァ
イ ル拡張子を持つフ ァ イ ルを検索 し ます。
言語
Preprocessor2 が探す INCLUDE フ ァ イ ル ・ タ イ プ
C
pc
COBOL
pb
PL/I
pi
• INCLUDE フ ァ イ ル名の長 さ は最大で 30 バ イ ト ま で可能です。
• INCLUDE 文は事実上、 アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムか ら Preprocessor2 への入
力の中で、 組み込みテ キ ス ト に置 き 換え ら れます。
• INCLUDE 文は入れ子にす る こ と はで き ません。
組み込みテ キ ス ト 内には埋め込み SQL 文を入れ る こ と がで き ます。 ただ し 別の
INCLUDE を入れ る こ と はで き ません。
• 組み込みテ キ ス ト 内に INCLUDE SQLCA と INCLUDE SQLDA 文を指定す る こ と
はで き ます。
344
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
INCLUDE SQLCA
INCLUDE SQLCA
目的
ク ラ イ ア ン ト 埋め込み SQL アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムに SQL 通信領域
(SQLCA) を定義 し ます。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
INCLUDE SQLCA
GW01A021
ANSI への準拠
INCLUDE SQLCA は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
INCLUDE SQLCA の使用上の規則
• Teradata セ ッ シ ョ ン ・ モー ド で操作す る 場合、 埋め込み SQL アプ リ ケーシ ョ ン ・
プ ロ グ ラ ムに SQL 通信領域を正確に 1 つだけ宣言す る 必要があ り ます。
INCLUDE SQLCA 文か、 それ と 同等のユーザーが定義 し た宣言の ど ち ら かを使
用す る こ と がで き ます。
• ANSI セ ッ シ ョ ン ・ モー ド で操作す る 場合、 Preprocessor2 は INCLUDE SQLCA
文にエ ラ ー と し て フ ラ グ を立て ます。
ANSI/ISO SQL では、 SQLSTATE と い う 名前の結果 コ ー ド 変数を明示的に定義す
る 必要があ り ます ( 「SQLSTATE」 (105 ページ ) を参照 )。
ANSI モー ド で操作す る 場合、 エ ラ ー ・ コ ー ド を受け取 る ために SQLCODE 結果
コ ー ド 変数を定義す る こ と も で き ます。
ANSI/ISO SQL では、 SQLCODE はサポー ト さ れな く な り ま し た ( 「SQLCODE」
(108 ページ ) を参照 )。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
345
第 9 章 : 静的埋め込み SQL 文
INCLUDE SQLCA
• EXEC SQL 接頭辞 と 適切な終了子 も 含め、 完全な INCLUDE SQLCA 文を 1 行で
指定 し なければな り ません。
文の各語を区切 る ために使用で き る のは埋め込み文字だけです。
その行に他の文を入れ る こ と はで き ません。
• Preprocessor2 は、 INCLUDE SQLCA 文を SQL 通信領域の適切な言語定義で置 き
換え ます。
• COBOL で作成 さ れたアプ リ ケーシ ョ ンの場合、 SQL 通信領域の宣言を
WORKING STORAGE SECTION に置 く 必要があ り ます。
関連 ト ピ ッ ク
SQL 結果 コ ー ド については、 以下の情報を参照 し て く だ さ い。
• 第 4 章 : 「結果 コ ー ド 変数」
• 付録 C: 「SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)」
• 付録 D: 「SQLSTATE のマ ッ ピ ン グ」
346
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
INCLUDE SQLDA
INCLUDE SQLDA
目的
C ま たは PL/I ア プ リ ケーシ ョ ン ・ プ ロ グ ラ ム に SQL 記述子域 (SQLDA) を定義 し
ま す。
呼び出 し
実行不可プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
INCLUDE SQLDA
GW01A022
ANSI 準拠
INCLUDE SQLDA は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
INCLUDE SQLDA の使用上の規則
• 動的 SQL を使用す る アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムは全て、 INCLUDE SQLDA
文か、 それに相当す る ユーザー提供の SQL 記述子域の宣言の ど ち ら か を必要 と
し ます。
• EXEC SQL 接頭辞 と 適切な終了子 も 含め、 完全な SQLDA 文を 1 行で指定 し なけ
ればな り ません。
文の各語を区切 る ために使用で き る のは埋め込み文字だけです。
その同 じ 行に他の文を入れ る こ と はで き ません。
• Preprocessor2 は、 INCLUDE SQLDA 文を SQL 記述子領域の適切な言語定義で置
き 換え ます。
• PL/I アプ リ ケーシ ョ ン の場合、 SQLDA 宣言は、 1 つの可変 (REFER) 副構成を
持つ基底付 き 構成 と 定義 さ れます。 こ れに よ り 、 SQLDA 宣言は、 複数の SQL
記述子域で使用す る のに適 し た も の と な り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
347
第 9 章 : 静的埋め込み SQL 文
INCLUDE SQLDA
• COBOL アプ リ ケーシ ョ ンの場合、 COBOL はベース と な る 構成を サポー ト し な
いので、 INCLUDE SQLDA 文を使用で き ません。
結果 と し て、 COBOL プ ロ グ ラ ムが 1 つ以上の SQL 記述子領域を必要 と す る 場
合、 ユーザーが自分でそれ ら を コ ーデ ィ ン グ し て、 プ ロ グ ラ ムの WORKING
STORAGE SECTION に挿入す る 必要があ り ます。
関連 ト ピ ッ ク
付録 B: 「SQL 記述子領域 (SQLDA)」 を参照。
348
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
WHENEVER
WHENEVER
目的
例外条件が発生 し た と き に実行 さ れ る ア ク シ ョ ン を指定 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
WHENEVER
condition
action
GW01R035
説明
構文要素
指定内容
condition
指定 さ れた ア ク シ ョ ン が実行 さ れ る 条件の タ イ プ を示すス テー タ ス ・
キー ワ ー ド 。
有効な condition キー ワー ド と その定義を次の表に リ ス ト し ます。
それぞれのキー ワー ド の後に、 条件が発生 し た場合の変数 SQLCODE
お よ び SQLSTATE の値の定義を示 し ます。
• SQLERROR が、 SQL エ ラ ーが発生す る 条件の場合 :
• SQLCODE の値 : <0
• SQLSTATE については、 「SQLSTATE」 (105 ページ ) を参照 し て
く だ さ い。
• NOT FOUND が、 デー タ が見つか ら ない と き の条件の場合 :
• SQLCODE の値 : +100
• SQLSTATE の値 : 02xxx
「SQLSTATE」 (105 ページ ) を参照。
• SQLWARNING が、 SQL 警告が生 じ る 条件の場合 (SQLWARNING
は非 ANSI の Teradata 拡張機能です ):
• SQLCODE の値 : +100 以外の正の値
• SQLSTATE は定義 さ れ ません。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
349
第 9 章 : 静的埋め込み SQL 文
WHENEVER
構文要素
指定内容
action
条件が発生 し た場合に実行 さ れ る ア ク シ ョ ン。
有効な ア ク シ ョ ンは以下の と お り です。
• CONTINUE
• GO TO : host_label
• GOTO : host_label
• PERFORM code
• CALL function_call
説明
• :host_label は、 ク ラ イ ア ン ト 言語 GO TO 文の有効な タ ーゲ ッ ト を指
定 し ます。 先行 コ ロ ンは強 く 勧め ら れてい ます。
• code は、 例外条件が発生 し た場合に実行 さ れ る アプ リ ケーシ ョ ンの
セ ク シ ョ ン ま たはパ ラ グ ラ フ の名前を指定 し ます。 PERFORM ア ク
シ ョ ンは COBOL でのみ有効です。
• function_call は、 例外条件が発生 し た場合に呼び出 さ れ る 関数を指
定 し ます。
ANSI への準拠
WHENEVER は、 ANSI/ISO SQL:2011 準拠であ り 、 拡張機能が追加 さ れてい ます。
許可
な し。
規則
• プ リ コ ンパ イ ラ SQLFLAGGER オプシ ョ ン を ENTRY に設定す る と 、
WHENEVER SQLWARNING に よ っ てプ リ コ ンパ イ ラ 警告が発生 し ます。
• GO TO のオブジ ェ ク ト の規則は、 言語に よ っ て異な り ます。 詳細は <Teradata
PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照 し て く だ さ い。
• 初期の暗黙的例外宣言 と し て、 常に CONTINUE が宣言 さ れます。
• プ ロ グ ラ ム ・ テ キ ス ト の例外宣言の後に SQL 文が続 き 、 し か も 同 じ 例外条件に
対 し て他の例外宣言が介入 し ない場合に限っ て、 例外宣言はその特定の SQL 文
に適用 さ れます。
350
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 9 章 : 静的埋め込み SQL 文
WHENEVER
例外条件が当ては ま
る 場合のア ク シ ョ ン
アプ リ ケーシ ョ ン ・ プ ロ グ ラ ム の実行が続行 さ れ る 場所
CONTINUE
次の命令。
例外条件は無視 さ れ ます。
GOTO
指定 さ れた タ ーゲ ッ ト の場所。
host_label を指定す る 際、 タ ーゲ ッ ト を示す ク ラ イ ア ン ト 言語
の GO TO 文が、 例外宣言の適用 さ れ る 全ての SQL 文において
有効にな る よ う にす る 必要があ り ます。
CALL
指定 さ れたサブプ ロ グ ラ ムが実行 さ れ ( 呼び出 さ れ )、 呼び出し
側プ ロ グ ラ ムに制御が戻 さ れた後、 次の命令が実行 さ れます。
対応す る ク ラ イ ア ン ト 文 (COBOL お よ び PL/I の場合は CALL
関数、 C の場合は関数呼び出 し ) は、 例外宣言が適用 さ れ る 全
ての SQL 文において有効でなければな り ません。
PERFORM
指定 さ れた 1 つま たは複数の COBOL パ ラ グ ラ フ ま たはセ ク
シ ョ ンが実行 さ れた後の次の命令。
対応す る COBOL 文 (PERFORM コ ー ド ) は、 例外宣言が適用 さ
れ る 全ての SQL 文において有効でなければな り ません。
• 次の SQLCODE 定義が適用 さ れます。
SQL 文の実行後の SQLCODE の値
当ては ま る 例外条件
任意の負の数
SQLERROR
+100 以外の正の値
SQLWARNING
+100
NOT FOUND
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
351
第 9 章 : 静的埋め込み SQL 文
WHENEVER
352
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 :
動的埋め込み SQL 文
動的 SQL は、 対話的ユーザーが埋め込み SQL ま たは ス ト ア ド ・ プ ロ シージ ャ を使
用 し て記述 さ れた アプ リ ケーシ ョ ンに、 SQL 文を動的に実行す る こ と を可能にす る
機能です。
動的 SQL と 対比す る と き 、 通常の SQL が提供す る 機能は静的 SQL と 呼ばれ る 場合
も あ り ます。 詳細は、 「第 9 章 : 静的埋め込み SQL 文」 (327 ページ ) を参照 し て く
だ さ い。
注意 :
動的 SQL は処理のオーバーヘ ッ ド が非常に大 き く 、 シ ス テ ム ・ パフ ォーマ ン ス を
低下 さ せ る こ と が多いので、 可能であれば常に静的 SQL を使用 し て く だ さ い。
動的 SQL の使用
動的 SQL は、 ア プ リ ケーシ ョ ン が実行時に必要 と す る SQL 文の全部 ま たは一部
について、 不明な部分があ る 場合に役立ち ます。
例
た と えば動的 SQL は、 ユーザーが 1 つ以上の式を セルに対話的に入力す る 、 ス プ
レ ッ ド シー ト に基づ く アプ リ ケーシ ョ ン な ど に役立ち ます。
こ れ ら の式はその後、 ス プ レ ッ ド シー ト の各式に よ っ て指定 さ れた計算を行な う た
めに必要な SQL 文に変換 さ れます。
ユーザーが入力す る 特定の式をサポー ト す る ために ど の SQL 文が必要 と な る かは
事前に分か ら ないので、 動的 SQL 機能を使用す る アプ リ ケーシ ョ ン を コ ーデ ィ ン
グ し て、 ス プ レ ッ ド シー ト の動的な要件を サポー ト す る 必要があ り ます。
SQL 文の動的な実行
以下の表に示 さ れてい る よ う に、 準備形式ま たは即時形式のいずれかで SQL 文を
動的に実行す る こ と がで き ます。
注 : ス ト ア ド ・ プ ロ シージ ャ がサポー ト す る のは、 即時形式の動的 SQL だけです。
「ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用」 (141 ページ ) を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
353
第 10 章 : 動的埋め込み SQL 文
動的 SQL 文の構文
動的 SQL 文
のタ イプ
準備
説明
有効な文のテ キ ス ト が準備 さ れてセ ッ シ ョ ンの期間中保存 さ れ、 アプ リ
ケーシ ョ ンの必要に応 じ てその文を何回で も 実行で き ます。
埋め込み SQL 用に静的 SQL を コ ンパ イ ルお よ び前処理す る 際に必要な
オーバーヘ ッ ド と 類似 し たオーバーヘ ッ ド が、 SQL 文を準備す る 際に も
必要 と な り ます。
埋め込み SQL アプ リ ケーシ ョ ン で動的 SQL 文を準備す る 方法について
の詳細は、 「EXECUTE ( 動的 SQL 形式 )」 (358 ページ ) お よ び
「PREPARE」 (362 ページ ) を参照 し て く だ さ い。
即時
有効な文のテ キ ス ト が 1 回だけ実行 さ れ ます。
アプ リ ケーシ ョ ン で文を複数回実行す る 必要があ る 場合、 その文を毎回
準備 し て実行す る ためのオーバーヘ ッ ド を負わなければな り ません。
埋め込み SQL アプ リ ケーシ ョ ン で動的 SQL 文を即座に準備 し て実行す
る 方法についての詳細は、 「EXECUTE IMMEDIATE」 (360 ページ ) を参
照 し て く だ さ い。
動的 SQL 文の構文
動的 SQL に固有の以下の SQL 文については、 続 く 項で説明 し てい ます。
• 「DESCRIBE」 (355 ページ )
• 「EXECUTE ( 動的 SQL 形式 )」 (358 ページ )
• 「EXECUTE IMMEDIATE」 (360 ページ )
• 「PREPARE」 (362 ページ )
さ ら に、 動的 SQL に特有の DECLARE CURSOR の形式 も あ り ます ( 「DECLARE
CURSOR ( 動的 SQL 形式 )」 (46 ページ ) を参照 )。
こ れ ら の文は埋め込み SQL に よ っ てのみ使用 さ れます。 ス ト ア ド ・ プ ロ シージ ャ
も 動的 SQL を サポー ト し てい ま すが、 その方法は埋め込み SQL の場合 と は ま っ
た く 異な っ てい ま す。 詳細は、 「ス ト ア ド ・ プ ロ シージ ャ での動的 SQL の使用」
(141 ページ ) を参照。
354
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 : 動的埋め込み SQL 文
DESCRIBE
DESCRIBE
目的
前に準備 さ れてい る動的 SQL 文が実行 さ れる と き に返 さ れるデータ に関する情報を
取得 し ます。
呼び出 し
実行可能形式。
動的 SQL。
埋め込み SQL のみ。
構文
DESCRIBE
statement_name
A
INTO
:
A
B
descriptor_area
USING
NAMES
ANY
BOTH
LABELS
B
FOR STATEMENT
statement_number
statement_number_variable
:
1101B017
説明
構文要素
指定内容
statement_name
以前に準備 さ れた文に関連付け ら れた名前。 有効な SQL 識
別子。 単一引用符で囲みません。
descriptor_area
前に準備 さ れてい る 文が実行 さ れ る と き に返 さ れ る デー タ
に関す る 情報を受け取 る 領域。
SQLDA を識別 し なければな り ません。
C プ ロ グ ラ ム内で descriptor_area を名前 と し て指定す る か、
SQLDA がポ イ ン タ と し て宣言 さ れてい る と き は、 ポ イ ン タ
参照 (*sqldaname) と し て指定 し ます。
詳細は <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・
ガ イ ド > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
355
第 10 章 : 動的埋め込み SQL 文
DESCRIBE
構文要素
指定内容
statement_number
情報を求め る 要求内の文番号。
有効な整数値 リ テ ラ ルでなければな り ません。
statement_number_variable
情報を求め る 要求内の文番号。
INTEGER ま たは SMALLINT 型のホ ス ト 変数を識別す る 必
要があ り ます。
ANSI 準拠
DESCRIBE は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
DESCRIBE は、 ANSI/ISO SQL:2011 の文の DESCRIBE INPUT お よ び DESCRIBE
OUTPUT と 同様に機能 し ます。
許可
な し。
一般規則
• SQLDA が定義 さ れてい る 必要があ り ます。
• statement_name で指定 さ れ る 文が、 同 じ ト ラ ンザ ク シ ョ ン内で準備 さ れていなけ
ればな り ません。
• 準備 さ れた文がデー タ を返 さ ない文であ る 場合、 準備 さ れた文がデー タ を返 さ
ない文であ る と い う 確認以外には、 有用な情報は得 ら れません。
• DESCRIBE その も のを動的 SQL 文 と し て実行す る こ と はで き ません。
USING 句の規則
指定す る USING
の形式
列
NAMES
SQLDA の SQLNAME フ ィ ール ド に タ イ ト ルが置かれます。
USING 句が指定 さ れていない場合 も その よ う にな り ます。
LABELS
SQLDA の SQLNAME フ ィ ール ド に タ イ ト ルが置かれます。
選択 リ ス ト で列に対 し て TITLE 句が指定 さ れ る 場合、 その タ イ ト ル
が返 さ れ ます。
CREATE TABLE 時に TITLE を付けて列が定義 さ れ、 SELECT 文で
タ イ ト ルが指定 さ れない場合には、 CREATE TABLE 文に指定 し た
タ イ ト ルが返 さ れ ます。
ど ち ら も ない場合は、 デフ ォ ル ト の タ イ ト ル ( 列名 ) が返 さ れます。
356
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 : 動的埋め込み SQL 文
DESCRIBE
指定す る USING
の形式
列
BOTH
SQLDA の SQLNAME フ ィ ール ド に名前 と タ イ ト ルが置かれます。
こ の場合、 以下の よ う に、 SQLVAR 配列には列ご と に 2 つの要素
(2 * n 個の要素 ) が必要です。
1 要素の最初のセ ッ ト には名前お よ び列情報が含ま れ ます。
2 2 番目のセ ッ ト には列の タ イ ト ルが含まれ ます。
ANY
SQLDA の SQLNAME フ ィ ール ド に タ イ ト ル ま た は名前が置かれ
ま す。
列に タ イ ト ルがあ る 場合、 その タ イ ト ルが SQLNAME フ ィ ール ド に
置かれ ます。
列に タ イ ト ルが な い場合、 列名が SQLNAME フ ィ ール ド に置か
れ ま す。
FOR STATEMENT 句の規則
• FOR STATEMENT 句は動的な複文要求をサポー ト す る ための も のですが、 単一
文要求に使用す る こ と も で き ます。
• FOR STATEMENT 句 を 指定 し な い場合、 準備 さ れ た動的 SQL 要求の最初の
( ま たは唯一の )SQL 文についての記述情報が返 さ れます。
• FOR STATEMENT 句を指定す る 場合、 準備 さ れた動的 SQL 要求 ( 句の整数値オ
ペ ラ ン ド に よ っ て識別 さ れ る ) の SQL 文の記述情報が返 さ れます。
その よ う な文がない場合 ( た と えば、 FOR STATEMENT 3 が コ ー ド 化 さ れ、 要求
に文が 2 つだけ し かない場合 )、 -504 と い う 値が SQLCODE に返 さ れ、 情報は返
さ れません。
関連 ト ピ ッ ク
詳細は、 以下の文を参照 し て く だ さ い。
• 「EXECUTE ( 動的 SQL 形式 )」 (358 ページ )
• 「EXECUTE IMMEDIATE」 (360 ページ )
• 「PREPARE」 (362 ページ )
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
357
第 10 章 : 動的埋め込み SQL 文
EXECUTE ( 動的 SQL 形式 )
EXECUTE ( 動的 SQL 形式 )
目的
準備 さ れた動的 SQL 文を実行 し ます。
呼び出 し
実行可能形式。
動的 SQL 文。
埋め込み SQL のみ。
構文
EXECUTE
A
statement_name
A
,
USING
host_variable_name
:
:host_indicator_name
INDICATOR
USING DESCRIPTOR
descriptor_area
:
GW01A017
説明
構文要素
指定内容
statement_name
以前に準備 さ れた文に関連付け ら れた名前。
host_variable_name
準備 さ れた文の入力デー タ と し て使用 さ れ る 変数。
名前の前に コ ロ ン を付け る か ど う かは任意指定です。
host_indicator_name
標識変数の値。
名前の前の コ ロ ンは必須です。
descriptor_area
SQL 記述子域 (SQLDA)。
SQLDA 構造がポ イ ン タ と し て宣言 さ れてい る 場合、
descriptor_area を名前ま たはポ イ ン タ 参照 (*sqldaname)
と し て C プ ロ グ ラ ム に コ ーデ ィ ン グで き ます。
詳細は、 付録 B: 「SQL 記述子領域 (SQLDA)」 を参照 し て く だ さ い。
358
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 : 動的埋め込み SQL 文
EXECUTE ( 動的 SQL 形式 )
ANSI への準拠
動的 SQL 形式の EXECUTE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
必要な権限は、 SQL 文お よ びア ク セ ス対象の表に よ っ て決ま り ます。
一般規則
•
アプ リ ケーシ ョ ンに SQLDA が定義 さ れていなければな り ません。
• statement_name で指定 さ れ る 文は、 同 じ ト ラ ンザ ク シ ョ ン内ですでに準備が完了
し ていなければな り ません。
• SQLCA は、 ス ト ア ド ・ プ ロ シージ ャ と 同時に使用す る こ と はで き ません。
•
デー タ を返す文
•
マク ロ
•
複文要求
こ れ ら の場合は、 動的カー ソ ルを宣言 し 、 アプ リ ケーシ ョ ン ・ プ ロ グ ラ ム
で適切な FETCH 文を使用 し てその結果にア ク セ スす る 必要があ り ます
( 「FETCH ( 埋め込み SQL 形式 )」 (69 ページ ) を参照 )。
• DESCRIBE その も のを動的 SQL 文 と し て実行す る こ と はで き ません。
USING 句の規則
• USING 句は、 statement_name に よ っ て指定 さ れ る SQL 文への入力 と し て使用 さ
れ る 変数を識別 し ます。
• EXECUTE 文に先立っ て宣言 さ れ、 入力変数 と し て使用 さ れ る 指定 さ れた ホ ス ト
変数名は、 有効な ク ラ イ ア ン ト 言語の変数でなければな り ません。 ク ラ イ ア ン
ト 構造を入力変数の識別に使用す る こ と がで き ます。
指定す る 変数の数は、 識別 さ れ る 文におけ る パ ラ メ ー タ ・ マーカー ( 疑問符、 ?)
の数 と 同 じ でなければな り ません。 n 番目の変数は n 番目のマーカーに対応 し て
いなければな り ません。
• 記述子の名前は、 アプ リ ケーシ ョ ンに よ っ てすでに定義 さ れてい る 入力 SQLDA
構造を識別 し ます。 こ の SQLDA には、 入力変数セ ッ ト に関す る 全ての必要な情
報が含まれてい ます。
SQLDA の SQLD フ ィ ール ド で指定 さ れ る 変数の数は、 識別 さ れ る 文のパ ラ メ ー
タ ・ マーカー ( 疑問符、 ?) と 同 じ でなければな り ません。 SQLDA に よ っ て記述
さ れ る n 番目の変数は n 番目のマーカーに対応 し ていなければな り ません。
関連 ト ピ ッ ク
詳細は、 以下の文を参照 し て く だ さ い。
• 「DESCRIBE」 (355 ページ )
• 「EXECUTE IMMEDIATE」 (360 ページ )
• 「PREPARE」 (362 ページ )
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
359
第 10 章 : 動的埋め込み SQL 文
EXECUTE IMMEDIATE
EXECUTE IMMEDIATE
目的
動的 SQL 文を準備 し て実行 し ます。
呼び出 し
実行可能形式。
動的 SQL 文。
埋め込み SQL のみ。
構文
EXECUTE IMMEDIATE
statement_string
statement_string_variable
:
1101B018
説明
構文要素
指定内容
statement_string
文字列式 と し ての動的 SQL 文のテ キ ス ト 。
statement_string_variable
ホ ス ト 変数 と し ての動的 SQL 文のテ キ ス ト 。
先行 コ ロ ン文字を使用す る よ う に強 く お勧め し ます。
ANSI への準拠
EXECUTE IMMEDIATE は ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
必要な権限は、 SQL 文お よ びア ク セ ス対象の表に よ っ て決ま り ます。
規則
• 列式ま たはホ ス ト 変数の ど ち ら と し て指定す る 場合 も 、 動的 SQL 文の長 さ は
32000 文字ま で可能です。
• ホ ス ト 変数 と し て指定す る 場合、 statement_string_variable は、 以下の表に示す
ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ言語の SQL 文字列の規則に従 う 必要があ り ます。
360
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 : 動的埋め込み SQL 文
EXECUTE IMMEDIATE
言語
statement_string の形式
COBOL
非数値 リ テ ラ ル
C
PL/I
文字列式
• 文字列変数が VARCHAR であ る 場合、 文のテ キ ス ト は最大 64K にで き る 。
• 動的 SQL 文は単一の SQL 文でなければな ら ず、 複文要求であ っ てはな り ません。
• EXECUTE IMMEDIATE を実行す る こ と は、 無名の動的で単一の文 ( マ ク ロ では
な く デー タ を返 さ ない も の ) を PREPARE し 、 続いて EXECUTE す る の と 同 じ こ
と です。
EXECUTE IMMEDIATE は、 こ の よ う な特殊ケース に備え て設計 さ れてい ます。
• 動的 SQL の説明 :
• 以下の ど の SQL 文にす る こ と も で き ません。
ABORT
EXECUTE IMMEDIATE
BEGIN TRANSACTION
FETCH
CHECKPOINT
LOGOFF
CLOSE
LOGON
COMMIT
OPEN
CONNECT
POSITION
DESCRIBE
PREPARE
ECHO
REWIND
END TRANSACTION
ROLLBACK
EXECUTE
•
•
デー タ を返す文にす る こ と はで き ません。
Preprocessor2 宣言にす る こ と はで き ません。
•
ホ ス ト 変数参照を組み込む こ と はで き ません。
•
動的に実行 さ れ る と き に、 動的カー ソ ルを必要 と し ます。
関連 ト ピ ッ ク
詳細は、 以下の文を参照 し て く だ さ い。
• 「DESCRIBE」 (355 ページ )
• 「EXECUTE ( 動的 SQL 形式 )」 (358 ページ )
• 「PREPARE」 (362 ページ )
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
361
第 10 章 : 動的埋め込み SQL 文
PREPARE
PREPARE
目的
動的 SQL 文を実行用に準備 し 、 こ れに名前を割 り 当て ます。
呼び出 し
実行可能形式。
動的 SQL。
埋め込み SQL のみ。
構文
PREPARE
A1
statement_name
descriptor_area
INTO
A2
:
A1
B
A2
USING
NAMES
FOR STATEMENT
statement_number
numeric_variable
ANY
:
BOTH
LABELS
B
FROM
statement_string
statement_string_variable
:
1101B029
説明
構文要素
指定内容
statement_name
準備す る 文に関連付け る 名前。
statement_name は有効な SQL 識別子でな く てはな ら ず、 単一
引用符で囲んではな り ません。
descriptor_area
準備 さ れた文が実行 さ れた と き に、 返 さ れたデー タ に関す る
記述情報を受け取 る ための SQLDA を指定 し ます。
SQLDA 構造がポ イ ン タ と し て宣言 さ れてい る 場合、
descriptor_area を名前ま たはポ イ ン タ 参照 (*sqldaname) と し て
C プ ロ グ ラ ムに指定で き ます。
statement_string
文字列表現に よ る 、 SQL 文のテ キ ス ト 。
statement_string_variable
ホ ス ト 変数の形の動的 SQL 文のテ キ ス ト 。
statement_string_variable の前に コ ロ ン を付け る か ど う かは任意
指定です。
362
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 : 動的埋め込み SQL 文
PREPARE
構文要素
指定内容
statement_number
記述情報を要求す る 対象 と な る 要求の中での文の番号を識別
す る 有効な整数 リ テ ラ ル。
numeric_variable
記述情報を要求す る 対象 と な る 要求の中での文番号を表わす、
INTEGER ま たは SMALLINT 型のホ ス ト 変数。
先行 コ ロ ン を使用す る か ど う かは任意指定です。
ANSI への準拠
PREPARE は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
SQL 文の準備
こ こ で定義 し た構文要素を使 う と 、 プ ロ セ ス は以下の よ う にな り ます。
1
変数 statement_string を、 ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンの言語で宣言 し ます。
2
statement_string を、 実行す る SQL 文の リ テ ラ ル文字テ キ ス ト と し て定義 し ます
( ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンの言語で )。
3
ホ ス ト 定数 statement_string を SQL 変数 statement_name と し て定義 し 、 SQL 内か
ら PREPARE 文を実行 し ます。
PREPARE に よ っ て、 ソ ース ・ コ ー ド を statement_name か ら 実行可能オブジ ェ ク
ト ・ コ ー ド に コ ンパ イ ル し ます。
4
statement_name に対 し て EXECUTE ま たは EXECUTE IMMEDIATE を 実行 し
ま す。
5
デー タ ベース ・ ソ フ ト ウ ェ アが、 戻 り コ ー ド を SQLCODE お よ び SQLSTATE に
通知 し ます。
規則
• 動的 SQL を使用す る と き には、 必ず SQLDA を定義 し なければな り ません。
• statement_name は、 18 文字を超え てはな り ません。
• 列式 と し て指定す る か、 ま たはホ ス ト 変数 と し て指定す る かにかかわ ら ず、 動
的 SQL 文は最大で 32 キ ロ バ イ ト ま での長 さ にす る こ と がで き ます (SQL テ キ ス
ト 、 USING デー タ 、 お よ びパーセル ・ オーバーヘ ッ ド を含めて )。
• ホ ス ト 変数 と し て指定す る 場合、 その ス テー ト メ ン ト 文字列は、 ク ラ イ ア ン
ト ・ プ ロ グ ラ ミ ン グ言語用の SQL 文字列の規則に従 う 必要が あ り ま す。 詳細
は <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照 し て く だ
さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
363
第 10 章 : 動的埋め込み SQL 文
PREPARE
言語
statement_string の形式
COBOL
非数値 リ テ ラ ル
C
PL/I
文字列式
• statement_string 内の動的 SQL 文のテ キ ス ト は、 以下の よ う にな り ます。
• 単文要求ま たは複文要求のいずれ も 可能
•
EXEC 文を組み込む こ と がで き る
•
デー タ を戻す文を組み込む こ と がで き る
• 文字列変数が varchar であ る 場合、 文のテ キ ス ト は最大 64K にで き る
• 動的 SQL 文に不可であ る こ と の説明 :
• 以下のいずれの SQL 文 も 指定す る こ と はで き ません。
ABORT
EXECUTE IMMEDIATE
BEGIN TRANSACTION
FETCH
CHECKPOINT
LOGOFF
CLOSE
LOGON
COMMIT
OPEN
CONNECT
POSITION
DESCRIBE
PREPARE
ECHO
REWIND
END TRANSACTION
ROLLBACK
EXECUTE
•
Preprocessor2 宣言にはで き ません。
• 動的 SQL 文に はパ ラ メ ー タ ・ マ ー カ ー ま た は プ レ ー ス ホ ル ダ ー ・ ト ー ク ン
( 疑問符 ) を使用す る こ と がで き 、 こ こ では任意の定数 ( 特にホ ス ト 変数 ) 参照
が有効です。
OPEN 文および EXECUTE 文の USING 句に よ っ て、 値がその文に提供 さ れます。
• プ レース ホルダーには、 型付 き 、 お よ び型な し があ り ます。
• 型付 き プ レース ホルダーの場合、 デー タ ・ タ イ プが明示的にキ ャ ス ト さ れま
す。 た と えば、 以下の UPDATE 文では、 part_no が型付 き プ レース ホルダー
です。
UPDATE parts
SET part_no = (CAST(? AS INTEGER))
WHERE vendor_no = ?;
こ のア ク シ ョ ンに よ っ て、 変数のデー タ ・ タ イ プは、 実行時にプ レース ホル
ダーにキ ャ ス ト さ れ る タ イ プか、 ま たはその タ イ プに変換で き る タ イ プに設
定 さ れます。
364
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 10 章 : 動的埋め込み SQL 文
PREPARE
•
型な し プ レース ホルダーのデー タ ・ タ イ プは、 文脈に よ っ て決定 さ れます。
た と えば、 以下の文では、 WHERE 句内の型な し プ レース ホルダーの タ イ プ
は vendor_no の タ イ プ と 同 じ です。
UPDATE parts
SET part_no = (CAST(? AS INTEGER)
WHERE vendor_no = ?;
• CASE 式で THEN/ELSE 句の結果 と し てプ レース ホルダーを使用で き る のは、
CASE 式内の少な く と も 他の 1 つの結果がプ レース ホルダーで も NULL キー
ワー ド で も ない場合に限 り ます。
• 以下の よ う な タ イ プな し プ レース ホルダーの使用方法は無効です。
•
単項演算子のオペ ラ ン ド と し ての使用
た と えば、 + ? は無効です。
•
2 項演算子の両方のオペ ラ ン ド と し ての使用
例えば、 ?+ ? は無効です。
•
比較演算子の両方のオペ ラ ン ド と し ての使用
た と えば、 以下の SELECT 文は無効です。
SELECT *
FROM table_name
WHERE ?= ?
いずれかのプ レース ホルダーを 0+ で置 き 換え る と 、 その よ う な値の も と で
はデー タ ・ タ イ プが数値であ る こ と が文脈に よ っ て明確に判別で き る ので、
比較は有効にな り ます。
同様に、 比較において、 対応す る 2 つの フ ィ ール ド を表わす よ う にプ レース
ホルダーを使用す る こ と はで き ません。
た と えば、 以下の よ う な場合、 それぞれの対の最初の値の タ イ プが
PREPARE 時点で文脈か ら 判別で き ず、 不明で あ る た め、 こ の比較は無効
です。
(?,X) > (?,Y)
ただ し 、 以下の比較は有効です。 こ れは、 PREPARE 時に文脈か ら タ イ プ を
判別で き る ためです。
(?,X) > (Y,?)
•
POSITION 関数の両方のオペ ラ ン ド と し ての使用
•
UPPER 関数の唯一のオペ ラ ン ド と し ての使用
•
LOWER 関数の唯一のオペ ラ ン ド と し ての使用
•
•
TRIM 関数の 2 番目、 ま たは 3 番目のオペ ラ ン ド と し ての使用
EXTRACT 関数の FROM オペ ラ ン ド と し ての使用
•
TRANSLATE 関数の最初のオペ ラ ン ド と し ての使用
•
•
いずれかの集合関数の引数 と し ての使用
IS [NOT] NULL の左側のオペ ラ ン ド のいずれかの構成要素 と し ての使用
•
OVERLAPS 比較の ど ち ら かのオペ ラ ン ド の 2 番目の構成要素 と し ての使用
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
365
第 10 章 : 動的埋め込み SQL 文
PREPARE
•
単独の項目選択式 と し ての使用
た と えば、 以下の SELECT は無効です。
SELECT ?AS alias_name
FROM table_name;
ただ し 、 以下の SELECT 文は有効です。 こ れは、 SELECT リ ス ト 内の式全
体 と し てではな く 、 式の一部 と し てプ レ ー ス ホルダーが使用 さ れてい る た
めです。
SELECT 0 + ?AS alias_name
FROM table_name;
• INTO 句 ( お よ びオプシ ョ ンの USING 句 ) を含む PREPARE 文を実行す る と い う
こ と は、 以下の操作 と 厳密に同等です。
• INTO 句お よ び USING 句を使わずに PREPARE 文を実行す る こ と
•
INTO 句お よ び USING 句を使っ て準備済みの文に対 し て DESCRIBE 文を実
行す る こ と
• PREPARE 文の INTO 句、 USING 句、 お よ び FOR STATEMENT 句の詳 し い規則
については、 「DESCRIBE」 (355 ページ ) を参照 し て く だ さ い。
• PREPARE を動的 SQL 文 と し て実行す る こ と はで き ません。
関連 ト ピ ッ ク
詳細は、 以下の文を参照 し て く だ さ い。
• 「DESCRIBE」 (355 ページ )
• 「EXECUTE ( 動的 SQL 形式 )」 (358 ページ )
• 「EXECUTE IMMEDIATE」 (360 ページ )
• 「PREPARE」 (87 ページ )
366
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 :
ク ラ イ ア ン ト - サーバー接続文
こ の章では、 埋め込み SQL 文を実行す る ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン ・ プ ロ
グ ラ ム と Teradata Database ( サーバー と し ての位置づけ も 可能 ) と の間の接続を、
実行お よ び保守す る ための文について説明 し ます。
こ の章で説明 さ れてい る すべての SQL 文は、 埋め込み SQL アプ リ ケーシ ョ ンだけ
で使用 さ れ る も のです。 それ ら は対話的に使用す る こ と はで き ません。
ク ラ イ ア ン ト ・ ア プ リ ケーシ ョ ン か ら Teradata Database
への接続
ク ラ イ ア ン ト ・ シ ス テ ム上で実行す る Teradata 埋め込 SQL プ リ プ ロ セ ッ サは、
Teradata Database への接続を確立す る こ と が必要です。 接続は、 プ リ コ ンパ イ ル時
お よ び実行時の両方で必要です。
プ リ コ ンパ イ ル時に確立 さ れ る Teradata Database へのプ リ プ ロ セ ッ サ接続 と 、 実行
時にアプ リ ケーシ ョ ンに よ っ て確立 さ れ る 接続 と の間には関連はあ り ません。 それ
ら は別々の イ ベン ト です。
ホ ス ト ・ アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムの SQL 内に埋め込まれた LOGON お よ び
CONNECT 文は、 プ リ プ ロ セ ッ サ接続に対 し ては影響があ り ません。
プ リ プ ロ セ ッ サ接続
プ リ プ ロ セ ッ サは、 アプ リ ケーシ ョ ンに対 し て、 Teradata Database に接続 し な く て
も 実行す る こ と がで き ます。
SQLCHECK ま たは -sc オプ
シ ョ ン を以下の よ う に指定
プ リ プロセッサ
NOSYNTAX
Teradata Database への接続を必要 と し ません。
• FULL ( ま たは FULL をデフ ォ ル ト と
し て使用 )
• SQLFLAGGER(ENTRY)
Teradata Database への接続を必要 と し ます。
Teradata Database へのプ リ プ ロ セ ッ サ接続は、 tdpid ま たは -t、 お よ び userid ま たは
-u プ リ プ ロ セ ッ サ ・ オプシ ョ ン を使用 し て確立す る こ と がで き ます。
ユーザー ID を指定せず、 プ リ プ ロ セ ッ サが IBM メ イ ン フ レーム環境で実行 し てい
る 場合は、 暗黙の接続が試行 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
367
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン か ら Teradata Database への接続
注 : メ イ ン フ レーム ・ バージ ョ ン場合、 メ イ ン フ レーム上で少な く と も 1 つの
TDP が起動 し ていなければ、 た と えデー タ へのア ク セ ス が不要の場合 ( つま り
NOSYNTAX) で も Preprocessor2 は機能 し ません。 メ イ ン フ レーム上で TDP が起動
し ていない状態でプ リ コ ンパ イ ルの ス テ ッ プが終了 し た場合、 Preprocessor2 に よ り
次の よ う な メ ッ セージが出力 さ れます。
SPP9980 Fatal Error:
Unexpected CLI return 280 on DBCHINI call
実行時の実行接続
Teradata Database への実行時の接続は、 明示ま たは暗黙に確立 さ れます。
セ ッ シ ョ ン用に設定 さ れ る TRANSACT ま たは -tr プ リ プ ロ セ ッ サ ・ ト ラ ン ザ ク
シ ョ ン ・ モー ド は、 接続の確立時に ( 明示ま たは暗黙に ) 設定 さ れます。
ト ラ ンザ ク シ ョ ン ・ モー ド は、 その確立 さ れたセ ッ シ ョ ンのアプ リ ケーシ ョ ン用に
設定 さ れた TRANSACT ま たは -tr プ リ プ ロ セ ッ サ ・ オプシ ョ ンに基づいてい ます。
プ リ プ ロ セ ッ サの起動オプシ ョ ンについての詳細は、 <Teradata PreProcessor2 埋め込
み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照 し て く だ さ い。
完了の条件
実行時接続が成功す る と 、 以下の完了 コ ー ド が返 さ れます。
• SQLCODE = 0
• SQLSTATE = '00000'
• SQLCA フ ィ ール ド SQLWARN0 お よ び SQLWARN2 = W (Teradata モー ド のみ )
明示接続
アプ リ ケーシ ョ ンは、 Teradata Database への接続を、 CONNECT ま たは LOGON 文
に よ っ て明示的に指定す る こ と がで き ます。
明示接続では、 ど の TDP お よ びユーザー ID に接続す る かについて精密に制御す る
こ と がで き ますが、 暗黙接続では、 TDP お よ びユーザー ID のシ ス テ ム ・ デフ ォ ル
ト を使用 し ます。 こ の理由か ら 、 デフ ォ ル ト 以外の TDP ま たはユーザー ID に接続
す る 必要があ る 場合はいつで も 、 明示接続を確立す る 必要があ り ます。
明示接続は、 デフ ォ ル ト の TDP お よ びユーザー ID が接続の確立に十分な も のであ
る 場合で も 、 精密な制御を提供す る ので望ま し い と 言え ます。
368
明示接続の要求が出 さ れた と き の状態
その場合
アプ リ ケーシ ョ ン がすでに
Teradata Database に接続 し てい る
新規接続が試行 さ れ る 前に、 前の接続が切断
される。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン か ら Teradata Database への接続
明示接続の要求が出 さ れた と き の状態
その場合
ト ラ ンザ ク シ ョ ン がア ク テ ィ ブであ る
• 接続要求は拒否 さ れ、 SQLCODE -752 が出
される。
• 新 し い明示接続要求を出す前に、 以下のい
ずれか 1 つを使って、 アプ リ ケーシ ョ ンは
現在の ト ラ ンザ ク シ ョ ン を明示的に終了
し なければな り ません。
• COMMIT
• ROLLBACK ( ま たは ABORT)
• LOGOFF
Teradata Database へのすべての明示接続には、 以下の も のが必要です。
• TDP ID
• ユーザー ID
• パ ス ワー ド
TDP ID お よ びユーザー ID プ リ プ ロ セ ッ サ ・ オプシ ョ ンは、 実行時のアプ リ ケー
シ ョ ンの ロ グオ ンには影響を与え ません。
ユーザー ID のセキ ュ リ テ ィ 、 TDP ID、 お よ びユーザー ID については、 <Teradata
TDP リ フ ァ レ ン ス > で説明 さ れてい ます。
デ フ ォル ト の TDP ID
tdpid を指定 し ない場合、 接続はシ ス テ ム ・ デフ ォ ル ト の tdpid を使用 し て確立 さ れ
ます。
次のプ ラ ッ ト フ ォ ーム上で実行 し て
い る アプ リ ケーシ ョ ン
その場合のデフ ォ ル ト TDP
IBM メ イ ン フ レーム
HSHSPB デー タ 領域モ ジ ュ ールか ら 入手 し ま す
( 詳細は <Teradata CLI V2 リ フ ァ レ ン ス - メ イ ン
フ レーム接続シ ス テ ム > を参照 し て く だ さ い )。
ワ ー ク ス テーシ ョ ン接続シ ス テ ム
mtdpid、 ユーザー定義の clispb.dat フ ァ イ ル ま た
は CLI2SPB デー タ 領域か ら 入手 し ます。
暗黙接続
IBM メ イ ン フ レーム環境で実行す る 埋め込み SQL アプ リ ケーシ ョ ンが、 Teradata
Database への明示接続を指定せずに SQL 要求を出す場合は、 アプ リ ケーシ ョ ン が
実行 し てい る ジ ョ ブ ま たはセ ッ シ ョ ンに基づいて暗黙接続が試行 さ れます。
LAN 接続のプ ラ ッ ト フ ォームは、 暗黙接続を許可 し ません。 暗黙接続 メ カニズムにつ
いて、 詳細は <Teradata CLI V2 リ フ ァ レ ン ス - メ イ ン フ レーム接続シ ス テ ム > を参
照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
369
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
CONNECT
CONNECT
目的
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ンか ら Teradata Database へ接続 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
CONNECT
user_id_variable
password_variable
IDENTIFIED BY
:
A
:
A
AS
connection_name
: connection_name_variable
1101B019
説明
構文要素
指定内容
user_id_variable
接続に使用 さ れ る Teradata Database のユーザー ID を含むホ
ス ト 変数を指定 し ます。
ユーザー ID は最大 8 文字に制限 さ れてい ます。
password_variable
指定 し たユーザー ID のパ ス ワー ド を含むホ ス ト 変数を指定
し ます。
パ ス ワー ド は最大 8 文字に制限 さ れてい ます。
こ の変数での先行 コ ロ ン文字の使用は任意指定です。
接続に使用 さ れ る tdpid は、 シ ス テ ム ・ デフ ォ ル ト です。
CONNECT に対 し て明示の tdpid を指定す る こ と はで き ま
せん。
connection_name
接続の名前を指定 し ます。
:connection_name_variable
接続名を含んでい る ホ ス ト 変数を指定 し ます。
先行 コ ロ ン文字は必須です。
ANSI への準拠
CONNECT は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
CONNECT は ANSI/ISO SQL:2011 規格で定義 さ れてい ますが、 ANSI 形式の
CONNECT は構文がやや異な っ てい ます。
370
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
CONNECT
許可
な し。
CONNECT と LOGON と の相違
CONNECT と LOGON と の相違は、 LOGON が Teradata SQL ロ グ オ ン 文字列の
TDP ID やア カ ウ ン ト ID な ど の、 任意の指定可能な要素を指定で き る のに対 し て、
CONNECT はユーザー ID と パ ス ワー ド の指定 し かで き ません。
Teradata Database への SQL CONNECT およびプ リ プ ロ セ ッ サ接続
CONNECT 文は、 Teradata Database へのプ リ プ ロ セ ッ サ接続には効果はあ り ません。
詳細については、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参
照 し て く だ さ い。
暗黙的な接続 と 明示的な接続の相違点
明示接続では、 ど の TDP お よ びユーザー ID に接続す る かについて精密に制御す る
こ と がで き ますが、 暗黙接続では、 TDP お よ びユーザー ID のシ ス テ ム ・ デフ ォ ル
ト を使用 し ます。 こ の理由か ら 、 デフ ォ ル ト 以外の TDP ま たはユーザー ID に接続
す る 必要があ る 場合はいつで も 、 明示接続を確立す る 必要があ り ます。
明示接続は、 デフ ォ ル ト の TDP お よ びユーザー ID が接続の確立に十分な も のであ
る 場合で も 、 精密な制御を提供す る ので望ま し い と 言え ます。
一般規則
• CONNECT 文の使用は、 任意選択です。 アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムが
Teradata Database へのア ク セ ス を必要 と す る 任意の SQL 文を実行 し てお り 、
そのプ ロ グ ラ ムが現在は Teradata Database に接続 さ れていない場合、 暗黙接続が
試行 さ れます。
• アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムが、 Teradata Database にすでに接続 さ れてい る 場
合に CONNECT 文を実行す る と 、 前の接続は切断 さ れます。
• user_id-variable お よ び password_variable の両方 と も 、 8 文字の固定長文字列 と し
て定義 さ れてい る ホ ス ト 変数でなければな り ません。 ( ユーザー ID ま たはパ ス
ワー ド が 8 文字未満の場合は、 埋め込み文字を使用 し てユーザー ID ま たはパス
ワー ド を 8 文字の長 さ に し て く だ さ い )。
• CONNECT は、 動的文 と し ては実行で き ません。
•
アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムは、 指定 し たユーザー ID お よ びパ ス ワー ド を使
用 し て Teradata Database に接続 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
371
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
CONNECT
AS (connection_name |:namevar) 句の規則
• connection_name は固有でな く てはな ら ず ( 最大 30 バ イ ト )、 大文字小文字を区
別 し ます。
• 現在のア ク テ ィ ブな接続が接続名を持っ ていなか っ た場合、 次の接続には接続
名を含め る こ と がで き ません。
含めた場合、 接続試行が拒否 さ れた こ と を示す実行時エ ラ ーが返 さ れます。
現在のア ク テ ィ ブな接続は変更 さ れない ま ま です。
• :connection_name_variable は、 30 バ イ ト 以内の固定長ま たは可変長文字変数でな
ければな り ません。
例
CONNECT 文 を 簡単に理解で き る 例につい て は、 「例 1」 (382 ページ )、 「例 2」
(383 ページ )、 お よ び 「例 3」 (384 ページ ) を参照 し て く だ さ い。
関連 ト ピ ッ ク
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムか ら Teradata Database に接続す る 代
替方法については、 「LOGON」 (380 ページ ) を参照 し て く だ さ い。
CONNECT ま たは LOGON 文を使用 し ないでプ リ プ ロ セ ッ サを Teradata Database に
接続す る ための方法について、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・
ガ イ ド > を参照 し て く だ さ い。
372
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
GET CRASH
GET CRASH
目的
SET CRASH 文に よ っ て設定 さ れ る ク ラ ッ シ ュ 保守オプシ ョ ン を表示 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
GET CRASH
WAIT, TELL
INTO
wait_variable,
:
tell_variable,
:
1101B058
説明
構文要素
現在の設定値を受け取 る 1 バ イ ト 文字
wait_variable
wait_across_crash (WAC) オプシ ョ ン設定値。
tell_variable
tell_about_crash (TAC) オプシ ョ ン設定値。
ANSI への準拠
GET CRASH は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
使用方法
GET CRASH は、 ワー ク ス テーシ ョ ン ・ プ ラ ッ ト フ ォームに対 し てのみ有効です。
こ の文がプ リ プ ロ セ ッ サに実行依頼 さ れてい る 場合は、 メ イ ン フ レーム ・ プ リ コ ン
パ イ ラ に よ り エ ラ ーが生成 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
373
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGOFF
LOGOFF
目的
Teradata Database か ら 埋め込み SQL アプ リ ケーシ ョ ン ・ プ ロ グ ラ ム を切断 し ます。
呼出 し
実行可能プ ロ グ ラ ム。
埋め込み SQL のみ。
構文
LOGOFF
CURRENT
ALL
connection_name
:connection_name_variable
1101B020
説明
構文要素
指定内容
CURRENT
現在のセ ッ シ ョ ン だけ を ロ グオ フ し ます。
ALL
現在のユーザーに接続 し てい る すべてのセ ッ シ ョ ン を ロ グ
オ フ し ます。
connection_name
接続の名前を指定 し ます。
:connection_name_variable
接続名を含んでい る ホ ス ト 変数を指定 し ます。
先行 コ ロ ン文字は必須です。
ANSI への準拠
LOGOFF は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
374
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGOFF
規則
• LOGOFF 文は任意選択です。 省略 し た場合、 Teradata Database か ら の切断は、
アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムの終了時に暗黙に実行 さ れます。
• LOGOFF は、 Teradata Database への接続が、 CONNECT 文、 LOGON 文、 ま たは
暗黙の接続のいずれに よ っ て確立 さ れたかに関係な く 使用で き ます。
• アプ リ ケーシ ョ ンが COMMIT モー ド で実行 し てい る 場合、 LOGOFF に よ っ て未
解決の ト ラ ンザ ク シ ョ ンはすべて コ ミ ッ ト さ れます。
アプ リ ケーシ ョ ンがいずれかの ト ラ ンザ ク シ ョ ン ・ モー ド で実行 し てい る 場合、
LOGOFF し て も 未解決の ト ラ ンザ ク シ ョ ンは コ ミ ッ ト さ れません。
• LOGOFF は、 動的文 と し ては実行で き ません。
• LOGOFF ALL は、 すべてのア ク テ ィ ブな接続を切断 し ます。
• LOGOFF CURRENT は、 現在のア ク テ ィ ブな接続を切断 し ます。 ( 切断オブジ ェ
ク ト が指定 さ れない場合は、 こ れがデフ ォ ル ト です。 )
• LOGOFF connection_name は、 指定 し た接続を切断 し ます。 各接続名は固有でな
ければな ら ず ( 最大 30 バ イ ト )、 大文字小文字を区別 し ます。
• LOGOFF :namevar は、 :namevar に保管 さ れてい る 、 指定 し た接続を切断 し ます。
:namevar は、 30 バ イ ト 以内の固定長ま たは可変長の文字変数でなければな り ま
せん。
例1-4
以下の RDTIN フ ィ ール ド は、 切断オブジ ェ ク ト を指定す る 以下の LOGOFF に重要
です。
RDTIN
フ ィ ール ド
必須の指定
RdtVersn
10 に設定。
RdtAux1
次の値のいずれかに設定。
• 0。 現在の接続を切断 し ます。
• 1。 すべての接続を切断 し ます。
• 2。 指定の接続を切断 し ます。
RdtExt
'Y' に設定。 指名の接続を指定 し た場合のみ、 拡張機能領域の存在を
示す。
RdtXTotL
RDTXCONM 拡張機能領域のサ イ ズ を含む。 指名の接続を指定 し た場
合のみ。
さ ら に、 RdtX007 (RDTXCONM) 構造は、 指名の接続を指定 し た場合にのみ接続名
と 通信す る ので、 拡張機能領域のいずれか を組み込む必要があ り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
375
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGOFF
例1
以下の例では、 明示的な接続名を使用 し て切断 し ます。
EXEC SQL LOGOFF SESSION1;
例 1 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
} RDTIN006 =
{200,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',' ','C',
48,{' '},{8,5,255},{36,7,8,'S','E','S','S','I','O','N','1'}};
RDTIN006.RdtCA = (char *)(&sqlca);
RDTIN006.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN006);
SQL_RDTRTCON = RDTIN006.RdtRtCon;
}
376
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGOFF
例2
以下の例では、 VARCHAR ホ ス ト 変数 connamev に よ っ て指定 さ れ る 接続名を使用
し て切断 し ます。
EXEC SQL LOGOFF :CONNAMEV;
例 2 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
} RDTIN007 =
{200,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',' ','C',
48,{' '},{8,5,255},{36,7,}};
RDTIN007.RdtX007.RdtXConL = CONNAMEV.len;
memcpy(RDTIN007.RdtX007.RdtXConT,CONNAMEV.arr,CONNAMEV.len);
RDTIN007.RdtCA = (char *)(&sqlca);
RDTIN007.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN007);
SQL_RDTRTCON = RDTIN007.RdtRtCon;
}
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
377
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGOFF
例3
以下の例では、 固定長ホ ス ト 変数 connamef に よ っ て指定 さ れ る 接続名を使用 し て
切断 し ます。
EXEC SQL LOGOFF :CONNAMEF;
例 3 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
} RDTIN008 =
{200,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',' ','C',
48,{' '},{8,5,255},{36,7,}};
RDTIN008.RdtX007.RdtXConL = strlen(CONNAMEF);
memcpy(RDTIN008.RdtX007.RdtXConT,CONNAMEF,strlen(CONNAMEF));
RDTIN008.RdtCA = (char *)(&sqlca);
RDTIN008.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN008);
SQL_RDTRTCON = RDTIN008.RdtRtCon;
}
378
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGOFF
例4
以下の例ではすべての接続を切断 し ます。
EXEC SQL LOGOFF ALL;
例 4 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN009 =
{200,10,0,{' '},0,0,0,0,0,0,1,0,'N','B','N','Y','N','N',' ','C',
12,{' '},{8,5,255}};
RDTIN009.RdtCA = (char *)(&sqlca);
RDTIN009.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN009);
SQL_RDTRTCON = RDTIN009.RdtRtCon;
}
例 : LOGOFF CURRENT
LOGOFF CURRENT 文で生成 さ れ る コ ー ド は、 オブジ ェ ク ト の切断を指定 し ない
LOGOFF と 同 じ です。
RDTIN RdtAux1 フ ィ ール ド は 0 に設定す る 必要があ り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
379
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGON
LOGON
目的
Teradata Database か ら 埋め込み SQL アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムに明示的に接続
し ます。
呼出 し
実行可能プ ロ グ ラ ム。
埋め込み SQL のみ。
構文
LOGON
logon_string
:
AS
connection_name
: connection_name_variable
1101B027
説明
構文要素
指定内容
logon_string
使用す る ロ グオ ン文字列を含んでい る 変数を指定 し ます。
connection_name
接続の名前を指定 し ます。
:connection_name_variable
接続名を含んでい る ホ ス ト 変数を指定 し ます。
先行 コ ロ ン文字は必須です。
ANSI への準拠
LOGON は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
LOGON と CONNECT と の相違
LOGON と CONNECT と の相違は、 LOGON が Teradata SQL ロ グ オ ン文字列の
TDP ID やア カ ウ ン ト ID な ど の、 任意の指定可能な要素を指定で き る のに対 し て、
CONNECT はユーザー ID と パ ス ワー ド の指定 し かで き ません。
380
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGON
一般規則
• LOGON は任意選択です。
こ れを使用す る 場合、 LOGON はアプ リ ケーシ ョ ンに よ っ て実行 さ れ る 最初の
SQL 文でなければな り ません。
省略 し た場合、 Teradata Database への接続は暗黙に確立 さ れます。
• logon_string 登録項は、 使用す る ロ グオン文字列を含んでい る ホ ス ト 変数を識別
し ます。 こ れは ク ラ イ ア ン ト 言語の SQL 文字列の規則に従 う も のでなければな
り ません。 こ のホ ス ト 変数の先行 コ ロ ン文字の使用は任意選択です。
• アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムは、 logon_string に含まれ る ユーザー ID お よ び
パ ス ワー ド があれば、 それ ら を使用 し て Teradata Database に接続 し ます。 それ ら
の ど ち ら かがなければ、 暗黙接続が試行 さ れます。
• logon_string が TDP ID を含んでい る 場合、 それは最初に表示 さ れなければな ら
ず、 残 り の ロ グオン文字列 と は ス ラ ッ シ ュ (/) に よ っ て分離 さ れていなければな
り ません。 存在すれば、 それが接続に使用す る TDP を決定 し ます。 存在 し ない
場合は、 シ ス テ ム定義のデフ ォ ル ト TDP が使用 さ れます。
• LOGON は、 動的文 と し ては実行で き ません。
AS (connection_name |:namevar) 句の規則
• connection_name は固有でなければな ら ず ( 最大 30 バ イ ト )、 大文字小文字を区
別 し ます。
• 現在のア ク テ ィ ブな接続が接続名を持っ ていない場合、 次の接続には接続名を
含め る こ と がで き ません。 含めた場合、 接続試行が拒否 さ れた こ と を示す実行
時エ ラ ーが返 さ れます。 現在のア ク テ ィ ブな接続は変更 さ れない ま ま です。
• :connection_name_variable は、 30 バ イ ト 以内の固定長ま たは可変長の文字変数で
なければな り ません。
例1-3
以下のすべての例では、 参照 さ れ る ホ ス ト 変数は以下の よ う に定義 さ れます。
EXEC SQL BEGIN DECLARE SECTION;
char logstr[103];
VARCHAR CONNAMEV[30];
char CONNAMEF[31];
char STMTNAMF[31];
VARCHAR STMTNAMV[30];
EXEC SQL END DECLARE SECTION;
以下の RDTIN フ ィ ール ド は、 こ れ ら の例において重要です。
RDTIN フ ィ ール ド
必須の指定
RdtVersn
10 に設定。
RdtExt
'Y' に設定。 拡張機能領域の存在を示す。
RdtXTotL
RDTXCONM 拡張機能領域のサ イ ズ を含む。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
381
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGON
さ ら に、 RdtX007 (RDTXCONM) 構造は、 接続名 と 通信す る ので、 拡張機能領域の
いずれか を組み込む必要があ り ます。
例1
こ の例では、 接続名 と 通信す る ホ ス ト 変数を使用 し て ロ グオ ン し ます。
EXEC SQL LOGON :logstr AS SESSION1;
例 1 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt16 LogonStrLen;
char
LogonStr[102];
} Sql_Stmt010;
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
char
RdtLogMech[8];
char
*RdtLogData;
382
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGON
} RdtX010;
} RDTIN010 =
{110,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
64,{' '},{8,5,255},{36,7,8,'S','E','S','S','I','O','N','1'},{16,
10,{' '},0}};
Sql_Stmt010.LogonStrLen = strlen(logstr);
memcpy(Sql_Stmt010.LogonStr,logstr,strlen(logstr));
RDTIN010.RdtSql = (char *)(&Sql_Stmt010);
RDTIN010.RdtCA = (char *)(&sqlca);
RDTIN010.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN010);
SQL_RDTRTCON = RDTIN010.RdtRtCon;
}
例2
「例 1」 (382 ページ ) と 同様、 こ の例では、 接続名 と 通信す る ホ ス ト 変数を使用 し て
ロ グオ ン し ます。
EXEC SQL LOGON :logstr AS :CONNAMEV;
例 2 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt16 LogonStrLen;
char
LogonStr[102];
} Sql_Stmt011;
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
383
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGON
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
char
RdtLogMech[8];
char
*RdtLogData;
} RdtX010;
} RDTIN011 =
{110,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
64,{' '},{8,5,255},{36,7,},{16,10,{' '},0}};
Sql_Stmt011.LogonStrLen = strlen(logstr);
memcpy(Sql_Stmt011.LogonStr,logstr,strlen(logstr));
RDTIN011.RdtSql = (char *)(&Sql_Stmt011);
RDTIN011.RdtX007.RdtXConL = CONNAMEV.len;
memcpy(RDTIN011.RdtX007.RdtXConT,CONNAMEV.arr,CONNAMEV.len);
RDTIN011.RdtCA = (char *)(&sqlca);
RDTIN011.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN011);
SQL_RDTRTCON = RDTIN011.RdtRtCon;
}
例3
以下の例では、 ホ ス ト 変数を使用 し て渡 さ れた固定長文字接続名を使用 し て ロ グ
オ ン し ます。
EXEC SQL LOGON :logstr AS :CONNAMEF;
例 3 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt16 LogonStrLen;
char
LogonStr[102];
} Sql_Stmt012;
static struct {
SQLInt32
SQLInt16
SQLInt16
char
SQLInt32
char
char
char
char
char
SQLInt32
SQLInt32
char
char
char
384
RdtCType;
RdtVersn;
RdtDec;
RdtUserid[8];
RdtEntty;
*RdtCA;
*RdtDAIn;
*RdtDAOut;
*RdtSql;
*RdtRtCon;
RdtAux1;
RdtAux2;
RdtLCS;
RdtComit;
RdtRelse;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
LOGON
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
char
RdtLogMech[8];
char
*RdtLogData;
} RdtX010;
} RDTIN012 =
{110,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
64,{' '},{8,5,255},{36,7,},{16,10,{' '},0}};
Sql_Stmt012.LogonStrLen = strlen(logstr);
memcpy(Sql_Stmt012.LogonStr,logstr,strlen(logstr));
RDTIN012.RdtSql = (char *)(&Sql_Stmt012);
RDTIN012.RdtX007.RdtXConL = strlen(CONNAMEF);
memcpy(RDTIN012.RdtX007.RdtXConT,CONNAMEF,strlen(CONNAMEF));
RDTIN012.RdtCA = (char *)(&sqlca);
RDTIN012.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN012);
SQL_RDTRTCON = RDTIN012.RdtRtCon;
}
関連 ト ピ ッ ク
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムか ら Teradata Database に接続す る 代
替方法については、 「CONNECT」 (370 ページ ) を参照 し て く だ さ い。
CONNECT ま たは LOGON 文を使用 し ないで Preprocessor2 を Teradata Database に接
続す る ための方法については、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・
ガ イ ド > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
385
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET BUFFERSIZE
SET BUFFERSIZE
目的
SQL 要求の処理時に使用 さ れ る 応答バ ッ フ ァ 長を指定 し ます。
呼び出 し
実行不可プ ロ グ ラ ム。
プ リ プ ロ セ ッ サ宣言。
埋め込み SQL のみ。
構文
SET BUFFERSIZE
size
GW01A032
説明
構文要素
指定内容
size
後続の SQL 要求の処理時に使用 さ れ る 応答バ ッ フ ァ 長 を 定義す る 、
整数数値 リ テ ラ ルを指定 し ます。
size の値は、 0 ま たは 256 ~ 1MB の整数でなければな り ません。
ANSI への準拠
SET BUFFERSIZE は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
明示的に指定 さ れる応答バ ッ フ ァ 長
SET BUFFERSIZE 文に続 く Preprocessor2 要求は、 size 変数に よ っ て指定 さ れたバ ッ
フ ァ ・ サ イ ズの値を引 き 続いて使用 し ます。 要求バ ッ フ ァ ・ サ イ ズは、 こ の文に
よ っ ては影響を受け ません。
デ フ ォル ト の応答バ ッ フ ァ 長
SET BUFFERSIZE 文が使用 さ れない場合は、 すべての要求に対 し てデフ ォ ル ト の応
答バ ッ フ ァ 長が使用 さ れます。
386
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET BUFFERSIZE
規則
• size の値は、 ゼ ロ ま たは 256 ~ 65535 の範囲の有効な数値でなければな り ません。
ゼ ロ の値は、 デフ ォ ル ト の応答バ ッ フ ァ 長を指定 し ます。
プ ラ ッ ト フ ォ ームの タ イ プ
デフ ォ ル ト のバ ッ フ ァ ・ サ イ ズの定義場所
IBM メ イ ン フ レーム
HSHSPB
ワ ー ク ス テーシ ョ ン
clispb.dat
• size の値が有効な範囲の外であ る か ま たは非数値の場合、 デフ ォ ル ト の応答バ ッ
フ ァ 長が使用 さ れ、 Teradata Database に よ っ てプ リ プ ロ セ ッ サ警告 メ ッ セージ
(SPP1500) が表示 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
387
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CHARSET
SET CHARSET
目的
プ ロ グ ラ ム実行時に Teradata Database と のデー タ の変換に使用す る 文字セ ッ ト を指
定 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
SET CHARSET
character_set_name
:character_set_name_variable
1101B033
説明
構文要素
指定内容
character_set_name
ク ラ イ ア ン ト と Teradata Database と の間でのデー タ の変
換に使用 さ れ る 文字セ ッ ト を指定 し ます。
:character_set_name_variable
ク ラ イ ア ン ト と Teradata Database と の間でのデー タ の変
換に使用 さ れ る 文字セ ッ ト の名前を含んでい る ホ ス ト 変
数を指定 し ます。
コ ロ ン文字の使用は必須です。
ANSI への準拠
SET CHARSET は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
使用上の注意
SET CHARSET は、 実行時にアプ リ ケーシ ョ ン と Teradata Database と の間の通信に
使用 さ れ る デフ ォ ル ト の文字セ ッ ト を オーバー ラ イ ド し ます。
388
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CHARSET
規則
• character_set_name ま たは :character_set_name_variable の ど ち ら を指定す る 場合
も 、 文字セ ッ ト 名は、 有効な文字セ ッ ト 識別子でなければな り ません。
• 文字セ ッ ト 名を文字セ ッ ト コ ー ド と 識別す る ために使用す る 場合、
chracter_set_name は、 APOST/QUOTE プ リ プ ロ セ ッ サ ・ オプシ ョ ンの設定
に基づいて、 単一引用符ま たは引用符で囲ま なければな り ません。
• 文字セ ッ ト 名を識別す る ために使用す る 場合、 :character_set_name_variable は、
ク ラ イ ア ン ト 言語用の SQL 文字列のルールに従わなければな り ません。
<Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照して く ださい。
• 文字セ ッ ト コ ー ド を識別す る ために使用す る 場合、 :character_set_name_variable
は、 SMALL INTEGER 型のホ ス ト 変数 と し て定義 し なければな り ません。
• SET CHARSET 文の指定は、 プ リ プ ロ セ ッ サ処理には影響を与えず、 実行時に
Teradata Database と の間でデー タ をや り と り す る だけです。
関連 ト ピ ッ ク
UTF-8 と UTF-16 の文字セ ッ ト について、 お よ び UTF-8 と UFT-16 のプ ロ グ ラ ミ ン
グに関す る 固有の考慮事項については、 <Teradata PreProcessor2 埋め込み SQL プ ロ
グ ラ マ ・ ガ イ ド > を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
389
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CONNECTION
SET CONNECTION
目的
既存のセ ッ シ ョ ン接続を新規の接続に変更 し ます。
呼出 し
実行可能プ ロ グ ラ ム。
埋め込み SQL のみ。
構文
SET CONNECTION
connection_name
:connection_name_variable
1101B034
説明
構文要素
指定内容
connection_name
現在の接続が変更 さ れ る 接続変数の名前を指定 し ます。
:connection_name_variable
接続名を含んでい る ホ ス ト 変数を指定 し ます。
先行 コ ロ ン文字は必須です。
ANSI への準拠
SET CONNECTION は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
許可
な し。
規則
• SET CONNECTION は、 以下の場合には無効です。
• 現在のセ ッ シ ョ ン に接続名が な い た め、 単一セ ッ シ ョ ン ・ モー ド で あ る 。
実行時エ ラ ーが起 き て、 現在の接続が有効の ま ま であ る 。
• DECLARE CURSOR 文に よ っ て指定 さ れた カー ソ ル要求内であ る 。
•
PREPARE ま たは EXECUTE IMMEDIATE 文に よ っ て指定 さ れた動的要求内で
あ る。
• 試行 し た SET CONNECTION が失敗 し た場合、 現在の接続に connection_name が
ない限 り 、 現在のセ ッ シ ョ ンはあ り ません。
390
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CONNECTION
• 現在の接続が切断 さ れた場合、 SET CONNECTION 文を実行 し て、 バ ッ ク グ ラ
ウ ン ド 接続を現在の接続に し なければな り ません。
• 各接続名は固有で な ければな ら ず ( 最大 30 バ イ ト ) 、 大文字小文字 を 区別 し
ま す。
• :namevar は、 30 バ イ ト 以内の固定長ま たは可変長の文字変数でなければな り ま
せん。
SET CONNECTION およびマルチセ ッ シ ョ ン ・ プ ログ ラ ミ ング
SET CONNECTION は、 マルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グで使用す る よ う に設計
さ れてお り ( 第 12 章 : 「埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ
ミ ン グ」 を参照 )、 アプ リ ケーシ ョ ンが複数の並行セ ッ シ ョ ン ( 並列セ ッ シ ョ ン / 同
時セ ッ シ ョ ン ) 間で接続を切 り 替え る こ と がで き ます。
例1-3
以下の RDTIN フ ィ ール ド は、 こ れ ら の例において重要です。
RDTIN フ ィ ール ド
必須の指定
RdtCType
150 に設定。
RdtVersn
10 に設定。
RdtExt
'Y' に設定。 拡張機能領域の存在を示す。
RdtXTotL
RDTXCONM 拡張機能領域のサ イ ズ を含む。
さ ら に、 RdtX007 (RDTXCONM) 構造は、 接続名 と 通信す る ので、 拡張機能領域の
いずれか を組み込む必要があ り ます。
例1
以下の例では、 明示的に指定 さ れた接続名 を 使用 し て セ ッ シ ョ ン 接続 を 確立 し
ま す。
EXEC SQL SET CONNECTION SESSION1;
例 1 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32
SQLInt16
SQLInt16
char
SQLInt32
char
char
char
RdtCType;
RdtVersn;
RdtDec;
RdtUserid[8];
RdtEntty;
*RdtCA;
*RdtDAIn;
*RdtDAOut;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
391
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CONNECTION
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
} RDTIN013 =
{150,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
48,{' '},{8,5,255},{36,7,8,'S','E','S','S','I','O','N','1'}};
RDTIN013.RdtCA = (char *)(&sqlca);
RDTIN013.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN013);
SQL_RDTRTCON = RDTIN013.RdtRtCon;
}
例2
以下の例では、 ホ ス ト 変数 connamev に よ っ て SET CONNECTION に渡 さ れ る
VARCHAR 接続名を使用 し てセ ッ シ ョ ン接続を確立 し ます。
EXEC SQL SET CONNECTION :CONNAMEV;
例 2 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32
SQLInt16
SQLInt16
char
SQLInt32
char
char
char
char
char
SQLInt32
SQLInt32
392
RdtCType;
RdtVersn;
RdtDec;
RdtUserid[8];
RdtEntty;
*RdtCA;
*RdtDAIn;
*RdtDAOut;
*RdtSql;
*RdtRtCon;
RdtAux1;
RdtAux2;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CONNECTION
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
} RDTIN014 =
{150,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
48,{' '},{8,5,255},{36,7,}};
RDTIN014.RdtX007.RdtXConL = CONNAMEV.len;
memcpy(RDTIN014.RdtX007.RdtXConT,CONNAMEV.arr,CONNAMEV.len);
RDTIN014.RdtCA = (char *)(&sqlca);
RDTIN014.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN014);
SQL_RDTRTCON = RDTIN014.RdtRtCon;
}
例3
以下の例では、 ホ ス ト 変数 connamef に よ っ て SET CONNECTION に渡 さ れ る
CHAR 接続名を使用 し てセ ッ シ ョ ン接続を確立 し ます。
EXEC SQL SET CONNECTION :CONNAMEF;
例 3 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32
SQLInt16
SQLInt16
char
SQLInt32
char
char
char
char
char
SQLInt32
SQLInt32
char
char
RdtCType;
RdtVersn;
RdtDec;
RdtUserid[8];
RdtEntty;
*RdtCA;
*RdtDAIn;
*RdtDAOut;
*RdtSql;
*RdtRtCon;
RdtAux1;
RdtAux2;
RdtLCS;
RdtComit;
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
393
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CONNECTION
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt16 RdtXConL;
char
RdtXConT[30];
} RdtX007;
} RDTIN015 =
{150,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
48,{' '},{8,5,255},{36,7,}};
RDTIN015.RdtX007.RdtXConL = strlen(CONNAMEF);
memcpy(RDTIN015.RdtX007.RdtXConT,CONNAMEF,strlen(CONNAMEF));
RDTIN015.RdtCA = (char *)(&sqlca);
RDTIN015.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN015);
SQL_RDTRTCON = RDTIN015.RdtRtCon;
}
394
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CRASH
SET CRASH
目的
wait_across_crash (WAC) お よ び tell_about_crash (TAC) オプ シ ョ ン を 、 ノ ー ド ・
ク ラ ッ シ ュ の処理に対 し て設定 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
SET CRASH
WAIT_NOTELL
NOWAIT_TELL
GW01A057
説明
構文要素
WAC 設定の指定
WAIT_NOTELL
実行時に Y、 TAC を N に設定。
こ れはデフ ォ ル ト の ク ラ ッ シ ュ ・ オプシ ョ ン設定です。
NOWAIT_TELL
実行時に N、 TAC を Y に設定。
ANSI への準拠
SET CRASH は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
使用方法
SET CRASH は、 ワ ー ク ス テーシ ョ ン接続プ ラ ッ ト フ ォームでのみ使用可能です。
メ イ ン フ レーム ・ プ リ コ ンパ イ ラ は、 こ の文がプ リ コ ンパ イ ル さ れてい る 場合はエ
ラ ーを生成 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
395
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CRASH
ク ラ ッ シ ュ ・ オプシ ョ ンは、 SET CRASH の後に実行 さ れ る (LOGON や CONNECT
要求 も 含め、 別の SET CRASH が実行 さ れ る ま での ) すべての埋め込み SQL 文に対
し て有効です。
ノ ー ド が リ セ ッ ト さ れた場合のプ リ プ ロ セ ッ サの動作
以下の表は、 ノ ー ド が リ セ ッ ト さ れた場合のプ リ プ ロ セ ッ サの動作を説明 し てい
ま す。
プ リ プ ロ セ ッ サの実行場所
動作
リ セ ッ ト される ノ ー ド
アボー ト し ます。
前処理は、 ノ ー ド の リ セ ッ ト 後に再始動 し なければな
り ません。
こ れは、 ダ ウ ン し た外部 ク ラ イ ア ン ト 上でユーテ ィ リ
テ ィ ま たはアプ リ ケーシ ョ ン を開始す る と い う 状況 と
同 じ です。
次のいずれか。
• リ セ ッ ト さ れない ノ ー ド
• LAN 接続 ク ラ イ ア ン ト
•
ワ ー ク ス テーシ ョ ン接続 ク
ラ イ アン ト
そのセ ッ シ ョ ン を再接続 し (Teradata Database に接続 し
てい る 場合 )、 構文検査を受け る 現在の SQL 文がエ
ラ ーを返 し ます。
前処理を再始動 し て、 完全な構文検査を確実に実施 し
ます。
ノ ー ド が リ セ ッ ト さ れた場合のア プ リ ケーシ ョ ンの動作
ノ ー ド の リ セ ッ ト 時の埋め込み SQL アプ リ ケーシ ョ ンの動作は、 以下に応 じ て異
な り ます。
• プ リ プ ロ セ ッ サが実行 し てい る ノ ー ド の タ イ プ
• ク ラ ッ シ ュ 通知の設定
埋め込み SQL アプ リ ケーシ ョ ンが リ セ ッ ト さ れ る ノ ー ド 上で実行 し てい る 場合、
それはアボー ト し 、 ノ ー ド の リ セ ッ ト 後に再始動 し なければな り ません。
こ れは、 ダ ウ ン し た外部 ク ラ イ ア ン ト 上で ユーテ ィ リ テ ィ ま た は ア プ リ ケ ー
シ ョ ン を 開始す る と い う 状況 と 同 じ です。
SET CRASH = WAIT_NOTELL 時のア プ リ ケーシ ョ ンの動作
ノ ー ド の リ セ ッ ト 時に SET CRASH = WAIT_NOTELL の場合、 そ し て アプ リ ケー
シ ョ ンが以下の環境のいずれかで実行 し てい る 場合の埋め込み SQL アプ リ ケー
シ ョ ンの動作を、 リ ス ト の後に説明 し ます。
396
•
リ セ ッ ト さ れない ノ ー ド
•
メ イ ン フ レーム接続 ク ラ イ ア ン ト
•
メ イ ン フ レーム接続 ク ラ イ ア ン ト
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET CRASH
アプ リ ケーシ ョ ンはそのセ ッ シ ョ ン を再接続 し 、 Teradata Database か ら 以下のいず
れか 1 つのエ ラ ー ・ コ ー ド を戻 し 、 埋め込み SQL アプ リ ケーシ ョ ンはそのエ ラ ー
条件に適 し た ア ク シ ョ ン を取 り ます。
コー ド
説明
Error 2825
Teradata Database の再始動後の最新の要求の レ コー ド が見つか り ません。
Error 2826
要求は完了 し ま し たが、 Teradata Database の再始動が原因ですべての出
力が失われま し た。
Error 2828
Teradata Database 回復時に要求は ロ ールバ ッ ク さ れ ま し た。
Error 3120
Teradata Database の回復が原因で要求はアボー ト さ れ ま し た。
SET CRASH = NOWAIT_TELL 時のア プ リ ケーシ ョ ンの動作
ノ ー ド の リ セ ッ ト 時に、 以下の環境で SET CRASH =NOWAIT_TELL と な っ てい る
場合 :
•
リ セ ッ ト さ れない ノ ー ド
•
メ イ ン フ レーム接続 ク ラ イ ア ン ト
•
メ イ ン フ レーム接続 ク ラ イ ア ン ト
埋め込み SQL アプ リ ケーシ ョ ンの動作の説明は次の と お り です。
アプ リ ケーシ ョ ンは即時にセ ッ シ ョ ン を切断 し 、 以下の CLI エ ラ ー ・ コ ー ド のいず
れか 1 つを受け取 り ます。
コー ド
Error 219 (EM_DBC_CRASH_B)
Error 220 (EM_DBC_CRASH_A)
説明
サーバー接続が失われ ま し た ( ネ ッ ト ワ ー ク ま たは
サーバーの問題です )。
暗黙の CLI DISCONNECT 要求が出 さ れ、 ク ラ ッ シ ュ し た要求お よ びセ ッ シ ョ ン
に関連付け ら れていたすべての CLI リ ソ ース が解放 さ れ ます。 ク ラ ッ シ ュ し た
セ ッ シ ョ ン に関連付け ら れていたすべての未解決カー ソ ルお よ び動的文 も 解放 さ
れ ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
397
第 11 章 : ク ラ イ ア ン ト - サーバー接続文
SET ENCRYPTION
SET ENCRYPTION
目的
SQL 文ま たは SQL 文のブ ロ ッ ク の暗号化を オン ま たはオ フ に設定 し ます。
呼出 し
実行可能プ ロ グ ラ ム。
埋め込み SQL のみ。
構文
SET ENCRYPTION
ON
OFF
1101A298
ANSI への準拠
SET ENCRYPTION は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
暗号化の設定
SET ENCRYPTION ON を使用す る と 、 その後に実行 さ れ る ネ ッ ト ワ ー ク 全体のすべ
ての埋め込み SQL 文のデー タ が暗号化 さ れます。
SET ENCRYPTION OFF を実行す る ま で、 暗号化が続行 さ れます。
制限
• CLIv2 では ワ ー ク ス テーシ ョ ン ・ プ ラ ッ ト フ ォーム用のデー タ 暗号化がサポー ト
さ れてい る ため、 SET ENCRYPTION は ワー ク ス テーシ ョ ン ・ プ ラ ッ ト フ ォーム
用の C お よ び COBOL プ リ プ ロ セ ッ サでサポー ト さ れます。
• SET ENCRYPTION はすべての メ イ ン フ レーム ・ プ リ プ ロ セ ッ サでサポー ト さ れ
ません。 すべての メ イ ン フ レーム ・ プ リ プ ロ セ ッ サは、 SET ENCRYPTION 文に
対 し て コ ンパ イ ル ・ エ ラ ー ・ メ ッ セージ を生成 し ます。
• デー タ 暗号化を サポー ト し ない DBS サーバーを使っ て アプ リ ケーシ ョ ン を実行
し た場合、 暗号化を要求 し たすべての埋め込み SQL 文に対 し て、 pp2 は戻 り
コ ー ド を 500 に設定 し ます。 SQLCODE を確認 し て、 PPRTEXT を使っ てエ
ラ ー ・ メ ッ セージ を表示 し て く だ さ い。
398
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 :
埋め込み SQL を使用 し たマルチセ ッ
シ ョ ン非同期プ ログ ラ ミ ング
こ の章では、 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ を
サポー ト す る 機能について説明 し ます。
埋め込み SQL を使用 し たマルチセ ッ シ ョ ン ・ プ ログ ラ ミ ング
埋め込み SQL アプ リ ケーシ ョ ンは、 複数の Teradata セ ッ シ ョ ン を使用 し て並列要
求処理を実行す る よ う にプ ロ グ ラ ムす る こ と がで き ます。 こ の よ う な アプ リ ケー
シ ョ ンでは、 各セ ッ シ ョ ン ご と に 1 つずつ、 い く つかの要求を同時に転送す る こ と
がで き ます。
マルチセ ッ シ ョ ン ・ アプ リ ケーシ ョ ンは、 単一セ ッ シ ョ ン ・ アプ リ ケーシ ョ ン よ り
も 、 実装、 デバ ッ グ、 お よ び保守が よ り 複雑なので、 マルチセ ッ シ ョ ン ・ プ ロ グ ラ
ミ ン グ を実装す る 前に、 単一セ ッ シ ョ ンに対す る 複文要求で、 ス ループ ッ ト お よ び
応答時間要件を満たせ る か ど う かを判断すべ き です。
マルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グが必要な状況であ る と 判断 し た場合は、 プ リ プ
ロ セ ッ サが、 マルチセ ッ シ ョ ン ・ アプ リ ケーシ ョ ン を実装す る 機能を提供 し ます。
マルチセ ッ シ ョ ンの動作方法
使用す る 文
用途
CONNECT ま たは LOGON
と 、 AS session_id 句
各 Teradata セ ッ シ ョ ンに固有に名前を付け ます。 こ の処理
に よ っ て複数のセ ッ シ ョ ン を区別で き ます。
複数のセ ッ シ ョ ン を使用す る 場合、 アプ リ ケーシ ョ ンはそ
れぞれのセ ッ シ ョ ン に明示的に名前を付けなければな り ま
せん。
SET CONNECTION
名前を付けた各セ ッ シ ョ ン を、 CONNECT ま たは LOGON
文で指定 し た固有セ ッ シ ョ ン 識別子 を 使用 し て切 り 替え
ま す。
LOGOFF session_id
特定の名前のセ ッ シ ョ ン か ら ア プ リ ケーシ ョ ン を 切断 し
ま す。
LOGOFF ALL
すべてのセ ッ シ ョ ン か ら アプ リ ケーシ ョ ン を切断 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
399
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
埋め込み SQL を使用 し たマルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グ
非同期要求の動作方法
以下を実行 し た場合
セ ッ シ ョ ンの動作
ASYNC 句を実行可能
SQL 要求に追加す る 。
固有に名前を付けた要求を開始 し ます。
WAIT 文を使用す る 。
ANY、 ALL、 ま たは非同期要求の リ ス ト の完了を待機 し ます。
TEST 文を使用す る 。
非同期要求の完了を テ ス ト し 、 それが完了 し た後に要求の結
果を返 し ます。
セ ッ シ ョ ンは、 非同期要求の完了を待機せずにアプ リ ケー
シ ョ ン に制御を返 し ます。
ASYNC 文修飾子
プ リ プ ロ セ ッ サはそれぞれの非同期要求を、 実行可能 SQL 要求に先行す る ASYNC
文修飾子で指定 さ れた非同期要求識別子を使用 し て識別す る こ と がで き ます。
ASYNC 修飾子が実行可能 SQL 要求に追加 さ れ る と 、 その要求は現在のセ ッ シ ョ ン
で開始 さ れ、 非同期要求の完了を待機せずにアプ リ ケーシ ョ ンに制御を返 し ます。
詳細は、 「ASYNC 文修飾子」 (403 ページ ) を参照 し て く だ さ い。
WAIT 文
アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムは、 複数のセ ッ シ ョ ンに対 し て同時に保留 さ れた要
求を持つ こ と がで き ます。
WAIT 文を使用 し て、 以下の よ う に し て、 ANY、 ALL、 ま たは非同期要求の リ ス ト
の完了を待機 し ます。
•
アプ リ ケーシ ョ ンは、 WAIT ANY 構文を使用 し て非同期待機を呼び出す こ と が
で き ます。
未解決の非同期要求が完了す る と 待機は終了 し 、 セ ッ シ ョ ン識別子お よ び非同
期要求識別子を返 し ます。
• アプ リ ケーシ ョ ンは、 WAIT ANY 構文を使用 し てすべての非同期要求を待機す
る こ と がで き ます。
すべての未解決の要求が完了す る と 、 待機は終了 し ます。
• アプ リ ケーシ ョ ンは、 WAIT asynchronous_request_id_list 構文を使用 し て、 すべ
てのア ク テ ィ ブな非同期要求の非同期要求識別子を指定 し て、 非同期待機を呼
び出す こ と がで き ます。
すべての指定 し た要求が完了す る と 、 待機は終了 し ます。
WAIT についての詳細は、 「WAIT」 (415 ページ ) を参照 し て く だ さ い。
400
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
埋め込み SQL を使用 し たマルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グ
TEST 文
TEST 文は、 非同期要求の完了を テ ス ト し ます。 非同期要求が完了す る と 、 TEST を
使用 し て非同期要求の実行の状況を検索 し ます。
TEST を使用 し て、 要求の完了を待機す る こ と な し に、 未解決の非同期要求が完了
し たか ど う かを非同期にテ ス ト す る こ と も で き ます。 要求が完了 し ていない場合、
TEST は SQL の未完了を示す 'not yet complete' メ ッ セージ を返 し ます。
TEST は、 非同期要求に対 し て一度だけ、 お よ び要求の完了後だけに実行す る こ と
がで き ます。
詳細は、 「TEST」 (408 ページ ) を参照 し て く だ さ い。
SET CONNECTION 文
SET CONNECTION 文を使用す る と 、 複数のセ ッ シ ョ ン間でアプ リ ケーシ ョ ン を切
り 替え る こ と がで き ます。 詳細は、 「SET CONNECTION」 (390 ページ ) を参照。
埋め込み SQL ア プ リ ケーシ ョ ンのス テー タ ス変数およびデー タ 構造
埋め込み SQL アプ リ ケーシ ョ ンは、 い く つかの標準化 さ れた ス テー タ ス変数 と
デー タ 構造を使用 し て、 アプ リ ケーシ ョ ン と Teradata Database と の間で通信 し ます。
完了お よ び例外の ス テー タ ス ・ コ ー ド を受け取 る 、 以下の標準ホ ス ト 変数について
は、 第 4 章 : 「結果 コ ー ド 変数」 で説明 し てい ます。
• SQLSTATE( 「SQLSTATE」 (105 ページ ) を参照 )
• SQLCODE( 「SQLCODE」 (108 ページ ) を参照 )
SQL 記述領域 (SQLDA) と 呼ばれ る ANSI 準拠の構造は、 付録 B: 「SQL 記述子領
域 (SQLDA)」 で説明 さ れてい ます。
Teradata Database で こ れ と 似てい る SQLCODE と SQLSTATE は SQL 通信領域
(SQLCA) と 呼ばれ、 付録 C: 「SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)」 で説明 さ
れてい ます。
ア ク テ ィ ビ テ ィ ・ カ ウ ン ト ( 問い合わせに よ っ て返 さ れ る 行の数の列挙 ) も 、
多 く の ア プ リ ケ ーシ ョ ン に と っ て 有用です。 ア ク テ ィ ビ テ ィ ・ カ ウ ン ト は、
埋め込 SQL アプ リ ケーシ ョ ンの場合は SQLERRD 配列の 3 番目の語で報告 さ れ、
ス ト ア ド ・ プ ロ シージ ャ の場合は ACTIVITY_CODE と し て宣言 さ れ る ス テー タ
ス変数で報告 さ れます。
ア ク テ ィ ビ テ ィ ・ カ ウ ン ト について詳 し く は、 以下の項を参照 し て く だ さ い。
• 「ACTIVITY_COUNT」 (111 ページ )
• 付録 D: 「SQLSTATE のマ ッ ピ ン グ」
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
401
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
マルチセ ッ シ ョ ン非同期要求プ ロ グ ラ ミ ン グのサポー ト
マルチ セ ッ シ ョ ン 非同期要求プ ロ グ ラ ミ ン グのサポー ト
こ の節では、 マルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グ をサポー ト す る 埋め込み SQL 文
について説明 し ます。
• ASYNC
• TEST
• WAIT
SET CONNECTION 文は、 複数のセ ッ シ ョ ン間での切 り 替え を可能にす る こ と に
よ っ て、 マルチセ ッ シ ョ ン の埋め込み SQL プ ロ グ ラ ミ ン グ も サ ポー ト し ま す。
詳細は、 「SET CONNECTION」 (390 ページ ) を参照。
402
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
ASYNC 文修飾子
ASYNC 文修飾子
目的
SQL 文の非同期実行を指定 し ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
ASYNC
(
async_statement_identifier
)
async_SQL_statement
:async_statement_identifier_variable_name
1101C114
説明
構文要素
指定内容
async_statement_identifier
非同期で実行 さ れ る SQL 文に割 り 当て ら れ る 、 大文字小文
字を区別す る アプ リ ケーシ ョ ン提供の識別子。 し たが っ て、
TEST 文 と WAIT 文を使っ て、 こ の文へのア ク セ ス と 、 こ の
文の ス テー タ ス のテ ス ト お よ び報告が可能にな り ます。
それぞれの非同期文識別子は、 長 さ を最大で 30 文字にす る
こ と がで き 、 すべてのア ク テ ィ ブな接続で固有にす る 必要が
あ り ます。
:async_statement_
identifier_variable_name
複数の async_statement_identifier 文字列を提供す る ホ ス ト 変
数の名前。
ホ ス ト 変数を使用す る と 、 1 つの ASYNC 文で複数の非同期
セ ッ シ ョ ン を同時にサポー ト で き ます。
こ の識別子は、 最大で 30 文字の長 さ の固定長ま たは可変長
文字列にす る 必要があ り ます。
最初の コ ロ ンは必須。
async_SQL_statement
実行可能 SQL 文。
ホ ス ト 変数を使用 し た動的 SQL に よ り 、 間接的に
async_SQL_statement を ASYNC に渡せます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
403
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
ASYNC 文修飾子
ANSI への準拠
ASYNC 句は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
規則
• 1 つの接続で実行で き る 非同期文は、 1 つだけにな り ます。
1 つの接続において、 次の文を非同期処理す る には、 その前の非同期文の処理が
終了 し ていなければな り ません。 そ う でなければ、 実行時エ ラ ーが発生 し ます。
• それぞれの async_statement_identifier( 最大 30 バ イ ト ま で ) は全てのア ク テ ィ ブ
な接続の間で固有でなければな ら ず、 大文字 と 小文字を区別す る 。
• ASYNC は、 DECLARE CURSOR 文に よ っ て指定 さ れた カー ソ ル要求の中では無
効にな り ます。
• ASYNC は、 PREPARE ま たは EXECUTE IMMEDIATE 文で指定 さ れた動的要求
の中では無効にな り ます。
動的 SQL を使用 し て、 ホ ス ト 変数を介 し て非同期 SQL 文を ASYNC に間接的に
渡す こ と が で き ます ( 「例 5」 (407 ページ ) を参照 )。
• ASYNC は、 以下の埋め込み SQL 宣言文のいずれか と 共に使用す る こ と はで き
ません。
BEGIN DECLARE SECTION
INCLUDE
DECLARE CURSOR
INCLUDE SQLCA
DECLARE STATEMENT
INCLUDE SQLDA
DECLARE TABLE
SET BUFFERSIZE
END DECLARE SECTION
WHENEVER
• ASYNC は、 以下の実行可能埋め込み SQL 文のいずれか と 共に使用す る こ と は
で き ません。
404
ABORT
END TRANSACTION
BEGIN TRANSACTION
FETCH
REWIND
COMMIT
GET CRASH
SET BUFFERSIZE
CONNECT
LOGOFF
SET CHARSET
DATABASE
LOGON
SET CRASH
DESCRIBE
POSITION
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
ASYNC 文修飾子
例1
以下の例は、 ASYNC 文修飾子の使用方法を示 し てい ます。
以下の RDTIN フ ィ ール ド は、 ASYNC の使用において重要です。
RDTIN フ ィ ール ド
必須の指定
RdtVersn
10 に設定。
RdtExt
'Y' に設定。 拡張機能領域の存在を示す。
RdtXTotL
RDTXASYN 拡張機能領域のサ イ ズ を含む。
RdtX008 (RDTXASYN) 構造は、 接続名 と 通信す る ので、 拡張機能領域のいずれか と
し て組み込む必要があ り ます。
EXEC SQL ASYNC (INSEMP)
INSERT EMPLOYEE VALUES (2010,1003,2216,8201,'JONES',
'FREDDY','20/06/14','19/05/25',200000);
例 1 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 StrLen;
char
Str[93];
} Sql_Stmt016 =
{93,{' '}};
static struct {
SQLInt32
SQLInt16
SQLInt16
char
SQLInt32
char
char
char
char
char
SQLInt32
SQLInt32
char
char
char
char
char
char
char
char
SQLInt16
char
struct {
RdtCType;
RdtVersn;
RdtDec;
RdtUserid[8];
RdtEntty;
*RdtCA;
*RdtDAIn;
*RdtDAOut;
*RdtSql;
*RdtRtCon;
RdtAux1;
RdtAux2;
RdtLCS;
RdtComit;
RdtRelse;
RdtExt;
RdtSepBT;
RdtUCStm;
RdtCmpat;
RdtComp;
RdtXTotL;
RdtXFill[2];
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
405
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
ASYNC 文修飾子
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXAsyC;
struct {
SQLInt16 RdtXAsyL;
char
RdtXAsyT[30];
} RdtXAsyS;
} RdtX008;
} RDTIN016 =
{300,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
52,{' '},{8,5,255},{40,8,1,{6,'I','N','S','E','M','P',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' '}}};
memcpy(Sql_Stmt016.Str,"INSERT EMPLOYEE VALUES ( 2010,1003,2216,8201,'\
JONES', 'FREDDY','20/06/14','19/05/25',200000 )",93);
RDTIN016.RdtSql = (char *)(&Sql_Stmt016);
RDTIN016.RdtCA = (char *)(&sqlca);
RDTIN016.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN016);
SQL_RDTRTCON = RDTIN016.RdtRtCon;
}
例2-5
こ れ ら の例は、 ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ ・ コ ー ド の コ ン テ キ ス ト がない
ASYNC 文修飾子の SQL テ キ ス ト を表わ し てい ます。
例2
以下の例は、 カー ソ ルを開 く ための非同期要求を実行 し ます。
ASYNC (request_1) OPEN cursor_1
例3
以下の例は、 表の検索更新を実行す る ための非同期要求を実行 し ます。
ASYNC (request_1) UPDATE table_1
SET a = :a
例4
以下の例は、 マ ク ロ を実行す る ための非同期要求を実行 し ます。
ASYNC (request_1) EXEC macro_1
406
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
ASYNC 文修飾子
例5
こ の例では、 動的 SQL を使用 し て、 ホ ス ト 変数に よ っ て非同期 SQL 文を ASYNC
に渡 し ます。
strcpy (SQL_STATEMENT.arr,"DELETE FROM TABLE1 WHERE FIELD1 = ?");
SQL_STATEMENT.len = strlen (SQL_STATEMENT.arr);
EXEC SQL PREPARE s1 FROM :sql_statement;
EXEC SQL ASYNC (stmt01) EXECUTE s1 USING :var1;
関連 ト ピ ッ ク
非同期要求の完了ス テー タ ス のテ ス ト についての詳細は、 「TEST」 (408 ページ ) を
参照 し て く だ さ い。
非同期要求の完了の待機についての詳細は、 「WAIT」 (415 ページ ) を参照 し て く だ
さ い。
動的 SQL についての詳細は、 「動的 SQL 文の構文」 を参照 し て く だ さ い。
SQL 文を動的に準備 し て実行す る 方法については、 「EXECUTE ( 動的 SQL 形式 )」
(358 ページ ) お よ び 「PREPARE」 (362 ページ ) の説明を参照 し て く だ さ い。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
407
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
TEST
目的
async_statement_identifier に よ っ て識別 さ れ る 非同期 SQL 文の完了状態を テ ス ト し
ます。
WAIT 文 と と も に使用す る と 、 async_statement_modifier ま たは host_variable_name に
よ っ て識別 さ れ る 非同期 SQL 文の完了状態を返 し ますが、 要求が未完了の場合に
待機 し ません。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
TEST
async_statement_identifier
COMPLETION
:async_statement_identifier_variable_name
1101B045
説明
構文要素
指定内容
async_statement_identifier
ASYNC 修飾子に よ っ て割 り 当て ら れた、 非同期で実行 さ れ
る SQL 文の、 大文字小文字を区別す る アプ リ ケーシ ョ ン提
供の識別子。
それぞれの非同期文識別子は、 長 さ を最大で 30 文字にす る
こ と がで き 、 すべてのア ク テ ィ ブな接続で固有にす る 必要が
あ り ます。
:async_statement_
identifier_variable_name
非同期文識別子を備え た ホ ス ト 変数の名前。
こ の識別子は、 最大で 30 文字の長 さ の固定長ま たは可変長
文字列にす る 必要があ り ます。
最初の コ ロ ンは必須。
ANSI への準拠
TEST は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
408
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
規則
• 個々の async_statement_identifier assignment には大文字 と 小文字の区別があ り 、
すべてのア ク テ ィ ブな接続の間で固有にな っ てい る 必要があ る 。
• 個々の async_statement_identifier の最大長は 30 バ イ ト であ る 。
• :async_statement_identifier_variable_name の変数は固定長ま たは可変長の文字変数
で、 30 バ イ ト を超え てはな ら ない。
• 未処理の非同期 SQL 文が存在 し なければ、 例外条件 「no outstanding
asynchronous SQL statement」 が発生す る 。
• SQLCODE は -650 に設定 さ れ る 。
•
SQLSTATE は '04000' に設定 さ れ る 。
• 指定 さ れた非同期 SQL 文が未完了の場合、 例外条件 「SQL statement not yet
complete」 が発生す る 。
• SQLCODE は -651 に設定 さ れ る 。
•
SQLSTATE は '03000' に設定 さ れ る 。
• 指定 さ れた非同期 SQL 文が完了 し てい る 場合、 以下の操作が行なわれ る 。
a
ラ ン タ イ ムは要求の処理を終え、 SQLCODE ま たは SQLSTATE を介 し て完了
状態を返す。
async_statement_identifier に よ っ て指定 さ れた SQL 文を参照す る こ と がで き な
く な る。
• 以下の要求 タ イ プでは、 TEST は実行で き ない。
b
•
DECLARE CURSOR 文に よ っ て指定 さ れ る カー ソ ル要求。
•
PREPARE ま たは EXECUTE IMMEDIATE 文で指定 さ れた動的要求。
例1-3
以下の RDTIN フ ィ ール ド は、 こ れ ら の例において重要です。
RDTIN フ ィ ール ド
必須の指定
RdtCType
460 に設定。
RdtVersn
10 に設定。
RdtExt
'Y' に設定。 拡張機能領域の存在を示す。
RdtXTotL
RDTXASYN 拡張機能領域のサ イ ズ を含む。
さ ら に、 RdtX008 (RDTXASYN) 構造は、 接続名 と 通信す る ので、 拡張機能領域のい
ずれかを組み込む必要があ り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
409
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
例1
こ の例では、 明示的に指定 さ れた非同期文識別子を使用 し ます。
EXEC SQL TEST ASYNSTMT1 COMPLETION;
例 1 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtRfu1;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXAsyC;
struct {
SQLInt16 RdtXAsyL;
char
RdtXAsyT[30];
} RdtXAsyS;
} RdtX008;
} RDTIN011 =
{460,9,0,{' '},0,0,0,0,0,0,0,0,'N','C','N','Y','N','N',' ','C'
,52,{' '},{8,5,255},{40,8,1,{9,'A','S','Y','N','S','T','M','T'
,'1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' '}}};
...
RDTIN011.RdtX008.RdtXAsyL = strlen(STMTNAMF);
memcpy(RDTIN011.RdtX008.RdtXAsyT,STMTNAMF,strlen(STMTNAMF));
...
}
410
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
例2
以下の例では、 ホ ス ト 変数を使用 し て非同期文識別子を取得 し ます。
EXEC SQL TEST :STMTNAMV COMPLETION;
例 2 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXAsyC;
struct {
SQLInt16 RdtXAsyL;
char
RdtXAsyT[30];
} RdtXAsyS;
} RdtX008;
} RDTIN017 =
{460,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
52,{' '},{8,5,255},{40,8,1,}};
RDTIN017.RdtX008.RdtXAsyS.RdtXAsyL = STMTNAMV.len;
memcpy(RDTIN017.RdtX008.RdtXAsyS.RdtXAsyT,STMTNAMV.arr,STMTNAMV.len);
RDTIN017.RdtCA = (char *)(&sqlca);
RDTIN017.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN017);
SQL_RDTRTCON = RDTIN017.RdtRtCon;
}
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
411
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
例3
以下の例では、 ホ ス ト 変数を使用 し て、 固定長文字列 と し て非同期文識別子を渡 し
ます。
EXEC SQL TEST :STMTNAMF COMPLETION;
例 3 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXAsyC;
struct {
SQLInt16 RdtXAsyL;
char
RdtXAsyT[30];
} RdtXAsyS;
} RdtX008;
} RDTIN018 =
{460,10,0,{' '},0,0,0,0,0,0,0,0,'N','B','N','Y','N','N',' ','C',
52,{' '},{8,5,255},{40,8,1,}};
RDTIN018.RdtX008.RdtXAsyS.RdtXAsyL = strlen(STMTNAMF);
memcpy(RDTIN018.RdtX008.RdtXAsyS.RdtXAsyT,STMTNAMF,strlen(STMTNAMF));
RDTIN018.RdtCA = (char *)(&sqlca);
RDTIN018.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN018);
SQL_RDTRTCON = RDTIN018.RdtRtCon;
}
412
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
例1-3
以下の例は、 ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ ・ コ ー ド の コ ン テ キ ス ト がない TEST
文の SQL テ キ ス ト を表わ し てい ます。
例1
こ の例では、 req_1 と い う 名前で識別 さ れ る 文の完了状態を テ ス ト し 、 適切な例外
コ ー ド ま たは完了 コ ー ド を SQLCODE ま たは SQLSTATE に返 し ます。
名前 req_1 は、 async_statement_modifier 変数を使っ て ASYNC 句で定義 さ れます。
TEST req_1 COMPLETION
例2
こ の例では、 ホ ス ト 変数 :reqid_var で識別 さ れ る 文の完了状態を テ ス ト し 、 適切な
例外 コ ー ド ま たは完了 コ ー ド を SQLCODE ま たは SQLSTATE に返 し ます。
:reqid_var 内に入 る 名前は、 ASYN 句で async_statement_modifier 変数を使っ て定義
さ れます。
TEST :reqid_var COMPLETION
例3
こ の例では WAIT と と も に TEST を使用 し ま す。 プ ロ グ ラ ム は非同期的に 2 つの
更新要求 ( それぞれ req_1、 req_2) を作成 し 、 req_1 と req_2 の両方が完了す る のを
待っ てか ら 次に進みます。
TEST 文は SQLCODE を監視 し ます。 req_1 お よ び req_2 の両方か ら 成功 し た完了
コ ー ド (SQLCODE = 0) が返 さ れ る ま では、 メ イ ン ・ プ ロ グ ラ ムの残 り の部分に進み
ません。
いずれかの要求が未完了の場合 (SQLCODE = -651) には、 待機を続け ます。
両方の文が完了 し た ら 、 メ イ ン ・ プ ロ グ ラ ムは処理を続け ます。
SQL 以外の文は擬似 コ ー ド で あ り 、 WAIT 文 と TEST SQL 文が ホ ス ト ・ メ イ ン ・
プ ロ グ ラ ム内で ど の よ う な位置に置かれ る か をおおま かに例示 し ます。
...
EXEC-SQL
ASYNC req_1
UPDATE table_a
SET a = :a;
EXEC-SQL
ASYNC req_2
UPDATE table_b
SET b = :b;
...
100 EXEC-SQL
WAIT req_1, req_2 COMPLETION;
...
EXEC-SQL
TEST req_1 COMPLETION;
IF SQLCODE = -651 THEN GOTO 100
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
413
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
TEST
IF SQLCODE = 0 THEN CONTINUE
EXEC-SQL
TEST req_2 COMPLETION;
IF SQLCODE = -651 THEN GOTO 100
IF SQLCODE = 0 THEN CONTINUE
...
関連 ト ピ ッ ク
非同期要求を実行依頼す る 方法については、 「ASYNC 文修飾子」 (403 ページ ) を参
照 し て く だ さ い。
非同期要求の待機、 お よ びその状態のテ ス ト の方法については、 「WAIT」 (415 ペー
ジ ) を参照 し て く だ さ い。
414
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
WAIT
目的
呼び出 さ れてい る プ ロ グ ラ ムの実行を一時停止 し 、 1 つま たは複数の非同期 SQL 文
が完了す る の を待ち ます。
呼び出 し
実行可能形式。
埋め込み SQL のみ。
構文
,
async_statement_identifier
WAIT
COMPLETION
:async_statement_identifier_variable_name
ALL
ANY COMPLETION INTO
statement_variable
:
session_variable
:
1101B009
説明
構文要素
指定内容
async_statement_identifier
ASYNC 修飾子に よ っ て割 り 当て ら れた、 非同期で実行 さ れ
る SQL 文の、 大文字小文字を区別す る アプ リ ケーシ ョ ン提供
の識別子。
それぞれの非同期文識別子は、 長 さ を最大で 30 文字にす る
こ と がで き 、 すべてのア ク テ ィ ブな接続で固有にす る 必要が
あ り ます。
async_statement_identifier_
variable_name
WAIT 文に渡 さ れ る 非同期文識別子 を 備 え た ホ ス ト 変数の
名前。
こ の識別子は、 最大で 30 文字の長 さ の固定長ま たは可変長
文字列にす る 必要があ り ます。
こ の値を指定す る と 、 アプ リ ケーシ ョ ン がホ ス ト 変数に よ っ
て async_statement_identifier の複数の値を WAIT に提供で き
ま す。
前に付け る コ ロ ンは必須ではあ り ませんが、 適正なプ ロ グ ラ
ミ ン グの慣行に従 う も のです。
ALL
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
現在の非同期実行 SQL 文すべての実行を一時停止 し ます。
415
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
構文要素
指定内容
async_statement_variable
要求が完了 し た非同期文の識別子が入 る ホ ス ト 変数の名前。
session_variable
完了 し た async_statement_variable のセ ッ シ ョ ン識別子が書 き
込まれ る ホ ス ト 変数の名前。
ANSI への準拠
WAIT は、 ANSI/ISO SQL:2011 規格に対す る Teradata の拡張機能です。
許可
な し。
規則
• それぞれの async_statement_identifier( 最大 30 バ イ ト ま で ) は全てのア ク テ ィ ブ
な接続の間で固有でなければな ら ず、 大文字 と 小文字を区別す る 。
• 未処理の非同期 SQL 文が存在 し なければ、 例外条件 「no outstanding
asynchronous SQL statement」 が発生す る 。
• SQLCODE は -650 に設定 さ れ る 。
•
SQLSTATE は '04000' に設定 さ れ る 。
指定す る オプシ ョ ン
WAIT 文が結果を返す時点
ALL
すべての非同期文の終了時。
ANY COMPLETION
INTO
未解決の非同期文の終了時。
非同期文の識別子は INTO 句のホ ス ト 変数
async_statement_variable に返 さ れ、 セ ッ シ ョ ン識別子
はホ ス ト 変数 session_variable に返 さ れ ます。
ホ ス ト 変数 async_statement_variable お よ び
session_variable は固定長ま たは可変長の文字変数で、
最大長が 30 バ イ ト でなければな り ません。
返 さ れ る 非同期文識別子が出力ホ ス ト 変数に定義 さ れ
た長 さ よ り も 長い場合、 例外条件 「output host variable
is too small to hold returned data」 が発生 し ます。
• SQLCODE は -304 に設定 さ れ る 。
• SQLSTATE は '22003' に設定 さ れ る 。
• 以下の要求 タ イ プでは、 WAIT を実行で き ません。
• DECLARE CURSOR 文に よ っ て指定 さ れ る カー ソ ル要求。
•
416
PREPARE ま たは EXECUTE IMMEDIATE 文で指定 さ れた動的要求。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
例1-4
以下の RDTIN フ ィ ール ド は、 以下の WAIT 文の例において重要です。
RDTIN フ ィ ール ド
必須の指定
RdtCType
470 に設定。
RdtAux1
次の値のいずれかに設定。
• すべての非同期文の完了を待機す る 。
• いずれかの非同期文の完了を待機す る 。
• リ ス ト さ れた指名の非同期文の完了を待機す る 。
RdtVersn
10 に設定。
RdtExt
'Y' に設定。 非同期文を指定 し た場合にのみ、 拡張機能領域の
存在を示す。
RdtXTotL
RDTXASYN 拡張機能領域のサ イ ズ を含む。 非同期文を指定 し
た場合のみ。
さ ら に、 非同期文を指定 し た場合、 RdtX008 (RDTXASYN) 構造は接続名 と 通信す る
ので、 拡張機能領域のいずれか を組み込む必要があ り ます。
例1
こ の例では、 固定長の文字値を、 ANY COMPLETION INTO 句内の文お よ びセ ッ
シ ョ ン変数に対 し て宣言 さ れた ホ ス ト 変数に渡 し ます。
EXEC SQL WAIT ANY COMPLETION INTO :STMTNAMF, :CONNAMEF;
例 1 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
char
sqldaid[8];
SQLInt32 sqldabc;
short
sqln;
short
sqld;
struct {
short
sqltype;
short
sqllen;
char
*sqldata;
char
*sqlind;
struct {
short
length;
char
data[30];
} sqlname;
} sqlvar[2];
} Sql_DA019_StructO =
{'S','Q','L','D','A',' ',' ',' ',104,2,2,{{460,31,0,0,{0,{' '}}}
,{460,31,0,0,{0,{' '}}}}};
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
417
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
Sql_DA019_StructO.sqlvar[0].sqldata = STMTNAMF;
Sql_DA019_StructO.sqlvar[1].sqldata = CONNAMEF;
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN019 =
{470,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',
' ','C',12,{' '},{8,5,255}};
RDTIN019.RdtDAOut = (char *)(&Sql_DA019_StructO);
RDTIN019.RdtCA = (char *)(&sqlca);
RDTIN019.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN019);
SQL_RDTRTCON = RDTIN019.RdtRtCon;
}
}
例2
こ の例では、 可変長の文字値を、 ANY COMPLETION INTO 句内の文お よ びセ ッ
シ ョ ン変数に対 し て宣言 さ れた ホ ス ト 変数に渡 し ます。
EXEC SQL WAIT ANY COMPLETION INTO :STMTNAMV, :CONNAMEV;
418
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
例 2 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
char
sqldaid[8];
SQLInt32 sqldabc;
short
sqln;
short
sqld;
struct {
short
sqltype;
short
sqllen;
char
*sqldata;
char
*sqlind;
struct {
short
length;
char
data[30];
} sqlname;
} sqlvar[2];
} Sql_DA020_StructO =
{'S','Q','L','D','A',' ',' ',' ',104,2,2,{{448,30,0,0,{0,{' '}}}
,{448,30,0,0,{0,{' '}}}}};
Sql_DA020_StructO.sqlvar[0].sqldata = (char *)(&STMTNAMV);
Sql_DA020_StructO.sqlvar[1].sqldata = (char *)(&CONNAMEV);
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN020 =
{470,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
419
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
' ','C',12,{' '},{8,5,255}};
RDTIN020.RdtDAOut = (char *)(&Sql_DA020_StructO);
RDTIN020.RdtCA = (char *)(&sqlca);
RDTIN020.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN020);
SQL_RDTRTCON = RDTIN020.RdtRtCon;
}
}
例3
こ の例では、 ALL COMPLETION オプシ ョ ン を使用 し て、 すべてのア ク テ ィ ブな非
同期文が完了す る ま で待機 し ます。
EXEC SQL WAIT ALL COMPLETION;
例 3 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN021 =
{470,10,0,{' '},0,0,0,0,0,0,1,0,'N','B','N','Y','N','N',' ','C',
12,{' '},{8,5,255}};
RDTIN021.RdtCA = (char *)(&sqlca);
RDTIN021.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN021);
SQL_RDTRTCON = RDTIN021.RdtRtCon;
}
420
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
例4
こ の例では、 複数の明示的な非同期文を使用 し ます。
EXEC SQL WAIT ASYNSTMT1, ASYNSTMT2 COMPLETION;
例 4 で C Preprocessor2 によ っ て生成 さ れる行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char
RdtUserid[8];
SQLInt32 RdtEntty;
char
*RdtCA;
char
*RdtDAIn;
char
*RdtDAOut;
char
*RdtSql;
char
*RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char
RdtLCS;
char
RdtComit;
char
RdtRelse;
char
RdtExt;
char
RdtSepBT;
char
RdtUCStm;
char
RdtCmpat;
char
RdtComp;
SQLInt16 RdtXTotL;
char
RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXAsyC;
struct {
SQLInt16 RdtXAsyL;
char
RdtXAsyT[30];
} RdtXAsyS[2];
} RdtX008;
} RDTIN022 =
{470,10,0,{' '},0,0,0,0,0,0,3,0,'N','B','N','Y','N','N',' ','C',
84,{' '},{8,5,255},{72,8,2,{{9,'A','S','Y','N','S','T','M','T',
'1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' '},{9,'A','S','Y','N','S','T','M','T','2',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' '}}}};
RDTIN022.RdtCA = (char *)(&sqlca);
RDTIN022.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN022);
SQL_RDTRTCON = RDTIN022.RdtRtCon;
}
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
421
第 12 章 : 埋め込み SQL を使用 し たマルチセ ッ シ ョ ン非同期プ ロ グ ラ ミ ン グ
WAIT
例1-4
以下の例は、 ク ラ イ ア ン ト ・ プ ロ グ ラ ミ ン グ ・ コ ー ド の コ ン テ キ ス ト がない WAIT
文の SQL テ キ ス ト を表わ し てい ます。
例1
以下の例は、 基本的な WAIT 文を示 し てい ます。 req_1 と い う SQL 要求が完了す る
と 、 WAIT はプ ロ グ ラ ムに制御を戻 し ます。
WAIT req_1 COMPLETION
例2
以下の例は よ り 複雑な WAIT 文で、 非同期文の識別子を 2 つ指定 し ます。 req_1 お
よ び req_2 の両方が完了 し た時点で、 WAIT はプ ロ グ ラ ムに制御を戻 し ます。
WAIT req_1, req_2 COMPLETION
例3
以下の例では、 全ての未処理の非同期 SQL 文の完了を待機 し て、 全てが完了 し た
時点でプ ロ グ ラ ムに制御を戻 し ます。
WAIT ALL COMPLETION
例4
以下の例では、 いずれかの未処理の非同期 SQL 要求が完了す る の待機 し 、 いずれ
かが完了す る と プ ロ グ ラ ムに制御を戻 し ます。 こ の と き 、 完了 し た非同期文の識別
子を :requid_var に、 要求が完了 し たセ ッ シ ョ ンの識別子を :sessid_var にそれぞれ返
し ます。
WAIT COMPLETION INTO :reqid_var, :sessid_var
関連 ト ピ ッ ク
非同期要求を実行依頼す る 方法については、 「ASYNC 文修飾子」 (403 ページ ) を参
照 し て く だ さ い。
非同期要求の完了を待たずにその状態を テ ス ト す る 方法については、
「TEST」 (408 ページ ) を参照 し て く だ さ い。
422
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 A :
表記法
こ の付録では、 こ のマニ ュ アルで使用 し てい る 表記上の規則について説明 し ます。
構文図 - オプシ ョ ン を含め、 SQL の構文規則の書式を説明す る ために使用 し てい
ます。
構文図の規則
表記法
項目
定義 / 注釈
文字
アルフ ァ ベ ッ ト の A か ら Z ま での大文字ま たは小文字。
数値
0 か ら 9 ま での数字。
3 桁よ り 大き い数値を入力する場合で も 、 コ ンマは使用し ないで く だ さ い。
語
キー ワー ド お よ び変数。
• 大文字 (UPPERCASE LETTERS) は、 キー ワー ド を表わ し ます。
構文図では、 オペレーテ ィ ン グ ・ シ ス テ ム の制限に よ っ て小文字でな
ければな ら ない場合を除いて、 SQL 文のキー ワー ド はすべて大文字で
表示 さ れ ます。
• 小文字 (lowercase letters) は、 Linux コ マ ン ド な ど の よ う に、 小文字で入
力す る 必要があ る キー ワー ド を表わ し ます。
• 大文字 と 小文字の混合を使用 し て、 大文字、 小文字、 ま たは混合で入
力可能な関数、 メ ソ ッ ド 、 お よ びその他の非 SQL キー ワー ド を表わす
こ と がで き ます。
• 斜体の小文字 (lowercase italic letters) は、 列名や表名な ど の変数を表わ
し ます。
変数は、 適正な値に置 き 換え て く だ さ い。
• 太字の小文字 (lowercase bold letters) は、 構文図か ら の抜粋を表わ し ま
す。 抜粋は、 その抜粋部分を含む構文図のす ぐ下で定義 さ れてい ます。
• 下線付 き の文字 (UNDERLINED LETTERS) は、 デフ ォ ル ト 値を表わ し
ます。
下線は、 大文字の語 と 小文字の語の ど ち ら に も 適用 さ れます。
スペース
キー ワー ド 間や変数間な ど、 項目 と 項目の間に スペース を 1 つ入れます。
句読点
構文図に表示す る 場合は、 すべて の句読点 を 正確に入力す る 必要が あ り
ま す。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
423
付録 A: 表記法
構文図の規則
線
構文図中の主線は、 左端のキー ワー ド か ら 始ま り 、 左か ら 右に、 構文図の終わ り を
示す縦線ま で進みます。 矢印ま たは縦線のない線は、 構文の一部だけ を示 し た も の
です。
ループは、 線の中で唯一右か ら 左に読み取 る 部分です。
継続 リ ン ク
1 行だけでは示 し き れない線には、 継続 リ ン ク を使用 し ます。 継続 リ ン ク は、 リ ン
ク の開始 と 終了を示す文字を円で囲んだ も のです。
A
A
FE0CA002
円で囲まれた文字が構文図の中にあ る 場合は、 それに対応す る 円で囲まれた文字の
あ る 箇所に移動 し て読み進めて く だ さ い。
必須項目
必須項目は、 主線上に表示 し ます。
SHOW
FE0CA003
複数の項目か ら 選択す る 場合、 選択項目は縦に並んで記載 さ れます。 最初の項目
が、 主線上に表示 さ れます。
SHOW
CONTROLS
VERSIONS
FE0CA005
任意選択項目
任意選択項目は、 含め る こ と も 無視す る こ と も で き ます。 任意選択項目は、 主線 よ
り 下に表示 し ます。
SHOW
CONTROLS
424
FE0CA004
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 A: 表記法
構文図の規則
複数の項目か ら の任意選択が可能な場合は、 すべての選択肢を主線 よ り 下に表示 し
ます。
READ
SHARE
ACCESS
JC01A010
コ マ ン ド や文には、 任意選択項目のいずれか をデフ ォ ル ト 値 と し て扱 う も のがあ り
ます。 こ の値には、 下線 (UNDERLINED) が付け ら れてい ます。 任意選択項目をい
ずれ も 選択 し ないで、 こ れ ら の コ マ ン ド や文を入力す る と 、 デフ ォ ル ト 値が選択 さ
れた こ と にな り ます。
文字列
文字列 リ テ ラ ルは、 単一引用符で囲んで示 し ます。
'msgtext '
JC01A004
略語
キー ワー ド ま たは予約語に有効な略語があ る 場合、 主線内には常に省略 し ない完全
形が示 さ れます。 有効な略語の う ち最 も 短い も のが主線の下側に示 さ れます。
SHOW
CONTROLS
CONTROL
FE0CA042
上記の構文では、 次の 2 つの形式が有効です。
• SHOW CONTROLS
• SHOW CONTROL
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
425
付録 A: 表記法
構文図の規則
ループ
ループは、 複数回繰 り 返す こ と ので き る 項目 ( ま たは項目のグループ ) の こ と です。
構文図では、 主線の上を通 り 、 繰 り 返す こ と ので き る 項目の手前に戻 る 線に よ っ
てループを示 し ます。
,
,
(
cname
3
4
)
JC01B012
ループは、 右か ら 左に読み進めて く だ さ い。
次の よ う な表記規則が、 ループに適用 さ れます。
状況
表記規則
ループ の最大数が制限 さ れ て
いる
ループの制限回数が戻 り 線上の円内に示 さ れ ます。
必要なループの最小数が制限 さ
れてい る
入力項 と 入力項の間に区切 り
文字が必要
上記の例では、 cname を最大 4 回入力で き ます。
ループの制限回数が戻 り 線上の四角内に示 さ れ ます。
上記の例では、 少な く と も 3 つのグループの列名を入
力す る 必要があ り ます。
区切 り 文字が戻 り 線上に表示 さ れ ます。
構文図に区切 り 文字が示 さ れていない場合は、 半角ス
ペース を 1 つ入れて く だ さ い。
上記の例では、 コ ン マが区切 り 文字です。
入力項の前後に区切 り 文字が
必要
開始文字 と 終了文字は リ タ ーン ・ パ ス の外側に表示 さ
れ ます。
通常、 区切 り 文字 と 入力項の間に スペース は必要あ り
ません。
上記の例では、 左括弧 と 右括弧が区切 り 文字です。
抜粋
構文句の一部が大 き すぎ て、 構文図に入 り き ら ない こ と があ り ます。 その よ う な句
は、 その部分で線を中断 し 、 その前後に区切 り 記号 (|) を付け ます。 区切 り 記号の
間には、 抜粋 し た部分の名前が太字で表示 さ れます。
426
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 A: 表記法
構文図の規則
抜粋名 ( 太字 ) と 抜粋 し た句は、 主構文図のす ぐ下に表示 し ます。 抜粋 し た句の開
始 と 終了は、 通常の水平線で表わ し ます。
LOCKING
excerpt
A
A
HAVING
con
excerpt
where_cond
,
cname
,
col_pos
JC01A014
正当な句が複数ある場合
複数の句が正当 と な る ケース も 、 構文図で示す こ と が出来ます。
dbname
DATABASE
tname
TABLE
vname
VIEW
JC01A016
こ の例では、 以下のいずれの句 も 正当にな り ます。
• dbname
• DATABASE dbname
• tname
• TABLE tname
• vname
• VIEW vname
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
427
付録 A: 表記法
構文図の規則
構文図の例
,
CREATE VIEW
viewname
AS
A
LOCKING
cname
CV
LOCK
ACCESS
dbname
A
DATABASE
SHARE
FOR
IN
tname
READ
TABLE
WRITE
EXCLUSIVE
vname
VIEW
EXCL
,
B
SEL
B
MODE
expr
,
FROM
qual_cond
tname
C
.aname
C
HAVING cond
;
qual_cond
,
WHERE cond
GROUP BY
cname
,
col_pos
JC01A018
図の識別子
各図の右下に示 さ れた英数字の文字列は、 図を分類す る ために使用 さ れ る 内部識別
子です。 説明文で、 こ の文字列を参照す る こ と はあ り ません。
428
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 B :
SQL 記述子領域 (SQLDA)
SQL 記述領域 (SQLDA) と は、 単一行の SELECT を動的に実行 し て各々の値を作成
す る 、 個々の項目記述子の リ ス ト を備え たデー タ 構造です。
ア プ リ ケーシ ョ ン は、 検索 さ れ る 行に あ る 列数、 そのデー タ ・ タ イ プ、 サ イ ズ、
精度な ど の情報を入手 し て、 実行時に動的に検索 さ れ る 値を処理す る 方法を認識す
る こ と がで き ます。
ANSI への準拠
SQL 記述子領域は、 ANSI/ISO SQL:2011 に準拠 し てい ます。
SQLDA を 使用す る SQL 文
SQLDA は、 DESCRIBE 文では必須です。
SQLDA は、 以下の文では任意指定です。
• EXECUTE
• 動的 FETCH
• 動的 OPEN
• PREPARE
SQL 文が SQLDA を 使用す る 方法
さ ま ざ ま な SQL 文が、 SQLDA の情報を さ ま ざ ま な方法で使用 し ます。
文
SQLDA に よ っ て提供 さ れ る 情報
DESCRIBE
準備済み SQL 文
PREPARE
EXECUTE
ホ ス ト 変数
動的 FETCH
動的 OPEN
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
429
付録 B: SQL 記述子領域 (SQLDA)
アプ リ ケーシ ョ ン用の SQLDA の定義
ア プ リ ケーシ ョ ン 用の SQLDA の定義
動的 SQL を発行す る アプ リ ケーシ ョ ンは、 独自の SQLDA を定義 し て、 SQLDA
フ ィ ール ド の内容を管理す る 必要があ り ます。
SQLDA 構造を直接コーデ ィ ン グする か、 INCLUDE SQLDA 文を使用し て コーデ ィ ン
グす る こ と がで き ます ( 「INCLUDE SQLDA」 (347 ページ ) を参照 )。
INCLUDE SQLDA を使用 し て、 COBOL で SQLDA を定義す る こ と はで き ません。
430
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 B: SQL 記述子領域 (SQLDA)
SQLDA の構造
SQLDA の構造
以下の表では、 SQLDA の フ ィ ール ド について説明 し ます。
フ ィ ール
ド名
書式
説明
SQLDAID
CHARACTER(8)
SQLDA 文字を含みます。
SQLDABC
INTEGER
SQLDA の長 さ 。 (16 + (44 * SQLN 値 )) の式で計算 さ
れ、 INTO 句を指定 し た DESCRIBE 文ま たは
PREPARE 文の実行時にプ リ プ ロ セ ッ サに よ っ て設定
さ れます。
入力の場合、 アプ リ ケーシ ョ ンは こ の フ ィ ール ド を
SQLDA 構造のサ イ ズにセ ッ ト す る 必要があ り ます。
出力の場合、 プ リ プ ロ セ ッ サは、 こ のサ イ ズ を
DESCRIBE ま たは PREPARE INTO 要求に よ っ て戻 さ
れ る 列数 (SQLD) が十分入 る だけのサ イ ズにセ ッ ト し
ます。
SQLN
SHORT INTEGER
SQLVAR 配列内の要素の合計数。
アプ リ ケーシ ョ ンは、 こ の フ ィ ール ド を プ リ プ ロ セ ッ
サ (SQLVAR) が使用で き る 要素数に設定 し ます。
入力の場合、 SQLN は OPEN ま たは EXECUTE 文の前
に設定す る 必要があ り ます。
出力の場合、 SQLN は DESCRIBE ま たは PREPARE
INTO 要求の前に設定す る 必要があ り ます。
USING 節の BOTH オプ シ ョ ン を 使用す る 場合は、
最低 2 度は戻 さ れ る 列 と し て SQLVAR 要素数を指定
す る 必要があ り ます。
SQLD
SHORT INTEGER
変数の記述を保持す る ために現在使用 さ れてい る
SQLVAR 配列内の要素数 ( 「SQLVAR」 を参照 )。
入力の場合、 アプ リ ケーシ ョ ンは、 こ の フ ィ ール ド を
入力変数情報で使用す る SQLVAR 要素数に設定 し
ま す。
こ の値は、 OPEN ま たは EXECUTE 文の前に設定す る
必要があ り ます。
出力の場合、 プ リ プ ロ セ ッ サは、 DESCRIBE ま たは
PREPARE INTO 要求を使用 し た SQLVAR 要素の数を
戻 し ます。
定義さ れてい る要素が少ないため DESCRIBE の条件を
満た さ ない場合、 SQLD は必要な数に設定 さ れ、
SQLVAR 要素は戻 さ れ ません。
USING 節の BOTH オ プ シ ョ ン を 使用す る 場合は、
最低 2 度は戻 さ れ る 列 と し て SQLVAR 要素数を指定
す る 必要があ り ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
431
付録 B: SQL 記述子領域 (SQLDA)
SQLDA の構造
フ ィ ール
ド名
SQLVAR
書式
配列
説明
結果デー タ の列を記述す る 二次レベル構造の反復が含
ま れてい ます。
SQLVAR 要素の構造は、 以下の と お り です。
• SQLTYPE (SHORT INTEGER)
列のデー タ ・ タ イ プ と 、 その ヌ ル可能属性を表わ
す コ ー ド が入 り ます。
デー タ ・ タ イ プの コ ー ド の詳細は、 「SQLDA デー
タ ・ タ イ プ ・ コ ー ド 」 (434 ページ ) を参照 し て く
だ さ い。
入力の場合、 アプ リ ケーシ ョ ンは、 OPEN ま たは
EXECUTE 文 よ り 前に入力ホ ス ト 変数の タ イ プ を設
定 し ます。
出力の場合、 DESCRIBE 文を実行す る と 、 こ の タ
イ プが戻 さ れます。
デー タ を受け取 る ホ ス ト 変数の タ イ プが戻 さ れ る
値 と 異な る 場合、 アプ リ ケーシ ョ ンは、 FETCH を
実行す る 前に正 し いデー タ ・ タ イ プがその フ ィ ー
ル ド にあ る か ど う か確認 し ます。
• SQLLEN (SHORT INTEGER)
DECIMAL 以外のすべて のデー タ ・ タ イ プのデー
タ 長。
DECIMAL の場合、 SQLLEN は SQLPRCSN お よ び
SQLSCALE と し て多重定義 さ れ ます。
• SQLPRCSN (BYTE INTEGER - SQLLEN の高位
バイ ト )
小数精度 ( 合計桁数 )
• SQLSCALE (BYTE INTEGER - SQLLEN の低位
バイ ト )
小数の桁数 ( 小数点以下の桁数 )
入力の場合、 アプ リ ケーシ ョ ンは、 OPEN ま たは
EXECUTE 文 よ り 前に入力 ホ ス ト 変数の長 さ を 設定
し ま す。
出力の場合、 プ リ プ ロ セ ッ サは、 列のデー タ 長 を
戻 し ま す。
ホ ス ト 変数の長 さ が戻 さ れ る 値 と 異な る 場合、 アプ リ
ケーシ ョ ンは、 FETCH を実行す る 前に正 し い長 さ が
その フ ィ ール ド にあ る か ど う か を確認 し ます。
432
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 B: SQL 記述子領域 (SQLDA)
SQLDA の構造
フ ィ ール
ド名
SQLDATA
書式
ポインタ
説明
以下のいずれか を、 プ リ プ ロ セ ッ サに指示 し ます。
• 値が取 ら れ る 入力ホ ス ト 変数のア ド レ ス
• 結果の値を保管す る 出力ホ ス ト 変数
アプ リ ケーシ ョ ンは、 OPEN、 EXECUTE、 ま たは
FETCH 文を実行す る 前に こ の フ ィ ール ド を設定す る
必要があ り ます。
COBOL でア ド レ ス を設定す る 方法の例は、 <Teradata
PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を
参照 し て く だ さ い。
SQLIND
ポインタ
SQLDATA が指 し 示す入力 / 出力ホ ス ト 変数に関連付
け ら れた標識変数のア ド レ ス を、 プ リ プ ロ セ ッ サに示
し ます。
アプ リ ケーシ ョ ンは、 こ の フ ィ ール ド を、 ア ド レ ス が
SQLDATA 内にあ る フ ィ ール ド で使用す る 関連す る 標
識変数 ( あ る 場合 ) のア ド レ ス に設定 し ます。
標識変数を使用 し ない場合、 こ の フ ィ ール ド は x'00'
に設定す る 必要があ り ます。
アプ リ ケーシ ョ ンは、 OPEN、 EXECUTE、 ま たは
FETCH 文を実行す る 前に こ の フ ィ ール ド を設定す る
必要があ り ます。
SQLNAME
VARCHAR (30)
以下のいずれかが入 り ます。
• 列名。
• 列の タ イ ト ル。
入力の場合、 こ の フ ィ ール ド には入力ホ ス ト 変数 と し
ての意味合いはあ り ません。
出力の場合、 プ リ プ ロ セ ッ サは、 こ の フ ィ ール ド を
USING 節にあ る 情報に基づ き 設定 し ます。
こ の フ ィ ール ド を使用す る のは、 ア プ リ ケーシ ョ ン
だけです。 プ リ プ ロ セ ッ サが使用す る こ と はあ り ま
せん。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
433
付録 B: SQL 記述子領域 (SQLDA)
SQLDA デー タ ・ タ イ プ ・ コ ー ド
SQLDA デー タ ・ タ イ プ ・ コ ー ド
こ の ト ピ ッ ク では、 Teradata Database や埋め込み SQL プ リ プ ロ セ ッ サが使用す る
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ を リ ス ト し ます。
Teradata Database は、 アプ リ ケーシ ョ ンが PREPARE ま たは DESCRIBE 文を使っ て
指定 し た SQLDA に こ れ ら の値を戻 し ます。
プ リ プ ロ セ ッ サは、 プ リ コ ンパ イ ラ に よ っ て作成 さ れ、 実行時に認識 さ れ る 入力
SQLDA フ ィ ール ド と 出力 SQLDA フ ィ ール ド の両方で こ の値を使用 し ます。
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ングの所在
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ は、 SQLDA の SQLVAR フ ィ ール ド の う ち、
2 バ イ ト のサブ フ ィ ール ド であ る SQLTYPE INTEGER の中に含まれてい ます
( 「SQLVAR」 を参照 )。
SQL デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ングのヌル可能性の解釈方法
以下の指針は、 「SQL デー タ ・ タ イ プ ・ エン コ ーデ ィ ン グ」 (434 ページ ) お よ び
「使用 さ れない SQL デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ と 内部で使用 さ れ る SQL
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ」 (436 ページ ) の表を解釈す る 際に使用 し て く
だ さ い。
コー ド
その場合
ヌ ル受け入れ可能
標識変数が許可 さ れてい ます。
ヌ ル受け入れ不可能
標識変数が許可 さ れてい ません。
SQL デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ング
デー タ ・ タ イ プに関 し て ヌ ル受け入れ可能でない特定のエン コ ーデ ィ ン グに対 し 、
各エン コ ーデ ィ ン グ を決定す る ための規則は以下の と お り です。
対象 と な る エ ン コ ーデ ィ ン グ
ヌ ル受け入れ可能
434
デー タ ・ タ イ プの ヌ ル受け入れ不可能なエ ン
コ ーデ ィ ン グに追加す る 値
1
ス ト ア ド ・ プ ロ シージ ャ の IN パ ラ
メ ータ
500
ス ト ア ド ・ プ ロ シージ ャ の INOUT パ
ラ メ ータ
501
ス ト ア ド ・ プ ロ シージ ャ の OUT パ ラ
メ ータ
502
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 B: SQL 記述子領域 (SQLDA)
SQLDA デー タ ・ タ イ プ ・ コ ー ド
以下の表は、 SQL デー タ ・ タ イ プ と その SQLDA デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン
グの リ ス ト を示す も のです。
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ
デー タ ・ タ イ プ
ヌ ル受け入
れ不可能
ヌ ル受け
入れ可能
IN
INOUT
OUT
BYTEINT
756
757
1256
1257
1258
SMALLINT
500
501
1000
1001
1002
INTEGER
496
497
996
997
998
BIGINT
600
601
1100
1101
1102
DECIMAL
484
485
984
985
986
FLOAT/REAL/DOUBLE
PRECISION
480
481
980
981
982
BYTE
692
693
1192
1193
1194
VARBYTE
688
689
1188
1189
1190
LONG VARBYTE
696
697
1192
1193
1194
BLOB
400
401
900
901
902
BLOB AS DEFERRED
404
405
904
905
906
BLOB AS LOCATOR
408
409
908
909
910
BLOB AS DEFERRED BY NAME
412
413
912
913
914
DATE (DateForm=ANSIDate)
748
749
1248
1249
1250
DATE (DateForm=IntegerDate)
752
753
1252
1253
1254
TIME
760
761
1260
1261
1262
TIMESTAMP
764
765
1264
1265
1266
TIME WITH TIME ZONE
768
769
1268
1269
1270
TIMESTAMP WITH TIME ZONE
772
773
1272
1273
1274
INTERVAL YEAR
776
777
1276
1277
1278
INTERVAL YEAR TO MONTH
780
781
1280
1281
1282
INTERVAL MONTH
784
785
1284
1285
1286
INTERVAL DAY
788
789
1288
1289
1290
INTERVAL DAY TO HOUR
792
793
1292
1293
1294
INTERVAL DAY TO MINUTE
796
797
1296
1297
1298
INTERVAL DAY TO SECOND
800
801
1300
1301
1302
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
435
付録 B: SQL 記述子領域 (SQLDA)
SQLDA デー タ ・ タ イ プ ・ コ ー ド
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ
デー タ ・ タ イ プ
ヌ ル受け入
れ不可能
ヌ ル受け
入れ可能
IN
INOUT
OUT
INTERVAL HOUR
804
805
1304
1305
1306
INTERVAL HOUR TO MINUTE
808
809
1308
1309
1310
INTERVAL HOUR TO SECOND
812
813
1312
1313
1314
INTERVAL MINUTE
816
817
1316
1317
1318
INTERVAL MINUTE TO SECOND
820
821
1320
1321
1322
INTERVAL SECOND
824
825
1324
1325
1326
CHARACTER
452
453
952
953
954
VARCHARACTER
448
449
948
949
950
LONG VARCHARACTER
456
457
956
957
958
CLOB
416
417
916
917
918
CLOB AS DEFERRED
420
421
920
921
922
CLOB AS LOCATOR
424
425
924
925
926
CLOB AS DEFERRED BY NAME
428
429
928
929
930
JSON デー タ ( イ ン ラ イ ン )
880
881
1380
1381
1382
JSON デー タ ( ロ ケー タ ー )
884
885
1384
1385
1386
JSON デー タ ( 遅延 )
888
889
1388
1389
1390
GRAPHIC
468
469
968
969
970
VARGRAPHIC
464
465
964
965
966
LONG VARGRAPHIC
472
473
972
973
974
1-D ARRAY
504
505
1004
1005
1006
n-D Array
508
509
1008
1009
1010
UDT(DISTINCT 型 と
STRUCTURED 型の両方 )
サポー ト さ れない
使用 さ れな い SQL デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ と 内部で使用 さ れ る SQL デー タ ・
タ イ プ ・ エ ン コ ーデ ィ ング
こ の表は、 使用 さ れない SQLDA デー タ ・ タ イ プ ・ コ ー ド と 、 内部で使用 さ れ る
ためユーザーは認識で き ない SQLDA デー タ ・ タ イ プ ・ コ ー ド の リ ス ト を示す も
のです。
436
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 B: SQL 記述子領域 (SQLDA)
SQLDA デー タ ・ タ イ プ ・ コ ー ド
デー タ ・ タ イ プ ・ エ ン コ ーデ ィ ン グ
デー タ ・ タ イ プ
ヌ ル受け入
れ不可能
ヌ ル受け
入れ可能
IN
INOUT
OUT
ZONED DECIMAL
( 末尾の記号 )
432
433
932
933
934
ZONED DECIMAL
( 末尾の区切 り 記号 )
436
437
936
937
938
ZONED DECIMAL
( 先頭の記号 )
440
441
940
941
942
ZONED DECIMAL
( 先頭の区切 り 記号 )
444
445
944
945
946
デー タ ・ タ イ プに関 し て ヌ ル受け入れ可能でない特定のエン コ ーデ ィ ン グに対 し 、
各エン コ ーデ ィ ン グ を決定す る ための規則は、 「SQL デー タ ・ タ イ プ ・ エン コ ー
デ ィ ン グ」 (434 ページ ) に示 さ れてい る も の と 同 じ です。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
437
付録 B: SQL 記述子領域 (SQLDA)
SQLDA デー タ ・ タ イ プ ・ コ ー ド
438
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 C :
SQL コ ミ ュ ニケーシ ョ ン領域 (SQLCA)
Preprocessor2 は、 プ ロ グ ラ ムの ス テー タ ス と エ ラ ー情報を、 い く つかの方法でアプ
リ ケーシ ョ ンに戻す こ と がで き ます。
Teradata セ ッ シ ョ ン ・ モー ド で実行す る よ う 作成 さ れた アプ リ ケーシ ョ ンの主な接
続方式は、 SQLCA 構造で し た。 SQLCA は、 完了 し た DML 文の戻 り コ ー ド や他の
情報の リ ス ト を含むデー タ 構造です。
SQLCA には、 埋め込み SQL アプ リ ケーシ ョ ンに対す る 次の よ う なサポー ト が用意
さ れてい ます。
• 結果の報告
• 警告条件の報告
• DSNTIAR のサポー ト
埋め込み SQL ア プ リ ケーシ ョ ン ・ プ ロ グ ラ ム は、 埋め込み SQL 文を実行 し た結
果を表わす戻 り コ ー ド の SQLCA フ ィ ール ド を問い合わせます。
埋め込み SQL ア プ リ ケーシ ョ ン では、 提供 さ れて い る ルーチ ン ( 「PPRTEXT」
(442 ページ ) を参照 ) を使用 し て、 完全な診断テ キ ス ト を取得す る こ と も で き ます。
SQLCA は、 ス ト ア ド ・ プ ロ シージ ャ と 同時に使用す る こ と はで き ません。
ANSI への準拠
SQL コ ミ ュ ニ ケーシ ョ ン領域お よ び INCLUDE SQLCA 文は、 ANSI SQL に準拠 し て
い ません。 プ リ プ ロ セ ッ サ TRANSACT ま たは -tr オプシ ョ ン を ANSI にセ ッ ト す る
と 、 エ ラ ー と し て INCLUDE SQLCA フ ラ グが付 き ます。
ANSI モー ド ・ アプ リ ケーシ ョ ンは、 SQLSTATE ス テー タ ス変数お よ び SQLCODE
ス テー タ ス変数に よ っ て、 プ ロ グ ラ ムの ス テー タ ス と エ ラ ーを報告 し ます
(SQLCODE 変数 と SQLSTATE 変数の相互マ ッ ピ ン グお よ び Teradata Database エ
ラ ー ・ メ ッ セージに対す る マ ッ ピ ン グの詳細は、 付録 D: 「SQLSTATE のマ ッ ピ ン
グ」 を参照 し て く だ さ い )。
ANSI/ISO SQL-92 規格では、 SQLCODE を明示的に推奨 し てい ません。 ANSI/ISO
SQL-99 規格では、 SQLCODE は定義 さ れな く な り ま し た。 ANSI ト ラ ンザ ク シ ョ ン ・
モー ド で実行する ス ト ア ド ・ プ ロ シージ ャ およ び埋め込み SQL アプ リ ケーシ ョ ン を
作成す る と き には、 必ず SQLSTATE を使用す る 必要があ り ます。 Teradata ト ラ ンザ
ク シ ョ ン ・ モー ド で実行す る ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL アプ リ
ケーシ ョ ンで も SQLSTATE を使用で き ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
439
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
アプ リ ケーシ ョ ン用の SQLCA の定義
注 : 移植性を最大にす る には、 アプ リ ケーシ ョ ン ・ ス テー タ ス を モニ タ ーす る と き
に、 SQLCODE ではな く 、 いつ も SQLSTATE を使用す る 必要があ り ます。
ANSI 環境で ス ト ア ド ・ プ ロ シージ ャ ま たは埋め込み SQL ア プ リ ケーシ ョ ン を 開
発す る 場合、 SQLCA の代わ り に ス テー タ ス 変数 SQLSTATE を 使用 し 、 それ を
コ ー ド で明示的に定義 し ます。 詳細は、 「SQLSTATE」 (105 ページ )、 「SQLCODE」
(108 ページ ) お よ び付録 D: 「SQLSTATE のマ ッ ピ ン グ」 を参照 し て く だ さ い。
ア プ リ ケーシ ョ ン 用の SQLCA の定義
ア プ リ ケーシ ョ ン ・ プ ロ グ ラ ム では、 通常 INCLUDE SQLCA 文を使用 し て
SQLCA を定義 し ます ( 「INCLUDE SQLCA」 (345 ページ ) を参照 )。
こ のデー タ 構造は読み取 り 専用であ る ため、 アプ リ ケーシ ョ ン ・ プ ロ グ ラ ムが
SQLCA に値を書 き 込 も う と す る こ と はないはずです。
ス テ ー タ ス変数の検査
埋め込み SQL ま たは ス ト ア ド ・ プ ロ シージ ャ の文を実行す る たびに、 その後で
SQLCODE ( ま たは SQLCA を使用す る 場合は SQLSTATE) のテ ス ト を組み込み、
文が正常に完了する よ う に し ます。 ま た、 受け入れ ら れない ス テータ ス変数の値を
必ず扱え る よ う にアプ リ ケーシ ョ ン ・ コ ー ド を作成す る か、 アプ リ ケーシ ョ ン が
ス ト ア ド ・ プ ロ シージ ャ の場合には適切な条件ハン ド ラ ーを使用す る 必要 も あ り
ます。
結果の報告
埋め込み SQL アプ リ ケーシ ョ ンか ら 送信 さ れた SQL 要求の結果は、 アプ リ ケー
シ ョ ンが SQLCODE 値を検査す る よ う 作成 さ れていれば、 SQLCA 構造の
SQLCODE フ ィ ール ド に報告 さ れます。
アプ リ ケーシ ョ ンが SQLCODE を使用す る よ う 作成 さ れた ス ト ア ド ・ プ ロ シージ ャ
であ る 場合、 ス テー タ ス は SQLCODE ス テー タ ス変数に報告 さ れます。
さ ま ざ ま な SQLCODE のカ テ ゴ リ の意味
次の表では、 3 つの基本的な SQLCODE カ テ ゴ リ の一般的な意味を説明 し ます。
440
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
結果の報告
SQLCODE
その場合
負
処理時にエ ラ ーが発生 し た。
ア プ リ ケーシ ョ ン は、 最初の SQLERRD 構成要素 と 共に
SQLCODE を使用 し て、 エ ラ ーの原因を判別で き ます。
SQLERRD は、 次の こ と を示 し ます。
• プ リ コ ンパ イ ラ 実行環境に よ っ て検出 さ れたエ ラ ー条件
• CLI/TDP/Teradata Database で報告 さ れたエ ラ ー条件
プ リ プ ロ セ ッ サに よ っ てエ ラ ーが直接に検出 さ れ る 場合、 最初の
SQLERRD 構成要素はゼ ロ にな り ます。
項目は、 次の と お り です。
• エ ラー ・ コー ド の リ ス ト
• コ ー ド と 関連付け ら れ る テ キ ス ト
• 可能な説明
• こ れ ら のエ ラ ーの可能な解決策
エ ラ ー条件が CLI、 TDP、 ま たは Teradata Database に よ っ て検出 さ
れ る 場合、 SQLCODE は、 エ ラ ー ・ コ ー ド と 10000 を足 し た負の合
計に設定 さ れ ます。
アプ リ ケーシ ョ ンは、 最初の SQLERRD 構成要素を問い合わせず
に SQLCODE を見 る こ と がで き ます。
Teradata Database エ ラ ー条件は、 次の明確な ス タ イ ルで報告 さ れ
ま す。
1 同等の Database 2(DB2) 値を持つ Teradata Database コ ー ド は、
SQLCODE フ ィ ール ド の DB2 値にマ ッ ピ ン グ さ れ ます。
「再試行可能なエ ラ ー」 (442 ページ ) を参照。
2 同等の コ ー ド を持たない Teradata Database コ ー ド では、
SQLCODE 値は Teradata Database コ ー ド の負の値に設定 さ れ
ま す。
いずれの場合に も 、 最初の SQLERRD 構成要素には、 Teradata
Database か ら 戻 さ れた実際の値が含まれます。
一部の SQLCODE 値は、 両方のカ テ ゴ リ のエ ラ ーで見つか る も の
も あ る ため、 プ リ コ ンパ イ ラ 実行時エ ラ ー と Teradata Database エ
ラ ーを区別す る と き に注意 し て く だ さ い。
ゼロ
警告が存在す る 可能性はあ る が、 処理は成功 し た。
正
通常どお り に終了 し た。
0 ま たは +100 以外の正の値は、 要求のデー タ 終了に達 し たな ど、
Teradata Database の警告を示 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
441
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
結果の報告
PPRTEXT
アプ リ ケーシ ョ ンは、 PPRTEXT を起動す る こ と に よ り 、 非ゼ ロ の SQLCODE のた
めの別の診断ヘルプを入手で き ます。
PPRTEXT は、 エ ラ ー ・ コ ー ド ( 通常は、 最初の SQLERRD 構成要素の値 と 同 じ 値 )
と 条件に関連付け ら れたテ キ ス ト ・ メ ッ セージ を戻 し ます。
PPRTEXT を実行す る には、 次の 4 つのパ ラ メ ー タ が必要です。
• 実行時文脈領域のア ド レ ス。 COBOL の場合は SQL-RDTRTCON で、 C お よ び
PL/I の場合は SQL_RDTRTCON。
• 実際のエ ラ ー ・ コ ー ド を示すための 4 バ イ ト の整数フ ィ ール ド 。
• エ ラ ー ・ テ キ ス ト を示すための 255 文字ま での長 さ の可変文字フ ィ ール ド 。
• 戻 さ れ る 最大サ イ ズのエ ラ ー ・ テ キ ス ト を示す 2 バ イ ト の整数フ ィ ール ド 。
PPRTEXT の使用例については、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ
マ ・ ガ イ ド > を参照 し て く だ さ い。
警告条件の報告
警告条件は、 SQLCA の SQLWARNn フ ィ ール ド に よ っ て アプ リ ケーシ ョ ンに報告 さ
れます。
実行時に警告条件が検出 さ れ る 場合、 SQLWARN0 には値 W が示 さ れます。
警告フ ィ ール ド は、 暗黙の ロ ールバ ッ ク やデー タ 切 り 捨て な ど の条件を通知す る の
に使用 さ れます。
それぞれの警告フ ィ ール ド の正確な値 と 条件についての詳細は、 <Teradata
PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド > を参照 し て く だ さ い。
再試行可能なエ ラ ー
再試行可能な イ ベン ト のエ ラ ー ・ コ ー ド も 、 SQLWARNn フ ィ ール ド に示 さ れます。
その よ う なエ ラ ーが検出 さ れ る 場合、 SQLWARN6 が R にセ ッ ト さ れます。 そ う す
る と 、 アプ リ ケーシ ョ ンは、 適切な処置を実行で き ます。
再試行可能なエ ラ ー ・ コ ー ド の リ ス ト については、 < メ ッ セージ > を参照 し て く だ
さ い。
DSNTIAR のサポー ト
可能な と き はいつで も 、 SQLCA の SQLERRM フ ィ ール ド には、 IBM 提供のルー
チ ン DSNTIAR に よ っ て使用で き る メ ッ セージ挿入が示 さ れます。 SQLERRM
フ ィ ール ド の詳細は、 <Teradata PreProcessor2 埋め込み SQL プ ロ グ ラ マ ・ ガ イ ド >
にあ り ます。
DSNTIAR についての詳細は、 IBM の資料を参照 し て く だ さ い。
442
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
SQLCA フ ィ ール ド
SQLCA フ ィ ール ド
SQLCA は、 埋め込み SQL アプ リ ケーシ ョ ンでのみ使用 さ れます。 ス テー タ ス を報
告す る ために SQLCODE を使用す る ス ト ア ド ・ プ ロ シージ ャ は、 SQLCODE 変数を
宣言 し て問い合わせ、 文の ス テー タ ス を判別 し ます。
次の表では、 SQLCA の フ ィ ール ド について説明 し ます。
フ ィ ール ド 名
書式
説明
SQLCAID
CHARACTER(8)
文字列の 'SQLCA. ' が含ま れ ます。
SQLCABC
INTEGER
SQLCA の長 さ (136(x'88'))。
SQLCODE
INTEGER
SQL 文の実行結果の 1 次標識。
• SQLCODE が 0 の場合、 文は通常どお り に実行 さ れ ま し た。
• SQLCODE が正の値の場合、 エ ラ ーではない例外が生 じ ま し た。 た と
えば、 デー タ が見つか ら ないか、 さ ま ざ ま な致命的でない警告が発生
し ます。
• SQLCODE が負の値の場合、 エ ラ ー状態が生 じ て文は失敗 し ま し た。
SQLCODE と その定義 と し て可能な値については、 < メ ッ セージ ・ リ フ ァ
レ ン ス > で説明 さ れてい ます。
SQLERRM
VARCHAR (70)
変数情報に関連付け ら れた SQLCODE のエ ラ ー ・ メ ッ セージの挿入が含
ま れ ます。
SQLERRM フ ィ ール ド の挿入は、 単一の文字列 と し て アプ リ ケーシ ョ ン
に提示 さ れます。 文字列の長 さ が示 さ れますが、 個々の挿入の長 さ は示
さ れません。
文字列は 16 ビ ッ ト の語で始ま り 、 残っ たデー タ の長 さ が含ま れます。
こ のデー タ は、 挿入テ キ ス ト と 挿入の区切 り 文字 と し て機能す る X'FF' と
い う 文字を含めて合計 70 文字で構成 さ れ ます。
挿入お よ び区切 り 文字が 70 文字を超え る 場合、 その配列は右側が切 り 捨
て ら れます。
た と えば、 -552 と い う SQLCODE ( ア ク セ ス権違反 ) を指定す る と 、
SQLERRM には次の 3 つま たは 4 つの挿入が入 り ます。
•
•
•
•
SQLERRP
CHARACTER(8)
必要な権限を持たないユーザーのユーザー名。
使用禁止だっ た権限の名前。
権限を必要 と し たデー タ ベース の名前。
表、 ビ ュ ー、 マ ク ロ 、 ま たは ス ト ア ド ・ プ ロ シージ ャ で権限 ( デー タ
ベース ・ レベル権限を除 く ) を必要 と し た も のの名前。
エ ラ ーを検出 し たプ リ プ ロ セ ッ サ ・ モジ ュ ールの名前が含まれます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
443
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
SQLCA フ ィ ール ド
フ ィ ール ド 名
SQLERRD
書式
6 ワー ド の配列
説明
配列内に保管 さ れ る さ ま ざ ま な情報が含まれ ます。
配列のア ド レ ス指定方式は、 C、 COBOL、 および PL/I によ ってそれぞれが異
な る ため、 以下の 6 ワー ド の SQLERRD の記述には番号が付け られません。
6 ワー ド を順番に上げ る と 、 以下の と お り です。
• CLIv2、 TDP、 ま たは Teradata Database エ ラ ー ・ コ ー ド 。
• 将来使用す る ための予約領域。
• 該当す る 場所で処理 さ れた行数。
こ の フ ィ ール ド は、 通常はア ク テ ィ ビ テ ィ ・ カ ウ ン ト と いい ます。
た と えば、 選択カー ソ ルの OPEN で選択 し た行数は、 こ の語でアプ リ
ケーシ ョ ンに戻 さ れ ます。
• 関連費用見積 も り 。 こ の値は、 Teradata Database に よ っ て戻 さ れ ます
が、 PREPARE 文を使っ て設定 し 、 さ ま ざ ま な動的 SQL 文の見積 も り
コ ス ト を CPU サ イ ク ルで比較す る ために使用す る こ と がで き ます。
• 将来使用す る ための予約領域。
• 将来使用す る ための予約領域。
SQLWARN
CHARACTER(11)
配列
警告状態が存在 し てい る こ と を示 し ます。
SQLWARN6 を除 き 、 それぞれの文字は値の埋め込み文字ま たは 'W' のい
ずれかの形を取 り ます。
SQLWARN の 11 文字は、 次の よ う に定義 さ れます。
SQLWARN0 は、 次に示 さ れ る よ う に、 残 さ れた 10 の警告 コ ー ド のいず
れかが設定 さ れてい る か ど う か を表わ し ます。
• W の場合、 他の 10 の コ ー ド の 1 つま たは複数に 'W' が入っ てい る か、
SQLWARN6 に 'W' ま たは 'R' が入っ てい ます。
• 埋め込み文字の場合、 残 り の 10 文字 も 埋め込み文字です。
SQLWARN1:
• W の場合、 1 つま たは複数の出力文字値ま たはバ イ ト 列が、 それ ら を
受け取 る よ う に指定 し た ホ ス ト 変数が小 さ すぎ たために切 り 捨て ら れ
ま し た。
こ の条件が生 じ た場合、 切 り 捨て ら れた値の標識変数には、 切 り 捨て
ら れ る 前の長 さ が入 り ます。
• 埋め込み文字の場合、 切 り 捨ては行なわれ ませんで し た。
SQLWARN 2:
• W の場合、 Teradata Database に よ っ て警告が発行 さ れま し た。
SQLCODE 状況変数には警告 コ ー ド が含まれ ます。
• 埋め込み文字の場合、 警告は発行 さ れ ませんで し た。
SQLWARN 3:
• W の場合、 SELECT に よ っ て戻 さ れた列数が、 INTO 節のホ ス ト 変数
の数 と 異な り ます。
アプ リ ケーシ ョ ンに実際に戻 さ れ る 変数の数は、 こ れ ら 2 つの値 よ
り も 小 さ く な り ます。
• 埋め込み文字の場合、 SELECT に よ っ て戻 さ れた列数が、 INTO 節の
ホ ス ト 変数の数 と 一致 し てい ます。
444
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
SQLCA フ ィ ール ド
フ ィ ール ド 名
書式
説明
SQLWARN 4 は今後使用す る ために予約 さ れてい ます。
SQLWARN 5 は今後使用す る ために予約 さ れてい ます。
SQLWARN 6:
• W の場合、 文に よ り 、 Teradata SQL で暗黙的な作業単位の ロ ールバ ッ
ク が行われ ま し た。 こ の場合の例 と し て、 デ ッ ド ロ ッ ク が検出 さ れた
こ と に よ る も のがあ り ます。
• R の場合、 再試行可能なエ ラ ーが生 じ ま し た。
• 埋め込み文字の場合には、 ロ ールバ ッ ク は行われず、 エ ラ ー も あ り ま
せんで し た。
SQLWARN 7 は今後使用す る ために予約 さ れてい ます。
SQLWARN8 は今後使用す る ために予約 さ れてい ます。
SQLWARN9 は今後使用す る ために予約 さ れてい ます。
SQLWARNA は今後使用す る ために予約 さ れてい ます。
SQLEXT
CHARACTER(5)
SQLCODE に関連付け ら れた SQLSTATE 値が含まれます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
445
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
SQLCODE 値の SQLSTATE 値へのマ ッ ピ ン グ
SQLCODE 値の SQLSTATE 値へのマ ッ ピ ン グ
SQLCODE の規則
SQLCODE は、 ANSI/ISO SQL-99 規格では、 定義 さ れてい ません。 こ の使用は、
ANSI/ISO SQL-92 規格で非推奨にな り 、 SQL-99 規格で廃止 さ れま し た。
SQLCODE ス テー タ ス変数には、 次の規則が適用 さ れます。
• プ リ コ ンパ イ ラ 検証の目的の場合、 SQLCODE は、 埋め込み SQL アプ リ ケー
シ ョ ン向けに 32 ビ ッ ト 符号付 き INTEGER 値 と し て定義す る 必要があ り ます。
• SQLCODE お よ び SQLSTATE はど ち ら も 、 同 じ コ ンパ イ ル単位に指定で き る 。
従 っ て、 両方の ス テー タ ス 変数には、 有効な ス テー タ ス 変数 コ ー ド が含 ま れ
ま す。
SQLSTATE の規則
SQLSTATE は、 ANSI/ISO SQL-99 規格に よ っ て 5 文字の文字列値 と し て定義 さ れ
てい ま す。 こ の値は、 論理的には 2 文字の ク ラ ス と 3 文字のサブ ク ラ ス に分け ら
れ ま す。
SQLSTATE ス テー タ ス変数には、 次の規則が適用 さ れます。
•
ス テー タ ス ・ コ ー ド 値は、 整数ま たは整数 と Latin の大文字の混合 と す る こ と が
で き る。
• 特別に指定 さ れない限 り 、 CLI/TDP お よ び Teradata Database エ ラ ー ・ メ ッ セージ
は、 必ず SQLSTATE 値にマ ッ ピ ン グ さ れ る 。
• マ ッ ピ ン グ さ れない CLI/TDP エ ラ ーには、 T0 の ク ラ ス と 、 3 桁の CLI エ ラ ー ・
コ ー ド を含むサブ ク ラ ス があ る 。
た と えば、 CLI エ ラ ー 157 ( 無効な Use_Presence_Bits オプシ ョ ン ) は、 ク ラ ス
T0 と サブ ク ラ ス 157 を生成 し ます。
• マ ッ ピ ン グ さ れない Teradata Database エ ラ ーには、 T1 ~ T9 の ク ラ ス があ り 、
Teradata Database エ ラ ー ・ コ ー ド の最初の数字に対応す る ク ラ ス内の数字が付け
ら れます。
サブ ク ラ ス には、 残 り の 3 桁の Teradata Database エ ラ ー ・ コ ー ド が含まれ る 。
た と えば、 エ ラ ー ・ コ ー ド 3776 ( コ メ ン ト が終了 し ない ) は、 ク ラ ス T3 と サブ
ク ラ ス 776 にマ ッ ピ ン グ さ れ る 。
• プ リ コ ンパ イ ラ 検証の目的の場合、 SQLSTATE は、 固定長の CHAR(5) 配列 と し
て定義す る 必要があ る 。
C 言語プ ロ グ ラ ムの場合、 SQLSTATE は、 C ヌ ル終了記号に適合す る CHAR(6)
と し て定義す る 必要があ る 。
• SQLCODE お よ び SQLSTATE はど ち ら も 、 同 じ コ ンパ イ ル単位に指定で き る 。
従っ て、 両方の ス テー タ ス変数には、 有効な結果 コ ー ド が含まれ る 。
446
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
SQLCODE 値の SQLSTATE 値へのマ ッ ピ ン グ
SQLCODE から SQLSTATE へのマ ッ ピ ング表
次の表は、 CLI、 TDP、 ま たは Teradata SQL エ ラ ーの結果 と し て生成 さ れない
SQLCODE 値について、 SQLCODE 値を SQLSTATE 値にマ ッ ピ ン グ し てい ます。
SQLSTATE
SQLSTATE
SQLCODE
クラス
サブ ク ラ ス
SQLCODE
クラス
サブ ク ラ ス
100
02
000
-741
08
002
901
01
901
-742
08
000
902
01
004
-743
08
000
-101
54
001
-744
08
000
-104a
42b
512
-752
08
752
-302
22
024
-804
T0
804
-303
22
509
-811
21
000
-304
22
003
-822
51
004
-305
22
002
-840
21
840
-413
22
003
-901
T0
T10
-501
24
501
-925
56
021
-502
24
502
-926
56
021
-504
52
008
-942
T0
T12
-508
24
508
-943
24
000
-510
53
028
-1001
T0
T13
-514
24
000
-1002
T0
T14
-515
07
515
-1003
T0
T15
-563
08
003
-1005
T0
T16
-650
04
000
-1006
07
T17
-651
03
000
-1007
22
007
-652
04
000
-1009
22
T04
-653
41
000
-1010
T0
T18
-740
08
003
-1013
22
023
a. こ の コ ー ド は、 -104 ではな く 、 -84 であ る 必要があ り ます。
b. こ の使用法は、 IBM DB2 での使用法 と は異な り ます。 DB2 は ク ラ ス 37 を使用 し ます
が、 こ れは動的 SQL にのみ適用 さ れます。
コ ー ド 2A は静的 SQL に適用 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
447
付録 C: SQL コ ミ ュ ニ ケーシ ョ ン領域 (SQLCA)
CLI コ ー ド か ら SQLCODE 値へのマ ッ ピ ン グ
CLI コ ー ド か ら SQLCODE 値へのマ ッ ピ ン グ
エ ラ ーが CLI に よ っ て生成 さ れた場合、 SQLCODE は CLI エ ラ ー ・ コ ー ド + 10000
に設定 さ れます。
例外は CLI 214 と 304 の 2 つだけです。 こ れ ら 2 つの コー ド はワー ク ス テーシ ョ ン ・
プ ラ ッ ト フ ォーム (Linux) では -740 にマ ッ ピ ン グ さ れます。
448
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D :
SQLSTATE のマ ッ ピ ング
こ の付録では、 埋め込み SQL お よ びス ト ア ド ・ プ ロ シージ ャ ・ アプ リ ケーシ ョ ン
の一連の SQLSTATE マ ッ ピ ン グ を示 し てい ます。
SQLSTATE コ ー ド
定義
SQLSTATE コ ー ド は、 SQL 文の実行ス テー タ ス を反映す る 、 埋め込み SQL プ ロ グ
ラ ムお よ びス ト ア ド ・ プ ロ シージ ャ 内の ス テー タ ス値です。
整数値の SQLCODE と は異な り 、 SQLSTATE コー ド は文字列です。 こ のため、 こ の
コ ー ド は必ず、 次に示す SQLSTATE 値の よ う に単一引用符で囲 ま れて表示 さ れ
ま す。 'xxxxx'
SQLSTATE コ ー ド の文字は、 論理的に以下の 2 つのカ テ ゴ リ に分け ら れます。
• 2 文字の ク ラ ス値。
SQLSTATE コ ー ド の最初の 2 文字は、 ANSI/ISO SQL-99 に よ る 定義済みの
SQLSTATE ク ラ スのいずれか 1 つです ( 「SQLSTATE ク ラ ス定義」 (449 ページ ) を
参照 )。
• 3 文字のサブ ク ラ ス値。
サブ ク ラ ス値は、 任意の数値ま たは単一の大文字の ロ ーマ字文字列にす る こ と
がで き ます。
SQLSTATE コ ー ド 値
警告 コ ー ド = 0 で SQL 要求が正常に終了す る と 、 SQLSTATE コ ー ド 値 と し て '00000'
が戻 さ れます。
それ以外の状況については、 「Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE
値へのマ ッ ピ ン グ」 (453 ページ ) を参照 し て く だ さ い。
SQLSTATE ク ラ ス定義
ANSI では、 次の表に示 さ れてい る SQLSTATE ク ラ ス が定義 さ れてい ます。 Teradata
Database は、 リ ス ト さ れてい る すべての ク ラ ス をサポー ト し てい る わけではあ り ま
せん。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
449
付録 D: SQLSTATE のマ ッ ピ ン グ
SQLSTATE コ ー ド
ク ラ ス ・ コー ド
450
定義
00
正常な完了
01
警告
02
デー タ 未検出
03
SQL 文未完了
07
動的 SQL エ ラ ー
08
接続例外
09
ト リ ガー ・ ア ク シ ョ ン例外
0A
サポー ト さ れていない機能
0B
無効な ト ラ ンザ ク シ ョ ンの開始
0D
無効な タ ーゲ ッ ト ・ タ イ プの指定
0E
無効な ス キーマ名 リ ス ト の指定
0F
ロ ケー タ ー例外
0K
ハン ド ラ ー非ア ク テ ィ ブ時の Resignal
0L
無効な文法
0M
SQL に よ っ て呼び出 さ れた無効なプ ロ シージ ャ 参照
0N
SQL/XML マ ッ ピ ン グ ・ エ ラ ー
0P
無効な ロ ールの指定
0S
無効な変換グループ名の指定
0T
タ ーゲ ッ ト 表 と カー ソ ル指定の不一致
0U
更新で き ない列への割 り 当ての試行
0V
順序列への割 り 当ての試行
0W
ト リ ガー実行中に禁止 さ れた文を検出
0X
無効な外部サーバーの指定
0Y
パ ス ス ルー固有の条件
20
CASE 文に事例がない
21
基数違反
22
デー タ 例外
23
制約違反
24
無効な カー ソ ル状態
25
無効な ト ラ ンザ ク シ ョ ン状態
26
無効な実行文名
27
ト リ ガー さ れたデー タ の変更違反
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D: SQLSTATE のマ ッ ピ ン グ
SQLSTATE コ ー ド
ク ラ ス ・ コー ド
28
定義
無効な許可 ID の指定
注 : Teradata SQL は、 許可 ID の概念を直接サポー ト し てい ません。
ANSI の許可 ID は、 本質的には Teradata Database のユーザーです。
2B
従属権限が存在
2C
無効な文字セ ッ ト 名
2D
無効な ト ラ ンザ ク シ ョ ン終了
2E
無効な接続名
2F
SQL ルーチン例外
30
無効な SQL 文
31
無効な タ ーゲ ッ ト 指定値
33
無効な SQLDA 名
34
無効な カー ソ ル名
35
無効な条件番号
36
カー ソ ル感度例外
38
外部ルーチン例外
39
外部ルーチン呼び出 し 例外
3B
保存場所例外
3C
曖昧な カー ソ ル名
3D
無効な カ タ ロ グ名
注 : Teradata SQL は、 カ タ ロ グの概念を直接サポー ト し てい ません。
ANSI のカ タ ロ グは、 本質的には Teradata Database のデー タ ・ デ ィ ク
シ ョ ナ リ です。
3F
無効な ス キーマ名
注 : Teradata SQL は、 カ タ ロ グの概念を直接サポー ト し てい ません。
ANSI のカ タ ロ グは、 本質的には Teradata Database のデー タ ・ デ ィ ク
シ ョ ナ リ です。
40
ト ラ ンザ ク シ ョ ン ・ ロ ールバ ッ ク
42
構文エ ラ ーま たはア ク セ ス違反
44
チ ェ ッ ク ・ オプシ ョ ン違反
45
未処理のユーザー定義例外
46
Java DDL ま たは Java 実行可能フ ァ イ ル
HV
外部デー タ ・ ラ ッ パー固有の条件
HW
デー タ リ ン ク 例外
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
451
付録 D: SQLSTATE のマ ッ ピ ン グ
SQLSTATE コ ー ド
ク ラ ス ・ コー ド
HY
定義
コ ール ・ レベル ・ イ ン タ ーフ ェース条件
注 : こ の コ ール ・ レベル ・ イ ン タ ーフ ェ ース は Teradata DatabaseCLIv2
ではな く 、 Microsoft Open Database Connectivity ま たは ODBC の方言で
あ る ANSI 標準の CLI です。
452
HZ
リ モー ト ・ デー タ ベース ・ ア ク セ ス条件
U0
ユーザー定義例外
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セー ジの SQLSTATE 値へ
のマ ッ ピ ン グ
以下の表は、 対応す る SQLSTATE コ ー ド にマ ッ プ済みの Teradata Database 戻 り コ ー
ド を リ ス ト し てい ます。 ただ し 、 警告 コ ー ド = 0 で SQL 要求が正常に終了 し た場合
に戻 さ れ る SQLSTATE コ ー ド '00000' は除外 し てい ます。
こ の表に載っ ていない戻 り コ ー ド の場合は、 Teradata Database では SQLSTATE は、
リ テ ラ ル文字 T ( ロ ーマ字の大文字 T) の後に [Success]、 [Failure]、 ま たは [Error]
パーセル内の 4 桁の戻 り コ ー ド が続 く 書式の文字列 と し て設定 さ れます。
注 : 次に示す Teradata Database コ ー ド と 、 表に リ ス ト し た SQLSTATE コ ー ド への
マ ッ ピ ン グ は、 IBM DB2 には適合 し ま せん。 DB2 は ク ラ ス 37 を 使用 し ま すが、
こ れは動的 SQL にのみ適用 さ れます。 コ ー ド 2A は静的 SQL に適用 さ れます。
• 3527
• 3628
• 3775
• 3529
• 3704
• 3789
• 3530
• 3731
• 3816
• 3568
• 3733
• 3817
• 3582
• 3751
• 3818
• 3617
• 3759
• 3820
• 3627
• 3760
• 3821
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
2147
53
018
2161
22
2163
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
2149
53
018
012
2162
22
012
22
012
2164
22
003
2165
22
003
2166
22
003
2232
22
003
2233
22
003
2239
22
003
2240
22
003
2450
40
001
2603
53
015
2604
53
015
2605
53
015
2606
53
015
2607
53
015
2608
53
015
2614
22
003
2615
22
003
2616
22
003
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
453
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database
エラー ・
メ ッ セージ
454
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
2617
22
003
2619
22
2621
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
2618
22
012
012
2620
22
021
22
012
2622
53
015
2623
53
015
2631
40
001
2661
22
000
2662
22
011
2663
22
011
2664
54
001
2665
22
007
2666
22
007
2674
22
003
2675
22
003
2676
22
012
2679
22
012
2680
22
023
2682
22
003
2683
22
003
2684
22
012
2687
22
012
2689
23
502
2700
23
700
2726
23
726
2727
23
727
2728
23
728
2801
23
505
2802
23
505
2803
23
505
2805
57
014
2827
58
004
2828
58
004
2843
57
014
2892
01
003
2893
22
001
2894
24
894
2895
24
895
2896
24
896
2938
00
000
2980
23
505
3002
46
000
3003
46
000
3004
46
000
3006
08
T06
3007
08
T07
3014
46
000
3015
46
000
3016
46
000
3023
46
000
3025
08
T25
3026
46
000
3110
00
000
3111
40
502
3120
58
004
3121
02
000
3130
57
014
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
3504
53
003
3513
00
3515
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
3509
54
001
000
3514
00
000
52
011
3517
52
011
3518
54
008
3519
52
010
3520
22
003
3523
42
000
3524
42
000
3526
52
004
3527
42
015
3528
22
012
3529
42
015
3530
42
015
3532
53
021
3534
52
010
3535
22
018
3539
52
004
3540
54
001
3541
57
014
3543
57
014
3545
42
502
3554
53
003
3556
54
011
3560
52
011
3564
44
000
3568
42
507
3569
56
003
3574
56
003
3577
57
014
3580
53
015
3581
53
015
3582
42
582
3597
54
001
3604
23
502
3606
52
001
3609
54
001
3617
42
015
3622
53
019
3627
42
507
3628
42
507
3629
54
001
3637
53
005
3638
57
014
3639
53
018
3640
53
018
3641
53
021
3642
53
021
3643
53
019
3644
53
019
3653
53
026
3654
53
025
3656
52
004
3659
53
008
3660
53
015
3661
57
014
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
455
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database
エラー ・
メ ッ セージ
456
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
3662
53
015
3669
21
3704
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
3663
53
015
000
3702
54
001
42
506
3705
54
001
3710
54
001
3712
54
001
3714
54
001
3721
24
721
3731
42
501
3732
0A
732
3733
42
514
3735
01
004
3737
01
004
3738
01
004
3741
54
001
3744
52
010
3747
01
003
3751
42
504
3752
22
003
3753
22
003
3754
22
003
3755
22
003
3756
22
012
3757
22
003
3758
22
003
3759
42
504
3760
42
503
3775
42
506
3789
42
514
3801
52
010
3802
52
004
3803
52
010
3804
52
010
3805
52
010
3807
42
000
3809
52
002
3810
52
003
3811
23
502
3812
42
000
3813
42
000
3816
42
505
3817
42
505
3818
42
505
3819
53
015
3820
42
505
3821
42
505
3822
52
002
3823
53
007
3824
52
004
3827
56
021
3829
56
021
3833
56
021
3848
52
006
3850
54
001
3851
54
001
3856
42
501
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
3857
53
015
3865
42
3867
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
3858
42
501
501
3866
42
501
54
001
3872
56
003
3880
42
501
3881
42
501
3883
53
003
3885
52
001
3889
42
514
3896
54
001
3897
58
004
3919
54
011
3968
42
968
3969
42
969
3970
42
970
3971
42
971
3973
42
973
3974
42
974
3975
42
975
3976
53
030
3977
42
977
3978
42
978
3979
42
979
3980
42
980
3981
42
981
3982
42
982
3989
01
001
3990
42
990
3991
42
991
3992
42
992
3993
42
993
3994
42
994
3995
42
995
3996
22
001
3997
22
019
3998
22
025
3999
01
999
5300
42
J00
5301
42
J01
5302
52
009
5303
42
J03
5304
42
J04
5305
42
J05
5306
42
J06
5307
42
J07
5308
42
J08
5309
42
J09
5310
42
J10
5311
42
J11
5312
42
J12
5313
42
J13
5314
42
J14
5315
42
J15
5316
44
000
5317
23
000
5800
01
800
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
457
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database
エラー ・
メ ッ セージ
458
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
5758
30
758
5802
01
5804
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
5801
01
801
802
5803
01
803
01
804
5805
01
805
5806
01
806
5807
01
807
5808
01
808
5809
01
809
5810
01
810
5811
01
811
5812
01
812
5813
01
813
5814
01
814
5815
01
815
5816
01
816
5817
01
817
5818
01
818
5819
01
819
5820
01
820
5821
01
821
5822
01
822
5823
01
823
5824
01
824
5825
01
825
5826
01
826
5827
01
827
5828
01
828
5829
01
829
5830
01
830
5831
01
831
5832
01
832
5833
01
833
5834
01
834
5835
01
835
5836
01
836
5837
01
837
5838
01
838
5839
01
839
5840
01
840
5841
01
841
5977
30
977
5980
30
980
7593
22
593
7594
01
594
7601
20
000
7603
45
000
7604
35
000
7610
24
502
7627
21
000
7631
24
501
7632
02
000
7682
26
000
7683
07
005
9100
23
100
9101
23
101
9113
42
113
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D: SQLSTATE のマ ッ ピ ン グ
Teradata Database エ ラ ー ・ メ ッ セージの SQLSTATE 値へのマ ッ ピ ン グ
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
22
113
9114
Teradata Database
エラー ・
メ ッ セージ
SQLSTATE コ ー ド
クラ
ス値
サブ ク
ラ ス値
30
425
9425
9127
23
127
9434
30
434
9435
22
435
9450
22
435
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
459
付録 D: SQLSTATE のマ ッ ピ ン グ
CLI コ ー ド か ら SQLSTATE 値へのマ ッ ピ ン グ
CLI コ ー ド か ら SQLSTATE 値へのマ ッ ピ ン グ
次の表は、 対応す る SQLSTATE コ ー ド にマ ッ ピ ン グ済みの CLI コ ー ド を リ ス ト し
てい ます。
SQLSTATE コ ー ド
460
SQLSTATE コ ー ド
CLI コ ー ド
ク ラ ス値
サブ ク
ラ ス値
CLI コ ー ド
ク ラ ス値
サブ ク
ラ ス値
36
08
T36
280
08
V80
40
08
T40
282
08
V82
41
08
T41
286
08
V86
151
08
U51
361
0A
W61
171
0A
U71
362
0A
W62
181
0A
U81
363
0A
W63
185
0A
U85
364
08
W64
190
0A
U90
365
08
W65
229
08
W29
370
08
W70
230
08
W30
375
08
W75
231
08
W31
376
08
W76
232
08
W32
377
08
W77
233
08
W33
378
08
W78
234
08
W34
379
08
W79
235
08
W35
380
08
W80
236
08
W36
381
08
W81
237
08
W37
382
08
W82
238
08
W38
383
08
W83
239
08
W39
384
08
W84
240
08
W40
385
08
W85
241
08
W41
386
08
W86
242
08
W42
387
08
W87
243
08
W43
426
08
X26
244
08
W44
427
08
X27
272
08
V72
428
08
X28
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 D: SQLSTATE のマ ッ ピ ン グ
CLI コ ー ド か ら SQLSTATE 値へのマ ッ ピ ン グ
SQLSTATE コ ー ド
SQLSTATE コ ー ド
CLI コ ー ド
ク ラ ス値
サブ ク
ラ ス値
CLI コ ー ド
ク ラ ス値
サブ ク
ラ ス値
429
08
X29
524
08
524
430
08
X30
527
08
527
512
08
512
529
0A
529
513
08
513
530
2C
530
521
08
521
532
0A
532
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
461
付録 D: SQLSTATE のマ ッ ピ ン グ
CLI コ ー ド か ら SQLSTATE 値へのマ ッ ピ ン グ
462
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 E :
SQL ス ト ア ド ・ プ ロ シージ ャ ・
コ マ ン ド 関数 コ ー ド
次の表に、 診断域か ら サポー ト さ れ る SQL ス ト ア ド ・ プ ロ シージ ャ
COMMAND_FUNCTION の名前 と 、 その COMMAND_FUNCTION_CODE の値を リ
ス ト し ます。
コ マ ン ド 関数 コ ー ド 値。
• 正の値は、 ANSI/ISO SQL:2011 規格で定義 さ れて い る コ マ ン ド 関数 を 表わ し
ま す。
• 負の値は、 ANSI/ISO SQL:2011 規格の Teradata 拡張機能の コ マ ン ド 関数を表わ し
ます。
COMMAND_FUNCTION
COMMAND_FUNCTION_CODE
ABORT
-34
ALTER TABLE
4
ALTER TRIGGER
-28
ASSIGNMENT
5
BEGIN LOGGING
-22
BEGIN TRANSACTION
-4
CALL
7
CASE
86
CLOSE CURSOR
9
COLLECT DEMOGRAPHICS
-36
COLLECT STATISTICS (QCD 形式 )
-24
COLLECT STATISTICS ( 最適化ルーチン形式 )
-24
COMMENT ( 注釈入力形式 )
-3
COMMENT ( 注釈取得形式 )
-3
COMMIT WORK
11
CREATE CAST
52
CREATE DATABASE
-12
CREATE HASH INDEX
-38
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
463
付録 E: SQL ス ト ア ド ・ プ ロ シージ ャ ・ コ マ ン ド 関数 コ ー ド
464
COMMAND_FUNCTION
COMMAND_FUNCTION_CODE
CREATE INDEX
-11
CREATE JOIN INDEX
-39
CREATE MACRO
-6
CREATE ORDERING
114
CREATE PROFILE
-31
CREATE ROLE
61
CREATE TABLE
77
CREATE TRANSFORM
117
CREATE TRIGGER
80
CREATE USER
-13
CREATE VIEW
84
DEALLOCATE PREPARE
16
DECLARE VARIABLE
96
DELETE CURSOR
18
DELETE DATABASE
-19
DELETE USER
-42
DELETE WHERE
19
DROP CAST
78
DROP DATABASE
-15
DROP HASH INDEX
-40
DROP INDEX
-37
DROP JOIN INDEX
-41
DROP MACRO
-7
DROP ORDERING
115
DROP PROCEDURE
-29
DROP PROFILE
-33
DROP ROLE
29
DROP STATISTICS (QCD 形式 )
-25
DROP STATISTICS ( 最適化ルーチン形式 )
-25
DROP TABLE
32
DROP TRANSFORM
116
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 E: SQL ス ト ア ド ・ プ ロ シージ ャ ・ コ マ ン ド 関数 コ ー ド
COMMAND_FUNCTION
COMMAND_FUNCTION_CODE
DROP TRIGGER
34
DROP USER
-43
DROP VIEW
36
DYNAMIC CLOSE
37
DYNAMIC DELETE CURSOR
38
DYNAMIC FETCH
39
DYNAMIC OPEN
40
DYNAMIC SQL
-1
DYNAMIC UPDATE CURSOR
42
END LOGGING
-23
END TRANSACTION
-5
FETCH
45
FOR
46
GET DIAGNOSTICS
-51
GIVE
14
GRANT
48
GRANT LOGON
-20
GRANT ROLE
49
IF
88
INSERT
50
MERGE
128
MODIFY DATABASE
-16
MODIFY PROFILE
-32
MODIFY USER
-35
MULTI STATEMENT
-49
OPEN
53
PREPARE
56
QUERY_BAND
-52
RENAME FUNCTION
-50
RENAME MACRO
-10
RENAME PROCEDURE
-30
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
465
付録 E: SQL ス ト ア ド ・ プ ロ シージ ャ ・ コ マ ン ド 関数 コ ー ド
466
COMMAND_FUNCTION
COMMAND_FUNCTION_CODE
RENAME TABLE
-8
RENAME TRIGGER
-26
RENAME VIEW
-9
REPEAT
95
REPLACE CAST
-48
REPLACE MACRO
-18
REPLACE ORDERING
-45
REPLACE TRANSFORM
-44
REPLACE TRIGGER
-27
REPLACE VIEW
-17
RESIGNAL
91
REVOKE
59
REVOKE LOGON
-21
REVOKE ROLE
129
ROLLBACK WORK
62
SELECT
65
SIGNAL
92
UPDATE CURSOR
81
UPDATE WHERE
82
WHILE
97
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
付録 F :
性能に関する考慮事項
こ の付録では、 デー タ ベース の問合わせ性能を向上 さ せ る ための提案事項を取 り 上
げます。
問合わせ設計 を 最適化す る ための更新可能 カ ー ソ ルの使用
ANSI モー ド では、 問合わせの結果に対 し て、 お よ び問合わせの結果で示 さ れ る す
べての行に対 し て カー ソ ルを定義 し て、 行に関連 し た カー ソ ルを介 し てデー タ 行を
更新ま たは削除で き ます。
つま り 、 更新操作お よ び削除操作では検索条件が識別 さ れず、 更新ま たは削除す る
特定の行へのカー ソ ル ( ま たはポ イ ン タ ) が識別 さ れます。
サ イ ズの小 さ いカー ソ ルを複数使用 し て、 選択結果の各行が処理 さ れ る 際にそれを
個別に更新で き ます。
推奨事項
更新可能カー ソ ルの機能を最大限に活用す る ためには、 以下の も のを最小にす る 必
要があ り ます。
• 問合わせ結果のサ イ ズ、 お よ び ト ラ ンザ ク シ ョ ン あ た り の更新数。
• カー ソ ルが開かれた ま ま にす る 時間。
カー ソ ルあ た り の更新数を多 く す る と 、 以下の理由で最適化の妨げにな る こ と があ
り ます。
• 他の ト ラ ンザ ク シ ョ ンが妨害 さ れ る 。
• シ ス テ ムで長い ロ ールバ ッ ク が必要 と な る 。
こ の場合は、 MultiLoad ユーテ ィ リ テ ィ を使用 し て更新 し ます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
467
付録 F: 性能に関す る 考慮事項
問合わせ設計を最適化す る ための更新可能カー ソ ルの使用
468
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
用語集
2PL
Two Phase Locking (2 フ ェーズ ・ ロ ッ キ ン グ )
ト ラ ンザ ク シ ョ ンの逐次性を保証す る ロ ッ キ ン グ ・ プ ロ ト コ ル。
ACM 米国計算機学会
Association for Computing Machinery
AMP
Access Module Processor vproc ( ア ク セ ス ・ モジ ュ ール ・ プ ロ セ ッ サ vproc)
Teradata Database の フ ァ イ ル ・ シ ス テ ムお よ びデー タ 管理 コ ン ポーネ ン ト を制御す
る 一式の ソ フ ト ウ ェ ア ・ サービ ス。
ANSI American National Standards Institute ( 米国規格協会 ) (http://www.ansi.org)
米国の ワ シ ン ト ン D.C. を 本拠地 と す る 包括的な標準機構。 SQL の規格 を 定義、
認定、 お よ び管理 し ます。
ANSI/ISO SQL の規格は、 次の Web サ イ ト か ら 購入で き ます。 http://webstore.ansi.org/
ANSI/ISO SQL の規格は 「ISO」 に よ っ て も 承認 さ れてい ます。
API Application Programming Interface ( アプ リ ケーシ ョ ン ・ プ ロ グ ラ ミ ン グ ・ イ ン
タ ーフ ェース )
明確なプ ロ グ ラ ム ・ イ ン タ ーフ ェース を持つ一式の ソ フ ト ウ ェ ア ・ サービ ス。
ASCII American Standard Code for Information Interchange ( 情報交換用米国標準
コード )
さ ま ざ ま な タ イ プのデー タ 処理装置の間の互換性を確立す る ために設計 さ れた標準
7 ビ ッ ト の コ ー ド 。 ASCII は 1963 年に初めて提案 さ れ、 次の規格で文書化 さ れてい
ます。 ISO-14962-1997 お よ び ANSI-X3.4-1986 (R1997) です。
標準 ASCII 文字セ ッ ト は、 0 ~ 127 の範囲の 128 文字の 10 進数を定義し ます。 それ
ぞれの文字は、 英数字、 句読点、 お よ び一般的に使用 さ れ る 一式の特殊文字に割 り
当て ら れます。
128 ~ 255 の範囲の追加の 128 文字の 10 進数か ら 成 る 拡張 ASCII 文字セ ッ ト も あ
り ます。 こ れ ら の文字は、 追加の特殊文字、 数学記号、 図形文字、 お よ び 「外字」
に割 り 当て ら れます。
ASCII では 7 ビ ッ ト だけが使用 さ れ る ので、 8 ビ ッ ト 目をパ リ テ ィ ー ・ チ ェ ッ ク の
ために使用で き ます。
「EBCDIC」 (471 ページ ) と 比較。
AWT AMP Worker Task (AMP ワーカー ・ タ ス ク )
BFS
Breadth First Search ( 幅優先検索 )
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
469
用語集
BLOB Binary Large Object ( バ イ ナ リ ・ ラ ージ ・ オブジ ェ ク ト )
写真、 動画、 音楽な ど のバ イ ナ リ ・ デー タ のみを含むデー タ ・ オブジ ェ ク ト ( 通常
は 64 K よ り 大 き い )。
「CLOB」 (470 ページ ) と 比較。
BNF Backus-Naur Form or Backus Normal Form ( バ ッ カ ス ・ ナ ウ ア記法ま たはバ ッ
カ ス正規記法 )
コ ン ピ ュ ー タ 言語の指定に使用 さ れ る メ タ 言語。
BTEQ
Basic Teradata Query Facility ( 基本 Teradata 問合わせ機能 )
Teradata Database と の ク ラ イ ア ン ト ・ イ ン タ ーフ ェース の一種。 こ れを使用 し て
ユーザーは対話式に ま たはバ ッ チ ・ モー ド で SQL 要求を実行依頼 し 、 結果セ ッ ト
の形成、 ス ク リ プ ト の ビル ド と 実行、 お よ びデー タ の イ ン ポー ト と エ ク ス ポー ト を
行な え ます。
BTEQ は CLIv2 API に基づいてい ます。 一方、 こ れに似た機能であ る SQL Assistant
は ODBC API に基づいてい ます。 そのため、 こ れ ら 2 つの機能の動作にはい く つか
の大 き な違いがあ り ます。
BYNET Banyan Network - High speed interconnect (Banyan ネ ッ ト ワ ー ク - 高速相
互接続 )
PE と AMP の間のデー タ の流れを処理す る 独自のハ イ ブ リ ッ ド ・ ハー ド ウ ェ アお よ
び ソ フ ト ウ ェ ア通信ネ ッ ト ワー ク 。
CJK Chinese, Japanese, and Korean ( 中国語、 日本語、 韓国語 )
中国語、 日本語、 お よ び韓国語の記述に使用 さ れ る マルチバ イ ト 文字を表わすため
に使用 さ れ る 一般的な省略形。
CLIv2 Call-Level Interface Version 2 ( コ ール ・ レ ベル ・ イ ン タ ー フ ェ ー ス バー
ジ ョ ン 2)
CLIv2 は、 Teradata Database におけ る ク ラ イ ア ン ト ・ サーバー間での対話のための
独自の API です。 SQL Assistant な ど の CLIv2 を使用 し ない ア プ リ ケーシ ョ ン は、
ク ラ イ ア ン ト と Teradata サーバーの間の通信に ODBC API を使用 し ます。 リ リ ース
15.0 では、 ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン と Teradata Database の間の通信のため
に、 JDBC と .NET API をサポー ト し ます。
CLOB Character Large Object ( 文字 ラ ージ ・ オブジ ェ ク ト )
XML ま た はそ の他の テ キ ス ト ・ フ ァ イ ル な ど の文字デー タ のみ を 含むデー タ ・
オブジ ェ ク ト ( 通常は 64K よ り 大 き い )。
「BLOB」 (470 ページ ) と 比較。
Cover カバー。 問合わせに よ っ て要求 さ れたすべての列デー タ が、 索引専用ア ク
セ ス に よ っ て取得で き る 状態。
CPPI Character Partitioned Primary Index ( 文字パーテ ィ シ ョ ン基本索引 )。 パーテ ィ
シ ョ ン基本索引の一種で、 パーテ ィ シ ョ ン式にデー タ 型 CHAR、 VARCHAR、
GRAPHIC、 VARGRAPHIC の比較が含まれてい ます。
470
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
用語集
cs0, cs1, cs2, cs3 EUC エン コ ーデ ィ ン グで使用 さ れ る 4 つの コ ー ド ・ セ ッ ト
(codeset 0、 1、 2、 3)
cs0 には常に ISO-646 文字セ ッ ト が入 り ます。
それ以外のセ ッ ト はすべて、 最上位ビ ッ ト を 1 に設定 し な ければな ら ず、 文字を
エ ン コ ー ド す る のにそれ ら を何バ イ ト で も 使用で き ます。 さ ら に、 セ ッ ト 内の文字
はすべて次の も のを必要 と し ます。
• すべての文字を エン コ ー ド す る ための同 じ バ イ ト 数
• 同 じ 列表示幅 ( 固定幅端末での列の数 )
cs2 内の各文字の前には制御文字 ss2 (single-shift 2、 0x8E) が付 き ます。 EUC に準拠
す る コ ー ド ・ セ ッ ト は、 3 番目のセ ッ ト の識別以外の目的で ss2 制御文字を使用す
る こ と はあ り ません。
cs3 内の各文字の前には制御文字 ss3 (single-shift 3、 0x8F) が付 き ます。 EUC に準拠
す る コ ー ド ・ セ ッ ト は、 4 番目のセ ッ ト の識別以外の目的で ss3 制御文字を使用す
る こ と はあ り ません。
日本語の EUC は、 1 バ イ ト お よ びマルチバ イ ト 文字 (2 お よ び 3 バ イ ト ) で構成 さ
れます。 エン コ ーデ ィ ン グは ISO-2022 に準拠 し 、 次の よ う に JIS 定義 と EUC 定義
に基づいてい ます。
コー ド ・ セ ッ ト
エ ン コ ーデ ィ ン グ
文字セ ッ ト
cs0
0xxxxxxx
ASCII
cs1
1xxxxxxx 1xxxxxxx
JIS X0208-1990
cs2
0x8E 1xxxxxxx
JIS X0201-1976
cs3
0x8F 1xxxxxxx 1xxxxxxx
JIS X0212-1990
DB2 Database 2 と い う 名の、 IBM の リ レーシ ョ ナル ・ デー タ ベース管理シ ス テ ム。
オブジ ェ ク ト ・ リ レーシ ョ ナル機能を含む DB2 のバージ ョ ンは、 Database 2
Universal Database (DB2 UDB) と 呼ばれます。
E2I External-To-Internal ( 外部か ら 内部へ )
EBCDIC Extended Binary Coded Decimal Interchange Code ( 拡張 2 進化 10 進コー ド )。
「ASCII」 の代わ り と し て IBM に よ っ て考案 さ れた英数字、 句読点、 お よ び特殊文
字の 8 ビ ッ ト ・ コ ー ド 。 EBCDIC と ASCII では、 それぞれ異な る コ ーデ ィ ン グ ・ ス
キーム を使用 し てそれぞれの文字セ ッ ト を定義 し 、 EBCDIC では ASCII では定義 さ
れていないい く つかの特殊文字を定義 し てい ます。 EBCDIC は IBM の計算機に よ っ
てのみ使用 さ れます。
EBCDIC は 8 ビ ッ ト の コ ーデ ィ ン グ ・ ス キームであ る ため、 8 番目のビ ッ ト を使用
し たパ リ テ ィ ー ・ チ ェ ッ ク は実行で き ません。
「ASCII」 (469 ページ ) と 比較。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
471
用語集
EUC
Extended UNIX Code ( 拡張 UNIX コ ー ド )
ISO 標準の ISO-2022 に よ っ て指定 さ れ る 文字エン コ ーデ ィ ン グ ・ ス キーム。
EUC コ ー ド ・ セ ッ ト は制御文字を使用 し て、 い く つかの文字セ ッ ト 内の文字を識別
し ます。 エン コ ーデ ィ ン グ規則は、 7 ビ ッ ト お よ び 8 ビ ッ ト のエン コ ーデ ィ ン グの
ための ISO-2022 定義に基づいてい ます。 EUC コ ー ド ・ セ ッ ト は制御文字を使用 し
て、 い く つかの文字セ ッ ト を分け ます。
各種の UTF-n の形式は、 EUC 標準に よ っ て 定義 さ れ る も の と 、 ISO 標準の
ISO-8859 に よ っ て定義 さ れ る も のがあ り ます。
External Stored Procedure ( 外部ス ト ア ド ・ プ ロ シージ ャ ) C ま たは C++ な ど の、
SQL 以外の言語でプ ロ シージ ャ ・ コ ー ド が書かれた ス ト ア ド ・ プ ロ シージ ャ 。
EXTUSER
External USER ( 外部ユーザー )
FIFO First-In-First-Out ( 先入れ先出 し 法 )
待ち行列の一種。 シーケ ン ス に最初に配置 さ れ る 項目がそ こ か ら 最初に読み出 さ れ
る 項目 と な り ます。
FK Foreign Key ( 外部キー )
リ レーシ ョ ナル ・ デー タ ベース内の表の間の参照整合性を確立す る ための手段。 子
表の外部キーは通常、 その親表の論理基本キーです。 それが親表の基本キーではな
い場合、 それはその代替キーの一つです。
「PK」 (475 ページ ) と 比較。
Global Index 対応す る 実表の行を参照す る ために ROWID キーワー ド を使っ て定
義 さ れ る 結合索引 ( 「JI」 (473 ページ ) を参照 )。
GTT
HI
Global Temporary Table
Hash Index ( ハ ッ シ ュ 索引 )
単一表 「JI」 と 類似 し たプ ロ パテ ィ を持つ実表の縦方向のパーテ ィ シ ョ ン。
イ ン ラ イ ンに保管 さ れ る 基本索引 ( それが索引付け し た行 と と も に保管 さ れ る ) と
は異な り 、 ハ ッ シ ュ 索引はシ ス テ ムに よ る 保守が必要な個々の副表に格納 さ れま
す。 ハ ッ シ ュ 索引の副表はデ ィ ス ク 領域を消費す る ため、 EXPLAIN 要求修飾子を
使っ て問合わせを定期的にモニ タ ー し 、 それ ら に対 し て設計 し たいずれかのハ ッ
シ ュ 索引を最適化ルーチンが使用 し てい る か ど う か を判別 し ます。 使用 し ていなけ
れば、 それ ら の索引を削除す る か、 ま たは最適化ルーチンが使用す る よ う に問合わ
せを書 き 直す必要があ り ます。
I2E Internal-to-External ( 内部か ら 外部へ )
IBM
International Business Machines Corporation
IEEE Institute of Electrical and Electronics Engineers ( 電気電子技術者協会 )
(http://www.ieee.org)
米国を本拠地 と す る 電気電子技術者のための最大の専門協会。
その最大の メ ンバー協会が IEEE コ ン ピ ュ ー タ 協会 (http://www.computer.org) です。
472
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
用語集
ISO
International Organization for Standardization ( 国際標準化機構 ) http://www.iso.org
ANSI/ISO SQL 規格 も 認定す る 、 ス イ ス のジ ュ ネーブに本部を置 く 包括的な国際標
準化機構。
ISO Web サ イ ト にあ る 次の一節は、 機構の名前が ( 見かけ上 ) その頭字語 と 一致 し
ない理由を説明 し てい ます。 「International Organization for Standardization」 は言語に
よ っ てその省略形が異な る ( 英語では 「IOS」、 フ ラ ン ス語では 「OIN」 (Organisation
internationale de normalisation)) ため、 「同等」 を意味す る ギ リ シ ャ 語 isos に由来す る
言葉を使用す る こ と が設立当初に決定 さ れま し た。 そのため、 国や言語に関係な
く 、 機構の名前の短縮形は常に ISO と な っ てい ます。」
SQL 規格の ISO パ ッ ケージは ISO Web サ イ ト か ら 入手で き ます。
JI
Join Index ( 結合索引 )
さ ま ざ ま な タ イ プの表の事前結合 ( ス パー ス 形式や集約形式を含む ) を作成で き る
( その定義の仕方に依存す る ) 実表の縦方向のパーテ ィ シ ョ ン。 SQL 要求が結合索
引を直接問合わせ る こ と はで き ません。 代わ り に、 最適化ルーチンが結合索引を使
用 し て、 「Cover」 さ れ る 問合わせのパフ ォーマ ン ス を向上 さ せます。
実表の縦方向のパーテ ィ シ ョ ン化 し か し ない結合索引は、 単一表の結合索引 と も 呼
ばれます。
2 つかそれ以上の実表 を 事前結合す る 結合索引は、 複数表の結合索引 と も 呼ばれ
ま す。
ど ち ら の タ イ プの結合索引 も ス パース形式ま たは集約形式で作成で き 、 その圧縮 さ
れた列のサブセ ッ ト を持つ こ と がで き ます。
イ ン ラ イ ンに保管 さ れ る 基本索引 ( それが索引付け し た行 と と も に保管 さ れ る ) と
は異な り 、 結合索引はシ ス テ ムに よ る 保守が必要な個々の副表に格納 さ れます。 結
合索引の副表はデ ィ ス ク 領域を消費す る ため、 EXPLAIN 要求修飾子を使っ て問合
わせを定期的にモニ タ ー し 、 それ ら に対 し て設計 し たいずれかの結合索引を最適化
ルーチンが使用 し てい る か ど う かを判別 し ます。 使用 し ていなければ、 それ ら の索
引を削除す る か、 ま たは最適化ルーチンが使用す る よ う に問合わせを書 き 直す必要
があ り ます。
JIS
Japanese Industrial Standard ( 日本工業規格 )
日本規格協会に よ っ て定義、 認定、 お よ び管理 さ れ る 標準のサブセ ッ ト
(http://www.jsa.or.jp/default_english.asp ま たは http://www.jsa.or.jp を参照 )。
コ ン ピ ュ ー タ 言語処理のための関連規格は、 JIS 規格の部門 X 「情報処理」
に よ っ て表わ さ れます (http://www.webstore.jsa.or.jp/webstore/JIS/
FlowControl.jsp?lang=en&bumon=X&viewid=JIS/html/en/CartegoryListEn.htm を参照 )。
LAN
Local Area Network ( ロ ーカル ・ エ リ ア ・ ネ ッ ト ワ ー ク )
ロ ーカルの地理的領域にわた る リ モー ト お よ び ロ ーカル ・ ノ ー ド への接続に、
ワ イ ヤーま たはケーブル ・ リ ン ク を使用す る デー タ 通信ネ ッ ト ワ ー ク 。
「WAN」 (477 ページ ) と 比較。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
473
用語集
LOB
Large Object ( ラ ージ ・ オブジ ェ ク ト )
Teradata Database の最大行サ イ ズ よ り 大 き いデー タ ・ オブジ ェ ク ト すべて。 LOB に
は 2 つの タ イ プがあ り ます。 「BLOB」 と 「CLOB」 です。
LT/ST Large Table/Small Table (join) ( ラ ージ表 / ス モール表 ( 結合 ))
フ ァ ク ト ( ラ ージ ) 表を そのサテ ラ イ ト ( ス モール ) デ ィ メ ン シ ョ ン表 と 結合す る た
めに使用 さ れ る 最適化 さ れた結合 タ イ プ。
NPPI Nonpartitioned Primary Index ( 非パーテ ィ シ ョ ン基本索引 )
「PI」 の一種。 パーテ ィ シ ョ ン式に よ る 特定範囲のパーテ ィ シ ョ ン化は行なわれま
せん。
NUPI
Non-Unique Primary Index ( 非固有基本索引 )
固有性制約が課 さ れていない 「PI」。 NUSI は し ば し ば、 表に対す る 結合操作を容易
にす る ために同 じ AMP 上の複数の表か ら の行を位置指定す る ために使用 さ れます。
NUSI Non-Unique Secondary Index ( 非固有副次索引 )
単一の行選択ではな く セ ッ ト ( 複数行 ) 選択での使用のために設計 さ れてい る AMP
ロ ーカル 「SI」。
ODBC Open DataBase Connectivity ( オープン ・ デー タ ベース接続性 )
ク ラ イ ア ン ト ・ アプ リ ケーシ ョ ン と SQL を使用す る リ レーシ ョ ナル ・ デー タ ベー
ス と の間の通信用の事実上の標準 API。
ANSI/ISO SQL 規格の API (CLI ( ま たは SQL/CLI)、 あ る いは コ ール ・ レベル ・ イ ン
タ ーフ ェース ) は、 ODBC の仕様に基づいてい ます。
OLTP
OS
OnLine Transaction Processing ( オ ン ラ イ ン ・ ト ラ ンザ ク シ ョ ン処理 )
Operating System ( オペレーテ ィ ン グ ・ シ ス テ ム )
よ り 高い レベルの ソ フ ト ウ ェ アがシ ス テ ム ・ ハー ド ウ ェ ア と 対話で き る よ う にす る
サービ ス を提供す る ソ フ ト ウ ェ アの レベル。
オペレーテ ィ ン グ ・ シ ス テ ム と し ては、 Linux な ど があ り ます。
PDE Parallel Database Extensions ( 並列デー タ ベース拡張 )
Teradata Database ソ フ ト ウ ェ アお よ び Teradata フ ァ イ ル ・ シ ス テ ム と 、 基礎 と な る
オペレーテ ィ ン グ ・ シ ス テ ムの間の仮想マシ ン ・ レ イ ヤー。
PDE は、 Teradata Database ソ フ ト ウ ェ アへの共通 イ ン タ ーフ ェース を提供 し 、
RDBMS やフ ァ イ ル ・ シ ス テ ム を よ り 簡単に別のオペレーテ ィ ン グ ・ シ ス テ ムに移
植で き る よ う に し ます。
PE Parsing Engine vproc ( 解析エ ン ジ ン vproc)
Teradata Database の問合わせ処理お よ びセ ッ シ ョ ン管理 コ ン ポーネ ン ト を制御す る
一式の ソ フ ト ウ ェ ア ・ サービ ス。
474
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
用語集
PI Primary Index ( 基本索引 )
表内の列のセ ッ ト 。 その値は AMP と の行の送受信で使用 さ れ る コ ー ド を作成す る
ためにハ ッ シ ュ さ れます。
Teradata Database 内の表にはそれぞれ基本索引が 1 つ (1 つのみ ) 必要で、 その固有
性は問い ません。
「PK」 と 比較。
PK Primary Key ( 基本キー )
表内の列のセ ッ ト 。 その値に よ り その表の行はそれぞれ固有にな り ます。
基本キーは、 物理的ではな く 、 論理的な概念で、 それが物理的に設計 さ れ る 場合
には し ば し ば表の基本索引 と し て使用 さ れ ま す。 ただ し 、 そ う でない場合 も あ り
ま す。
表には複数の候補キーを入れ る こ と がで き ますが、 表に定義で き る 基本キーは 1 つ
だけです。 表で基本キー と し て使用 さ れない候補キーは、 代替キー と 呼ばれます。
基本キー と 外部キーの間の関係は し ば し ば、 表の間の参照整合性の確立に使用 さ れ
ま す。 こ れ ら の関係は問合わせのパ フ ォ ーマ ン ス を向上 さ せ る ために最適化ルー
チ ン に よ っ て も よ く 利用 さ れます。
PPI Partitioned Primary Index ( パーテ ィ シ ョ ン基本索引 )
「PI」 の一種。 「NPPI」 に よ っ て行なわれ る よ う に、 まず AMP に行を分散す る ため
に使用 さ れます。 その後 DBA に よ っ て決定 さ れ、 表定義文の PARTITION BY 句を
使用 し て指定 さ れ る 一連の範囲にパーテ ィ シ ョ ン化 さ れます。
PPI は さ ま ざ ま な タ イ プの範囲の問合わせに非常に便利です。
QITS
Queue Insertion TimeStamp ( キ ュ ー挿入 タ イ ム ス タ ンプ )
すべてのキ ュ ー表に対 し て定義す る 必要のあ る 、 必須のユーザー定義列。
QSN Queue Sequence Number ( キ ュ ー ・ シーケ ン ス番号 )
キ ュ ー表に定義で き る 有用な列 ( ただ し 必須ではない )。
RDBMS Relational Database Management System ( リ レーシ ョ ナル ・ デー タ ベース管
理シ ス テ ム )
リ レーシ ョ ナル集合理論お よ びその集合理論に よ っ て提供 さ れ る 定理、 公理、 お よ
び演算子に基づ く デー タ ベース管理シ ス テ ム。 RDBMS の集合理論の基礎は、 デー
タ 管理のための予測可能な科学的ツールの一式を提供 し ます。
RI Referential Integrity ( 参照整合性 )
リ レーシ ョ ナル ・ デー タ ベース に孤立デー タ がない こ と を保証す る 方法。 参照整合
性では、 削除 さ れた親表行か ら 子表行が孤立す る のを防ぐ ために、 「PK」 と 「FK」
の間の親子関係が使用 さ れます。
参照整合性の関係は、 問合わせパフ ォーマ ン ス を向上 さ せ る ために し ば し ば最適化
ルーチンに よ っ て使用 さ れます。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
475
用語集
RSG Relay Services Gateway vproc ( リ レー ・ サービ ス ・ ゲー ト ウ ェ イ vproc)
SDF
Specification for Data Formatting ( デー タ 書式仕様 )
SI Secondary Index ( 副次索引 )
デー タ 操作を容易にす る ために使用 さ れ る 、 実表列を縦方向にパーテ ィ シ ョ ン化 し
たサブセ ッ ト 。
イ ン ラ イ ンに保管 さ れ る 基本索引 ( それが索引付け し た行 と と も に保管 さ れ る ) と
は異な り 、 副次索引はシ ス テ ムに よ る 保守が必要な個々の副表に格納 さ れます。 副
次索引の副表はデ ィ ス ク 領域を消費す る ため、 EXPLAIN 要求修飾子を使っ て問合
わせを定期的にモニ タ ー し 、 それ ら に対 し て設計 し たいずれかの副次索引を最適化
ルーチンが使用 し てい る か ど う かを判別 し ます。 使用 し ていなければ、 それ ら の索
引を削除す る か、 ま たは最適化ルーチンが使用す る よ う に問合わせを書 き 直す必要
があ り ます。
副次索引には と の 2 つの タ イ プがあ り ます。 「USI」 お よ び 「NUSI」
TLE Target Level Emulation ( タ ーゲ ッ ト ・ レベル ・ エ ミ ュ レーシ ョ ン )
小 さ く 個別に構成 さ れたテ ス ト ・ シ ス テ ム上で、 実動環境の特性のエ ミ ュ レー ト に
使用 さ れ る 一式の ツール。
TPA
Trusted Parallel Application ( ト ラ ス テ ッ ド 並列アプ リ ケーシ ョ ン )
Teradata Database 上で安全に実行で き る こ と を Teradata に よ っ て認定 さ れたアプ リ
ケーシ ョ ン。 Teradata Database ソ フ ト ウ ェ ア自体が TPA です。
UDT
User-Defined Type ( ユーザー定義型 )
Teradata 以外のだれかに よ っ て定義 さ れたデー タ ・ タ イ プ。 UDT には 2 つの型があ
り ます。 DISTINCT 型 と STRUCTURED 型です。
UJI Unique Join Index ( 固有結合索引 )
圧縮 し ていない単一表結合索引の一種で、 固有基本索引 (UPI)、 SELECT 句の選択
リ ス ト の ROWID キーワー ド 、 実表に対す る 問合わせを カバーす る WHERE 句 ( 実
表に対す る 問合わせの WHERE 句で修飾す る 行セ ッ ト の スーパーセ ッ ト を修飾す る
WHERE 句 ) が定義に含まれてい ます。
UPI Unique Primary Index ( 固有基本索引 )
固有制約 さ れてい る 「PI」。 UPI を使用 し て定義 さ れ る 表の行は、 「NUPI」 を使用 し
て定義 さ れ る 表の行 と 比べて、 AMP 全体に よ り 均等に分散 さ れます。
USI Unique Secondary Index ( 固有副次索引 )
単一行のア ク セ ス を容易にす る ために設計 さ れた 「SI」。
vproc Virtual Process ( 仮想プ ロ セ ス )
VT Volatile Table ( 揮発表 )
476
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
用語集
WAN Wide Area Network ( 広域ネ ッ ト ワー ク )
地理的に拡散 し た領域にわた る リ モー ト お よ び ロ ーカル ・ ノ ー ド への接続に、
電話線、 マ イ ク ロ 波、 ま たは衛星中継を使用す る デー タ 通信ネ ッ ト ワ ー ク 。
「LAN」 (473 ページ ) と 比較。
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
477
用語集
478
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
索引
A
ACTIVITY_COUNT 変数 111
ANSI 準拠 111
使用上の制約 112
設定 さ れ る 時機 111
テ ス ト 112
ALLOCATE 文 38
ALTER PROCEDURE (SQL 形式 )
AT TIME ZONE オプシ ョ ン 121
ASYNC 文修飾子 403
B
BEGIN DECLARE SECTION 文 328
BEGIN-END 文 270
C
CASE 文 276
CASE 式 と は異な る 280
形式 281
検索 CASE 281
単純な CASE 281
例外処理 282
CHECKSUM ロ ッ ク 34
CLI エ ラ ー ・ コ ー ド 441
CLOSE 文 41
COMMENT( 戻 り 形式 ) 文 329
CONNECT 文 370
CONTINUE ハン ド ラ ー ・ ア ク シ ョ ン 194
D
DATABASE 文 332
DCL 文
ス ト ア ド ・ プ ロ シージ ャ でサポー ト さ れてい る 136
ト ラ ンザ ク シ ョ ン ・ モー ド の影響 136
DDL 文 132
ス ト ア ド ・ プ ロ シージ ャ でサポー ト し ない 134
ト ラ ンザ ク シ ョ ン ・ モー ド の影響 134
DEALLOCATE PREPARE 文 43
DECLARE CONDITION 文 187
DECLARE CURSOR カー ソ ル
ス ト ア ド ・ プ ロ シージ ャ で行を更新 32
ス ト ア ド ・ プ ロ シージ ャ で行を削除 32
DECLARE CURSOR 文 26, 44, 139
FOR 文 58, 293
カー ソ ルの規則 45
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
カー ソ ルのサポー ト 27
DECLARE CURSOR 文
( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 44
DECLARE CURSOR 文 ( 選択形式 ) 44
DECLARE CURSOR 文 ( 動的 SQL 形式 ) 44, 46
DECLARE CURSOR 文 ( マ ク ロ 形式 ) 44
DECLARE CURSOR 文 ( 要求形式 ) 44, 50
DECLARE HANDLER (CONTINUE タ イ プ ) 文 194
DECLARE HANDLER (EXIT タ イ プ ) 文 198
DECLARE HANDLER (NOT FOUND タ イ プ ) 文 211
DECLARE HANDLER (SQLEXCEPTION タ イ プ ) 文 204
DECLARE HANDLER (SQLWARNING タ イ プ ) 文 208
DECLARE HANDLER 文 192
DECLARE STATEMENT 文 334
DECLARE TABLE 文 335
DECLARE CURSOR 文
( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 56
DECLARE CURSOR 文 ( 選択形式 ) 53
DECLARE CURSOR 文 ( マ ク ロ 形式 ) 48
DECLARE 文 285
DELETE 文 ( 定位置形式 ) 63
DESCRIBE 文 266, 355
DML 文
SQL 文の実行の制限 135
ス ト ア ド ・ プ ロ シージ ャ でサポー ト さ
れていない 135
ス ト ア ド ・ プ ロ シージ ャ でサポー ト さ れてい る 135
DSNTIAR 442
DYNAMIC RESULT SETS 句 59, 138
E
ELSEIF 句 301
END DECLARE SECTION 文 337
END-EXEC 文終了子 338
EXEC SQL 文先頭子 340
EXECUTE IMMEDIATE 文 67, 360
EXECUTE 文 65
EXECUTE 文 ( 動的 SQL 形式 ) 358
EXEC 文 339
EXIT ハン ド ラ ー ・ ア ク シ ョ ン 198
F
FETCH 文 74
FETCH 文 ( 埋め込み SQL 形式 ) 69
FOR CHECKSUM 句 33
FOR カー ソ ル 294
479
索引
FOR 文 289
FOR ループ 26
FOR ループ相関名 295
SQL 文の規則 294
カー ソ ルのサポー ト 27
カー ソ ル名の規則 295
ス ト ア ド ・ プ ロ シージ ャ で行を更新 32
ス ト ア ド ・ プ ロ シージ ャ で行を削除 32
ス ト ア ド ・ プ ロ シージ ャ の語彙の変数 127
変数の規則 295
例外におけ る カー ソ ルの処理 182
FOR ループでの例外におけ る カー ソ ルの処理 182
G
GET DIAGNOSTICS 文 243
GRANT 文 115
I
IF-THEN-ELSE-END IF 文 301
IF-THEN-ELSEIF-ELSE END 文の動作 302
IF-THEN-ELSEIF-END 文の動作 301
IF-THEN-END IF 文 301
IF 文 297
有効な形式 301
INCLUDE SQLCA 文 345
INCLUDE SQLDA 文 347
INCLUDE 文 343
INOUT パ ラ メ ー タ 126
INSERT 文 152
IN パ ラ メ ー タ 126
ITERATE 文 271, 293, 304
ア ク シ ョ ン 304
規則 305
K
KANJI1
オブジ ェ ク ト の作成に対す る 制限 129
L
LEAVE 文 271, 293, 308
ア ク シ ョ ン 308
規則 309
LOGOFF 文 374
LOGON 文 380
LOOP 終了エ ラ ー 314
LOOP 文 311
規則 315
N
NOT FOUND ハン ド ラ ー ・ ア ク シ ョ ン 211
480
O
OPEN 文 140
OPEN 文 ( 埋め込み SQL 形式 ) 79
OPEN 文 ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 82
OUT パ ラ メ ー タ 126
P
POSITION 文 85
PP2
Preprocessor2 の SELECT AND
CONSUME 文用の定位置カー ソ ル 33
SQLSTATE 変数のデー タ ・ タ イ プ定義 106
エラー
計算ス キーム 441
コ ー ド 、 再試行可能な 442
マ ッ ピ ン グ 441
カー ソ ル ・ サポー ト 文 29
カー ソ ルのア ク シ ョ ン と 結果 29
行を更新 32
デー タ ・ タ イ プ ・ コ ー ド 434
PP2. 埋め込み SQL も 参照
PPRTEXT 442
PREPARE 文 87, 139, 266, 362
R
REPEAT 文 316
WHILE 文 と の相違 317
規則 317
例外処理 317
RESIGNAL 文 229
REVOKE 文 115
REWIND 文 89
S
SELECT AND CONSUME 文 90
PP2 の定位置カー ソ ル 33
SELECT 文 93
カー ソ ル と 23
SET BUFFERSIZE 文 386
SET CHARSET 文 388
SET CONNECTION 文 390
SET CRASH 文 395
SET ENCRYPTION 文 398
SET 文 319
規則 319
SIGNAL 文 219
SQL SECURITY 句 116
SQL_data_access 句 135
SQLCA
フ ィ ール ド 443
SQLCA 構造 439
SQLCABC フ ィ ール ド 443
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
索引
SQLCAID フ ィ ール ド 443
SQLCODE フ ィ ール ド 443
SQLERRD フ ィ ール ド 441, 444
SQLERRM フ ィ ール ド 443
DSNTIAR のサポー ト 442
SQLERRP フ ィ ール ド 443
SQLWARN フ ィ ール ド 444
警告条件の報告 442
SQLCODE 変数 108, 401, 439, 441
ANSI 準拠 108
ANSI セ ッ シ ョ ン ・ モー ド 108
PPRTEXT 442
SQLCODE フ ィ ール ド 、 結果の報告 440
SQLSTATE にマ ッ ピ ン グ 107
Teradata Database エ ラ ー ・ コ ー ド にマ ッ ピ ン グ 110
Teradata セ ッ シ ョ ン ・ モー ド 108
値のカ テ ゴ リ 109
更新 さ れ る 時機 109
ス ト ア ド ・ プ ロ シージ ャ での使用上の制約 110
テ ス ト 109
SQLDA の構造
SQLDABC フ ィ ール ド 431
SQLDAID フ ィ ール ド 431
SQLDATA フ ィ ール ド 433
SQLD フ ィ ール ド 431
SQLIND フ ィ ール ド 433
SQLNAME フ ィ ール ド 433
SQLN フ ィ ール ド 431
SQLTYPE フ ィ ール ド 434
SQLEXCEPTION ハン ド ラ ー ・ ア ク シ ョ ン 204
SQLSTATE コ ー ド 、 定義 さ れてい る 449
SQLSTATE のマ ッ ピ ン グ 453, 460
SQLSTATE 変数 105, 401, 439
ANSI 準拠 105
PP2 のデー タ ・ タ イ プ定義 106
SQLCODE か ら SQLSTATE への例外マ ッ ピ ン グ 107
SQLCODE にマ ッ ピ ン グ 107
SQLSTATE への CLI エ ラ ー ・ コ ー ド の
マ ッ ピ ン グ 460
SQLSTATE への Teradata DBS エ ラ ー ・ コ ー ド の
マ ッ ピ ン グ 446
Teradata Database エ ラ ー ・ コ ー ド にマ ッ ピ ン グ 106
エ ラ ー ・ コ ー ド 105
構造 105
ス ト ア ド ・ プ ロ シージ ャ での使用上の制約 107
宣言 106
SQLWARNING ハン ド ラ ー ・ ア ク シ ョ ン 208
SQL 警告 118
SQL と 性能
更新可能カー ソ ル 467
SQL 文エ ラ ー 118
SQL 文内の未修飾オブジ ェ ク ト 119
SQL 文字列変数 262
SQL リ タ ーン ・ コ ー ド 442
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
T
TDP エ ラ ー ・ コ ー ド 441
tell_about_crash (TAC) オプシ ョ ン
設定 395
表示 373
Teradata Database
SQLCODE にマ ッ ピ ン グ さ れたエ ラ ー ・ コ ー ド 110
SQLSTATE にマ ッ ピ ン グ さ れたエ ラ ー ・ コ ー ド 106
TEST 文 408
U
UDT
埋め込み SQL、 サポー ト さ れない 20
埋め込み SQL でサポー ト さ れない 98
UPDATE 文 ( 定位置形式 ) 101
GENERATED ALWAYS 識別列 102
PARITION 列 102
相関副問い合わせ 102
ラ ージ ・ オブジ ェ ク ト 102
UPDATE 文での相関副問い合わせ 102
USING 句の規則 80, 83
W
wait_across_crash (WAC) オプシ ョ ン
設定 395
WAIT 文 415
WHENEVER 文 349
WHERE CURRENT OF 句 33
制限 63
WHILE 文 321
REPEAT 文 と の相違 317
規則 325
WITH RETURN 句 139
う
埋め込み SQL
ACTIVITY_COUNT の使用上の制約 112
ASYNC 文修飾子 403
BEGIN DECLARE SECTION 文 328
COMMENT( 戻 り 形式 ) 文 329
CONNECT 文 370
DATABASE 文 332
DECLARE CURSOR 文 ( 選択形式 ) 53
DECLARE CURSOR 文 ( 動的 SQL 形式 ) 46
DECLARE CURSOR 文 ( マ ク ロ 形式 ) 48
DECLARE CURSOR 文 ( 要求形式 ) 50
DECLARE STATEMENT 文 334
DECLARE TABLE 文 335
DELETE 文 ( 定位置形式 ) 63
DESCRIBE 文 355
END DECLARE SECTION 文 337
END-EXEC 文終了子 338
481
索引
EXEC SQL 文先頭子 340
EXECUTE IMMEDIATE 文 360
EXECUTE 文 ( 動的 SQL 形式 ) 358
EXEC 文 339
FETCH 文 69
INCLUDE SQLCA 文 345
INCLUDE SQLDA 文 347
INCLUDE 文 343
LOGOFF 文 374
LOGON 文 380
OPEN 文 79
POSITION 文 85
PREPARE 文 87, 362
REWIND 文 89
SELECT AND CONSUME の規則 92
SELECT AND CONSUME 文 90
SELECT 文 93
SELECT 文の規則 98
SET BUFFERSIZE 文 386
SET CHARSET 文 388
SET CONNECTION 文 390
SET CRASH 文 395
SET ENCRYPTION 文 398
SQL 文字列変数 262
TEST 文 408
UPDATE 文 ( 定位置形式 ) 101
WAIT 文 415
WHENEVER 文 349
規則 19
ク ラ イ ア ン ト 言語、 サポー ト さ れ る 18
コ ロ ン文字 92, 96
準備 SQL 354
即時の動的 SQL 354
デー タ を返す文 19
定義 さ れた 17
動的 SQL 353
動的 SQL 文の構文 354
特殊 SQL 文 18
入力ホ ス ト 変数 256
ヌ ル処理 263
標識変数 263
複文要求 266
プ リ プ ロ セ ッ サ 18
ホ ス ト 変数 252
埋め込み SQL での ヌ ル処理 263
埋め込み SQL の コ ロ ン文字 92, 96
埋め込み SQL の事前処理 18
え
エ ラー ・ コー ド
SQLSTATE 変数 105
Teradata Database を SQLCODE にマ ッ ピ ン グ 110
Teradata Database を SQLSTATE にマ ッ ピ ン グ 106
482
お
応答セ ッ ト 、 行がない 75
か
カー ソ ル 127, 266
DECLARE CURSOR 文 26
DECLARE CURSOR 文のサポー ト 27
DELETE 文の制限 34
FOR 294
FOR ループ制御文 26
FOR ループのサポー ト 27
PP2 29
SELECT 文 23
UPDATE 文の制限 34
暗黙的 ト ラ ンザ ク シ ョ ン のカー ソ ルの意味 30
位置 24
一般規則 25
感度 31
規則 28
結果セ ッ ト 59
更新可能 31
サポー ト 27
終了文 30
状態 24
ス ク ロ ール可能 71
増分す る 方法 25
タ イ プ 24
定位置 31
定義 さ れた 23
保持可能性 31
明示的 ト ラ ンザ ク シ ョ ン のカー ソ ルの意味 30
カー ソ ル指定 293
カー ソ ル指定のための相関名 293
カー ソ ル、 定位置カー ソ ル も 参照
外部ス ト ア ド ・ プ ロ シージ ャ 、 定義 さ れた 15
き
キー ワー ド 124
規則
BEGIN-END 文 272
DECLARE CURSOR、 すべての形式 45
DECLARE CURSOR ( 選択形式 ) 54
DECLARE CURSOR 文
( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 58
DECLARE CURSOR ( マ ク ロ 形式 ) 48
DECLARE CURSOR( 要求形式 ) 51
DECLARE 文の変数の宣言 286
ELSEIF 301
FETCH 文 ( 埋め込み SQL 形式 ) 71
FETCH 文 ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 75
FIRST と NEXT 76
FOR カー ソ ル 294
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
索引
FOR ループ ・ カー ソ ル名 295
FOR ループ相関名 295
FOR ループ内の SQL 文 294
FOR ループ変数 295
INOUT パ ラ メ ー タ 126
IN パ ラ メ ー タ 126
ITERATE 文 305
LEAVE 309
OPEN 文 ( ス ト ア ド ・ プ ロ シージ ャ 形式 ) 83
OUT パ ラ メ ー タ 126
POSITION 文 85
PREPARE 文 88
REPEAT 文 317
SELECT AND CONSUME 92
SELECT 文 96, 98
SET 文 319
USING 句 80, 83
WHILE 文 325
埋め込み SQL 19
カー ソ ル と 埋め込み SQL 28
カー ソ ル と ス ト ア ド ・ プ ロ シージ ャ 25
結果セ ッ ト の返送 59
条件ハン ド ラ ー 164
ス ト ア ド ・ プ ロ シージ ャ で SQL 文を使用す る 117
ス ト ア ド ・ プ ロ シージ ャ 内の動的 SQL 文 144
定位置カー ソ ル 34
キ ュ ー表 131
キ ュ ー表の属性 91
く
区切 り 記号 129
け
結果 コ ー ド 変数 130
ACTIVITY_COUNT 111
SQLCODE 108
SQLSTATE 105
ス ト ア ド ・ プ ロ シージ ャ での制限 114
ス ト ア ド ・ プ ロ シージ ャ でのデー タ ・ タ イ プ 113
結果セ ッ ト 24, 138, 151
返送 83
返送の規則 59
結果セ ッ ト ・ カー ソ ル 59
目的 24
こ
更新可能カー ソ ル 31
更新可能カー ソ ル、 性能 467
構文、 読み方 423
語分離符号 130
コ メ ン ト 131
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
さ
再帰
相互 145
連鎖 146
再帰的ス ト ア ド ・ プ ロ シージ ャ 145
再試行可能なエ ラ ー 442
サポー ト さ れてい る デー タ ・ タ イ プ 128
し
出力ホ ス ト 変数 258
有効なデー タ ・ タ イ プの組み合わせ 258
割 り 当て規則 260
条件処理の利点 159
条件ハン ド ラ ー
SQLSTATE ベース 162
入れ子の複合文の規則 168
規則 164
条件名 162
タ イ プ 163
汎用 162
ユーザー定義条件 162
優先度 169
条件名 187
所有権
オブジ ェ ク ト の 118
動的 SQL 内のオブジ ェ ク ト 144
診断域 213
診断文 218
ス ト ア ド ・ プ ロ シージ ャ でサポー ト さ れてい る 137
す
ス ク ロ ール可能カー ソ ル 71
ス テー タ ス変数の値 169
ス ト ア ド ・ プ ロ シージ ャ
ACTIVITY_COUNT の使用上の制約 112
ALLOCATE 文 38
DCL 文に対す る ト ラ ンザ ク シ ョ ン ・
モー ド の影響 136
DDL 文 132
DDL 文に対す る ト ラ ンザ ク シ ョ ン ・
モー ド の影響 134
DEALLOCATE PREPARE 文 43
DECLARE CURSOR 文 56, 139
DELETE 文 ( 定位置形式 ) 63
EXECUTE IMMEDIATE 文 67
EXECUTE 文 65
FETCH 文 74
GRANT 文 115
INSERT 文を使用 し たデバ ッ グ 152
OPEN 文 82, 140
PREPARE 文 139
REVOKE 文 115
483
索引
SELECT AND CONSUME 文 90
SELECT 文 93
SELECT 文の規則 96
SQL SECURITY 句 116
SQLCODE 使用上の制約 110
SQLSTATE 使用上の制約 107
SQLSTATE と 条件処理 161
SQL 警告 118
SQL 操作 137
SQL 文エ ラ ー 118
SQL 文の実行の制限 135
SQL 文を使用す る 規則 117
UPDATE 文 ( 定位置形式 ) 101
アーカ イ ブ 147
オブジ ェ ク ト の所有権 118
カー ソ ルのサポー ト 27
外部ス ト ア ド ・ プ ロ シージ ャ 、 関連す る 15
規則
INOUT パ ラ メ ー タ 126
IN パ ラ メ ー タ 126
OUT パ ラ メ ー タ 126
揮発表 133
キ ュ ー表 131
ク エ リ ー ・ バン ド の設定 133
結果 コ ー ド 変数の制限 114
結果 コ ー ド 変数のデー タ ・ タ イ プ 113
結果セ ッ ト を返す 138
権限チ ェ ッ ク 116
権限の付与 115
構造 15
コ ピー 147
コ メ ン ト 131
再帰の 145
サポー ト さ れていない DDL 文 134
サポー ト さ れていない DML 文 135
サポー ト さ れてい る DCL 文 136
サポー ト さ れてい る DML 文 135
サポー ト さ れてい る 診断文 137
サン プル 154
制御文 138
制約事項 122
セキ ュ リ テ ィ と 監査のための戦術的問い合わせ 150
戦術的問い合わせ 147
戦術的問い合わせでのマ ク ロ と の比較 150
ソ ース ・ テ キ ス ト 16
相互再帰 145
デー タ ・ タ イ プ ・ コ ー ド 120
定位置カー ソ ル 32
定義 さ れた 15
デバ ッ グ 151
動的 SQL 141
動的 SQL 内のオブジ ェ ク ト の所有権 144
動的 SQL 文の規則 144
ト ラ ンザ ク シ ョ ンの開始 119
484
ト リ ガー と 130
パ ラ メ ー タ 120
復元 147
複雑な戦術的更新 148
複文要求 131
不必要なデー タ ベース作業の省略 149
方法のデバ ッ グ 152
本体 16
本体の構成要素 16
未修飾オブジ ェ ク ト 119
利点 16
連鎖再帰 146
ス ト ア ド ・ プ ロ シージ ャ 条件処理
DECLARE CONDITION 文 187
DECLARE HANDLER (CONTINUE タ イ プ ) 文 194
DECLARE HANDLER (EXIT タ イ プ ) 文 198
DECLARE HANDLER (NOT FOUND タ イ プ ) 文 211
DECLARE HANDLER
(SQLEXCEPTION タ イ プ ) 文 204
DECLARE HANDLER
(SQLWARNING タ イ プ ) 文 208
DECLARE HANDLER 文 192
GET DIAGNOSTICS 文 243
RESIGNAL 文 229
SIGNAL 文 219
SQLSTATE 161
入れ子の複合文 168
規則 164
条件の発生 163
条件名 187
診断域 213
診断文 218
ス テー タ ス変数の値 169
ハン ド ラ ー ・ ア ク シ ョ ン で発生 し た条件 173
ハン ド ラ ー ・ タ イ プ 163
ユーザー定義条件 188
優先度 169
用語 159
利点 159
例外条件 ト ラ ンザ ク シ ョ ンの意義 170
ス ト ア ド ・ プ ロ シージ ャ 制御文
BEGIN - END 270
ITERATE 271
LEAVE 271
規則 272
宣言の順序 271
CASE 276
CASE 文 と CASE 式 280
CASE 文の形式 281, 282
DECLARE 285
DECLARE 文の変数の宣言の規則 286
FOR 289
FOR お よ び ITERATE 文 293
FOR お よ び LEAVE 文 293
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
索引
FOR と DECLARE CURSOR 293
IF 297
ITERATE 304
LEAVE 308
LOOP 311
REPEAT 316
SET 319
WHILE 321
ス ト ア ド ・ プ ロ シージ ャ での SQL 操作 137
ス ト ア ド ・ プ ロ シージ ャ の語彙
FOR ループ変数 127
カー ソ ル 127
キーワ ー ド 124
区切 り 記号 129
結果 コ ー ド 変数 130
語分離符号 130
サポー ト さ れてい る デー タ ・ タ イ プ 128
相関 128
名前 123
パ ラ メ ー タ 125
別名 128
ユーザー定義関数 129
ラ ベル 127
リ テ ラ ル 124
列名 128
ロ ーカル変数 124
ロ ッ ク 修飾子 130
せ
制御文、 ス ト ア ド ・ プ ロ シージ ャ 138
制御文の処理 163
接続、 PP2 か ら Teradata DBS への 369
暗黙接続 369
実行時の実行接続 368
明示接続 368
宣言 さ れた カー ソ ル、 目的 23
戦術的問い合わせ
ス ト ア ド ・ プ ロ シージ ャ 147
ス ト ア ド ・ プ ロ シージ ャ と 監査 150
ス ト ア ド ・ プ ロ シージ ャ と セキ ュ リ テ ィ 150
ス ト ア ド ・ プ ロ シージ ャ と 複雑な戦術的更新 148
ス ト ア ド ・ プ ロ シージ ャ と マ ク ロ の比較 150
不必要なデー タ ベース作業を省略す る ス ト ア ド ・
プ ロ シージ ャ 149
そ
相関 128
相互再帰 145
て
デー タ ・ タ イ プ ・ コ ー ド 434
定位置カー ソ ル 31, 293
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
CHECKSUM ロ ッ ク 34
FOR CHECKSUM 句 33
PP2 で行を更新 32
PP2 の SELECT AND CONSUME 文 33
WHERE CURRENT OF 句 33
規則 34
サポー ト 33
ス ト ア ド ・ プ ロ シージ ャ で行を更新 32
ス ト ア ド ・ プ ロ シージ ャ で行を削除 32
と
動的 SQL 353
DECLARE CURSOR 文 46
DESCRIBE 文 355
EXECUTE IMMEDIATE 文 360
EXECUTE 文 358
PREPARE 文 362
オブジ ェ ク ト の所有権 144
準備形式 354
使用 353
ス ト ア ド ・ プ ロ シージ ャ 内 141
ス ト ア ド ・ プ ロ シージ ャ の規則 144
即時形式 354
文の構文 354
ト リ ガー 130
取 り 出 し た行の割 り 当て順序 75
な
名前、 ス ト ア ド ・ プ ロ シージ ャ 123
に
入力ホ ス ト 変数 256
使用の規則 256
静的要求 257
動的要求 258
は
パ ラ メ ー タ 125
ハン ド ラ ー ・ ア ク シ ョ ン、 で発生 し た条件 173
ひ
標識変数 263
規則お よ び指針 264
使用の規則 264
ふ
複文要求 131, 266
DESCRIBE 文 266
FOR STATEMENT 句 266
PREPARE 文 266
動的 SQL 266
485
索引
ほ
ホ ス ト 構造 251
ホ ス ト 変数 252
SQL 文字列 262
構造化ホ ス ト 変数 251
使用の一般規則 253
標識変数 263
ホ ス ト 構造 251
ま
マルチセ ッ シ ョ ン ・ プ ロ グ ラ ミ ン グ 399
も
文字セ ッ ト
KANJI1 オブジ ェ ク ト の作成に対す る 制限 129
ゆ
ユーザー定義関数。 UDT を参照
よ
要求、 複文 266
読み取 り 専用カー ソ ル 293
ら
ラ ージ ・ オブジ ェ ク ト お よ び UPDATE 文 102
ラ ベル 127
り
リ テ ラ ル 124
る
ルール
DELETE 文 ( 定位置形式 ) 64
OPEN 文 ( 埋め込み SQL 形式 ) 80
れ
例外条件 ト ラ ンザ ク シ ョ ンの意義 170
列名 128
連鎖再帰 146
ろ
ロ ーカル変数 124
ロ ッ ク 修飾子 130
わ
割 り 当て順序、 取 り 出 し た行の 75
486
SQL ス ト ア ド ・ プ ロ シージ ャ お よ び埋め込み SQL
Fly UP