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; } |