先日、SuSE LinuxでC / C ++を使用してOracle DBMSからデータを取得する必要に直面しました
その前は、他の言語(Perl、PHP、sh)から同様のことを繰り返していましたが、Cからはこれまでにありませんでした。
Oracleに接続できるすべての利用可能なツールの中で、procをプリコンパイルする方法を決めました。そのバイナリはOracleクライアントの基本パッケージに含まれています。
色の暴動が発生するシステム:
vmotp#cat / etc / SuSE-release
SUSE Linux Enterprise Server 11(i586)
バージョン= 11
PATCHLEVEL = 0
+
oracle.client VER:10.2.0.1.0
データベース自体は別のマシン上にあります。 サーバーバージョン:9.0.2(古いことは知っていますが、履歴レプリカと一時テーブルの単純なベースとしてのみ機能します)
まず、クエリ結果を表示する「Hello World」のような例を作成しましょう。
SELECT 12345,'TEST STRING' FROM dual;
次の内容のファイルtest_ora.pcを作成します
#include <ctype.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#define ORA_PARAM " ORACLE_LOGIN/ORACLE_PASS@ORACLE_SID " /* */
EXEC SQL BEGIN DECLARE SECTION; /* END DECLARE SECTION , Oracle*/
static int ora_i; /* INT */
static VARCHAR ora_str[20]; /* CHAR */
static VARCHAR connect_str[100]; /* */
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA; /* SQLCA ( ) */
int main( int argc, char* argv[] )
{
char str[21]; /* CHAR */
memset(str,0,sizeof(str)); /* */
connect_str.len = sprintf(connect_str.arr,ORA_PARAM); /* */
EXEC SQL CONNECT :connect_str; /**/
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL SELECT 12345,'TEST STRING' INTO :ora_i,:ora_str FROM dual; /* , */
sprintf( str, "%*.*s", ora_str.len, ora_str.len, ora_str.arr ); /* CHAR C */
printf("\ni=[%d], str=[%s]\n", ora_i, str ); /* */
return 0;
} /* end of main() */
ここで、ファイルをprocユーティリティに「フィード」する必要があります。デフォルトでは、パスは$ ORACLE_HOME / bin /にあります。
/opt/oracle/product/11gR1/db/bin/proc CODE=ANSI_C include=/opt/oracle/product/11gR1/db/lib include=/usr/lib/gcc/i586-suse-linux/4.3/include/ ireclen=4800 oreclen=4800 select_error=no release_cursor=no hold_cursor=yes ltype=none cpp_suffix=c USERID= ORACLE_LOGIN/ORACLE_PASS@ORACLE_SID SQLCHECK=SEMANTICS iname=test_ora.pc;
cc test_ora.c -L/opt/oracle/product/11gR1/db/lib /opt/oracle/product/11gR1/db/lib/libclntsh.so /opt/oracle/product/11gR1/db/lib/libsqlplus.a -o test_ora;
結果のファイルを実行し、フォーカスが成功したことを確認します。
vmotp$ ./test_ora
i=[12345], str=[TEST STRING]
vmotp$
PS。 私は友達のリクエストでこの記事を公開します。 まだHabrにログインしていないユーザー、招待がまだある場合は、共有してください(lanarion(at)gmail.com)。