17.00 - 17.05 - 手順の概略 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

一般に、SQLを実行するCまたはC++外部ストアド プロシージャは、標準的なCLIアプリケーション プログラミング手法に従っています。CLIv2を使用したデータベースとのやりとりについては、<Teradata® CLI V2ワークステーション接続システム、B035-2418>を参照してください。

以下に、CLIv2を使用して直接SQLを実行するCまたはC++外部ストアド プロシージャを定義するための基本的なステップを示します。完全なコード例については、外部ストアド プロシージャのサンプル コードを参照してください。

ステップ アクション サンプル コード
1 CLIv2ヘッダー ファイルをsqltypes_td.hヘッダー ファイルの後にインクルードします。
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
#include <stdio.h>
#include <wchar.h>
 #include <coptypes.h> 
 #include <coperr.h> 
 #include <parcel.h> 
 #include <dbcarea.h> 

...
2 CREATE PROCEDURE文またはREPLACE PROCEDURE文で指定したパラメータ受渡しルールに従って、関数を宣言します。
void ET001_xsp1( VARCHAR_LATIN *A_Name,
                 VARCHAR_LATIN *B_Result,
                 char           sqlstate[6])
{
   ...
3 DBCAREAを初期設定します。
...

DBCAREA dbcarea;
Int32   result;
char    cntxt[4];
char    str1[200];

dbcarea.total_len = sizeof(struct DBCAREA);
 DBCHINI(&result, cntxt, &dbcarea); 

...
4 デフォルト接続の作成オプションを'Y'に変更して、デフォルト接続を確立します。

このステップは、標準的なCLIアプリケーション プログラミングとは異なります。

デフォルト接続は、外部ストアド プロシージャが実行されているセッションにSQLを送付します。

...

dbcarea.change_opts = 'Y';
dbcarea.use_presence_bits = 'N';
dbcarea.keep_resp = 'N';
dbcarea.loc_mode = 'Y';
dbcarea.var_len_req = 'N';
dbcarea.save_resp_buf = 'N';
dbcarea.two_resp_bufs = 'N';
dbcarea.ret_time = 'N';
dbcarea.wait_for_resp = 'Y';
dbcarea.req_proc_opt = 'E';
dbcarea.req_buf_len = 1024;
dbcarea.resp_buf_len = 1024;
dbcarea.data_encryption = 'N';
 dbcarea.create_default_connection = 'Y'; 
 dbcarea.func = DBFCON; 

 DBCHCL(&result, cntxt, &dbcarea); 

...
5 SQLリクエストを開始し、応答を取得して、リクエストを終了します。

(必要に応じてこのステップを繰り返します)

...

memset(str1, ' ', 100);
sprintf(str1, "DELETE USER %s;", A_Name);
dbcarea.func = DBFIRQ;
dbcarea.req_ptr = str1;
dbcarea.req_len = strlen(str1);
 DBCHCL(&result, cntxt, &dbcarea); 
if (result != EM_OK)
{
   strcpy(sqlstate, "U0007");
   return;
}

...

dbcarea.func = DBFFET;
 DBCHCL(&result, cntxt, &dbcarea); 

if (result != EM_OK)
{
   strcpy(sqlstate, "U0008");
   return;
}
...

dbcarea.func = DBFERQ;
 DBCHCL(&result, cntxt, &dbcarea); 
if (result != EM_OK)
{
   strcpy(sqlstate, "U0009");
   return;
}

...
6 INOUT引数またはOUT引数を設定します。

割り当てられたメモリの解放、他のシステムへの接続の終了などのクリーンアップを実行します。

戻ります。

   ...

   strcpy((char *)B_Result, "User deleted.");

}