Oracleでは、C言語を使ってデータベースをアクセスするために、Pro*Cという、C言語のプリコンパイラを提供しています。
Pro*Cのソースファイル(*.pc)をprocコマンドで、プリコンパイルすると、Cのソース(*.c)が生成されます。
プログラムは、C言語のソースの中に、EXEC SQLなどのようにソースを埋め込んで記述します。
以下に、Pro*Cを使った、簡単なサンプルプログラムを紹介します。
配列アクセスは、SQLの規格にはありませんが、大幅にデータベースの性能改善ができます。
以下のプログラムは、配列アクセスにより、データベースを全件検索するPro*Cのサンプルです。
パラメータを付けると、デバッグ用のトレースを表示します。
#include <stdio.h>
EXEC SQL BEGIN DECLARE SECTION;
varchar username[20];
varchar password[20];
char h_ddate[3000][7];
char h_kan[3000][9];
char h_ken[3000][6];
int h_kaisuu[3000];
char h_class[3000][4];
char h_code[3000][8];
int h_yoteibi[3000];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
void main(argc, argv)
int argc;
char *argv[];
{
int i;
/* 例外宣言 */
EXEC SQL WHENEVER SQLERROR GOTO errorpt;
/* Orace接続 */
strcpy(username.arr,"uuuuuu");
username.len=strlen(username.arr);
strcpy(password.arr,"pppppp");
password.len=strlen(password.arr);
EXEC SQL CONNECT :username IDENTIFIED BY :password;
/* カーソル宣言 */
EXEC SQL DECLARE CUR1 CURSOR FOR
SELECT DDATE,KAN,KEN,KAISUU,CLASS,CODE,YOTEIBI FROM TEST_DB
WHERE YOTEIBI = 15;
/* カーソルのオープン */
EXEC SQL OPEN CUR1;
/* データの取り出し */
EXEC SQL FETCH CUR1 INTO
:h_ddate,:h_kan,:h_ken,:h_kaisuu,:h_class,:h_code,:h_yoteibi;
if(argc>1) {
for(i=0;i<2500;i++){
printf("%s,%s,%s,%d,%s,%s,%d\n",
h_ddate[i],h_kan[i],h_ken[i],h_kaisuu[i],
h_class[i],h_code[i],h_yoteibi[i]);
}
}
/* カーソルのクローズ */
EXEC SQL CLOSE CUR1;
/* コミット処理 */
EXEC SQL COMMIT WORK RELEASE;
exit(0);
errorpt:
printf("\n\n%-70s \n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
}
|
動的SQLとは、プログラム内でSQL文を生成する方法です。
動的SQLを使うと、実行速度は遅くなりますが、プログラムサイズはコンパクトになります。
以下のソースは、動的SQLにより、データベースを検索するPro*Cのサンプルです。
#include <stdio.h>
EXEC SQL BEGIN DECLARE SECTION;
varchar username[20];
varchar password[20];
int h_ymd[256];
char h_data[256][8];
char h_select[256];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
void main(argc, argv)
int argc;
char *argv[];
{
int i;
/* Oracle接続 */
strcpy(username.arr,"uuuuuu");
username.len=strlen(username.arr);
strcpy(password.arr,"pppppp");
password.len=strlen(password.arr);
EXEC SQL CONNECT :username IDENTIFIED BY :password;
/* 例外宣言 */
EXEC SQL WHENEVER SQLERROR GOTO errorpt;
strcpy(h_select, "SELECT \"ymd\",\"data\" FROM ");
strcat(h_select, tbl);
EXEC SQL PREPARE SQL1 FROM :h_select;
EXEC SQL DECLARE CUR1 CURSOR FOR SQL1;
EXEC SQL OPEN CUR1;
EXEC SQL FETCH CUR1 INTO h_ymd,h_data;
EXEC SQL CLOSE CUR1;
for (i=0; i>ORA_BUF1_NUM; i++) {
buf[i].ymd = h_ymd[i];
memcpy(buf[i].data, h_data[i],8);
}
return(0);
errorpt:
printf("\n\n%-70s \n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
}
|