2012-05-10 17 views
3

データベース接続をチェックするための簡単なpro * cプログラムを作成しました。コードは次のとおりです。セグメンテーションフォールトpro *データベース接続用コード

int main() 
{ 
    char *conn_string = "IDA/[email protected]"; 
    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; 
} 

次のコマンドは、私はプロ* Cコード

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 

のexectuable(test_connection)を作成するために実行されると、私はtest_connection exeファイルを実行すると、出力は

value of x is before db connection 10 
conn_string IDA/[email protected] 
Segmentation fault 

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

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

答えて

3

私はHPUX 11.11/Oracle 11でテストして問題なく動作します。私はすべての問題を参照してください、しかし、いくつかの変更しようとしないでください:

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... 
  • :この接続コマンドを試してみてください

    EXEC SQL BEGIN DECLARE SECTION; 
    int x = 0; 
    EXEC SQL END DECLARE SECTION; 
    
  • :DECLAREセクションに

    1. 宣言 'X' をSEGFAULTがスローされる場所を確認するにはとEXEC SQL SELECT ...の間にprintf("here 1");を挿入します。

  • +0

    まだセグメント化エラーが発生しています。コアファイルは生成されません。 SQL CONNECTの前後に印刷文を挿入しました。 SQL_CONNECTが実行される前の印刷が実行されますが、SQL CONNECT dintが実行された後に印刷されます。 SQL CONNECTに何か問題があると思います。しかし、考えていない – bhuvana

    +0

    それはEXECのSQLを解釈することはできません私は思う..何が問題になる可能性がありますか? – bhuvana

    +0

    はい。我々は解釈することができません。私は考えています...
    オラクルのライブラリのバージョンはすべてのシステムで同じですか?バイナリに対処しているのか、earchシステム用に再コンパイルしていますか?私はすでにlibのバージョン9と11に問題がありました。 –

    1

    私はこの問題を抱えていました。私のソースに手を出すことで差が出ませんでした。最後に働いたのは、すべての(すべての)ライブラリを再初期化して、Oracleのライブラリの32ビット版のみにアクセスできることを確認したときでした。オラクルは64ビットライブラリに接続しているようだ。 32ビット版以外のすべてのライブラリまたは実行ファイルへの参照をすべて削除するだけで済みました。これには、Pro * Cの32ビット版の実行も含まれます。

    関連する問題