1

以下のような構成を使用したレガシーPro*Cコードがいくつかあります。
この種のパターンはオンラインフォーラムにありますが、Oracleのドキュメントにはありません。
特に、GoogleはOracleのWebサイトで「sqhsts」に関するドキュメントを見つけることができません

このパターンはどこかに文書化されていますか?
それは良いプログラミング慣行と考えられていますか?

/* cud (compilation unit data) array */
static const short sqlcud0[] =
{10,4130,832,0,0,
5,0,0,1,0,0,27,23,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0,
36,0,0,2,30,0,4,25,0,0,1,0,0,1,0,2,97,0,0,
};

/* EXEC SQL CONNECT :user IDENTIFIED BY :pwd USING :url; */ 

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )5;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)user;
sqlstm.sqhstl[0] = (unsigned int )0;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = ( void *)pwd;
sqlstm.sqhstl[1] = (unsigned int )0;
sqlstm.sqhsts[1] = ( int )0;
sqlstm.sqindv[1] = ( void *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned int )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqhstv[2] = ( void *)url;

(ここからコピーされたコードですが、私のものと似ています)

4

1 に答える 1

6

Pro * Cは、次のようなステートメントから低レベルのCを作成します。

EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;

これにより、宣言する各データ項目のOCIのような記述子が作成されます。次に、これらのバインドされた変数を使用してsqlを埋め込む他のステートメント(EXEC SQL ...;)は、declareセクションでエンコードされたものを使用して、より低いレベルの一連の呼び出しに変換されます。Pro*Cは古いです。私は25年以上前にPro*Cの最初のベータ版に取り組みました。...お勧めしません。

Pro * Cの事前コンパイルによって生成されたコードは、警告が有効になっている最新のコンパイラーによってコンパイルされた場合、常に完全に機能するとは限りません。また、読み取り可能であることを意図していません。OCIプログラミングを学びたい場合は、何が起こっているのかを知ることができます。特別なタスクを実行したい場合を除いて、実際にはお勧めしません。

タスクの例:OCIは、Oracle用の外部C /C++ライブラリを作成するために使用されます。これにより、オラクルでやりたいことのほとんどすべてを、きめ細かいレベルで操作できます。ここから始める:

http://www.oracle.com/technetwork/database/features/oci/index.html

于 2012-02-20T04:53:55.097 に答える