Comments
Description
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