在使用proc连接oracle时,如果不使用at_link,直接连接默认数据库,是可以连接上的可是只要加上at_link参数,就出现连接超时问题,本地的数据库也一样请问大家如何在proc中连接远程数据库的?

解决方案 »

  1.   

    test.sq的代码如下:
    EXEC SQL INCLUDE sqlca;
    EXEC SQL BEGIN DECLARE SECTION;
    char db_link_name[10];
    EXEC SQL END DECLARE SECTION;
     
    void sqlerror()
    {
            EXEC SQL WHENEVER SQLERROR CONTINUE;
            printf("\noracle error detected:\n");
            printf("%.70s\n", sqlca.sqlerrm.sqlerrmc);
            EXEC SQL ROLLBACK RELEASE;
            exit(1);
    }
     
    int connect_oracle(const char *name, const char *pass)
    {
            EXEC SQL BEGIN DECLARE SECTION;
            VARCHAR username[20];
            VARCHAR password[20];
            VARCHAR db_name[20];
            int id;
            VARCHAR txt[10];
            EXEC SQL END DECLARE SECTION;
     
            strcpy(username.arr, name);
            username.len = strlen(name);
            strcpy(password.arr, pass);
            password.len = strlen(pass);
            strcpy(db_name.arr, "test");
            db_name.len = strlen("test");
            strcpy(db_link_name, "lgw");
     
            EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
            //EXEC SQL CONNECT :username IDENTIFIED BY :password;
            EXEC SQL CONNECT :username IDENTIFIED BY :password AT :db_link_name USING :db_name;
            return 0;
    sqlerr:
            sqlerror();
            return -1;
    }
     
    int db_insert()
    {
            EXEC SQL BEGIN DECLARE SECTION;
            int id;
            VARCHAR txt[10];
            EXEC SQL END DECLARE SECTION;
     
            EXEC SQL WHENEVER SQLERROR DO sqlerror();
            id = 4;
            strcpy(txt.arr, "北京");
            txt.len = strlen("北京");
            EXEC SQL INSERT INTO TEST (A, B) VALUES (:id, :txt);
            EXEC SQL COMMIT WORK;
    }
     
    int db_finish()
    {
            EXEC SQL COMMIT WORK RELEASE;
    }main.c是这样的#include "db.h"
     
    int main(int argc, char *argv[])
    {
            if (argc < 3) {
                    printf("usage: %s username password\n", argv[0]);
                    return 0;
            }
            if (connect_oracle(argv[1], argv[2]) < 0) {
                    printf("connect oracle failed\n");
                    return 0;
            } else {
                    db_insert();
                    db_finish();
            }
     
            return 0;
    }程序运行时报的错误如下:
    oracle error detected:
    ORA-12170: TNS:Connect timeout occurred