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. 在 DECLARE SECTION 中声明“x”:

    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");between EXEC SQL CONNECT...andEXEC SQL SELECT ...以查看 SEGFAULT 被抛出的位置。

于 2012-05-10T14:21:40.973 回答
1

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

于 2014-02-17T22:03:28.420 回答