3

データベースの接続をチェックする簡単な pro*c プログラムを作成しました。コードは次のとおりです。

int main()
{
    char *conn_string = "IDA/IDA@DBISPSS";
    int x = 10;
    printf("value of x is before db connection %d\n",x);
    printf(" conn_string %s \n",conn_string);
    EXEC SQL CONNECT :conn_string;
    EXEC SQL SELECT 1 INTO :x FROM DUAL;
    printf("value of x is %d\n",x);
    return 0;
}

pro*c コードの実行可能ファイル (test_connection) を作成するために実行した次のコマンド

proc test_connection.pc

cc -I${ORACLE_HOME}/precomp/public -c test_connection.c
cc   test_connection.o   -o test_connection -L$ORACLE_HOME/lib -lclntsh

そして、test_connection exeを実行すると、出力は

value of x is before db connection 10
conn_string IDA/IDA@DBISPSS
Segmentation fault

しかし、同じコードは、別の Linux マシンと Solaris マシンでもうまく機能します。

セグメンテーション違反がスローされるのはなぜですか?

4

2 に答える 2

4

HPUX 11.11/Oracle 11 でテストしたところ、問題なく動作しました。問題はありませんが、いくつかの変更を試してください。

  1. 'x' を DECLARE SECTION に宣言します。

    EXEC SQL BEGIN DECLARE SECTION;
    int x = 0;
    EXEC SQL END DECLARE SECTION;
    
  2. 次の接続コマンドを試してください。

    EXEC SQL BEGIN DECLARE SECTION;
    char *user = "abc", *password = "123", *database="base";
    EXEC SQL END DECLARE SECTION;
    EXEC SQL DECLARE BASE_HANDLE DATABASE;
    ...
    EXEC SQL CONNECT :user IDENTIFIED BY :password AT BASE_HANDLE USING :database;
    ...
    EXEC SQL AT BASE_HANDLE SELECT 1...
    
  3. printf("here 1");と の間EXEC SQL CONNECT...に を挿入してEXEC SQL SELECT ...、SEGFAULT がスローされる場所を確認します。

于 2012-05-10T14:21:40.973 に答える
1

私はその問題を抱えていましたが、ソースをいじっても何の違いもありませんでした。最終的に機能したのは、すべての (ALL) ライブラリを再初期化して、Oracle がライブラリの 32 ビット バージョンにのみアクセスできるようにしたときでした。Oracle が何らかの形で 64 ビット ライブラリに接続されていたようです。32 ビット バージョン以外のライブラリまたは実行可能ファイルへのすべての参照を削除することによってのみ機能しました。これには、Pro*C の 32 ビット バージョンの実行が含まれていました。

于 2014-02-17T22:03:28.420 に答える