用于数据库连接的分段故障pro * c代码

时间:2012-05-10 13:54:45

标签: unix oracle-pro-c

我写了一个简单的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代码

的exectuable(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机器上运行良好。

为什么抛出分段错误?

2 个答案:

答案 0 :(得分: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的投放位置。

答案 1 :(得分:1)

我遇到了这个问题,没有任何摆弄我的来源有任何区别。最终工作的是当我重新初始化所有(所有)我的库以确保Oracle只能访问该库的32位版本时。似乎Oracle以某种方式连接到64位库。仅删除除32位版本以外的所有库或可执行文件的引用。这包括运行32位版本的Pro * C.