遇到一个关于ORA-12154的问题,相当棘手,求各位大哥给指条明路。先把服务器构成说一下
DB服务器(以下皆称ora_serv)
OS: Solaris 10(x86 10/08)
安装Oracle10g Release 10.2.0.1.0 Server
数据库名:TKSY 用户:tokusya 密码:tokusya应用程序服务器(以下皆称ora_clent)
OS: Solaris 10(x86 10/08)
安装了Oracle10g Release 10.2.0.1.0 client,apache 2.2.11问题在ora_clent上用PL/SQL写了CGI当执行数据库连接的时候出现错误返回
的sqlcode是-12154,以下为连接数据库时的部分代码-------------------------------------------------------------------------------EXEC SQL INCLUDE SQLCA;int DBConnectSet()
{
EXEC SQL BEGIN DECLARE SECTION;
varchar hs_username[256];
varchar hs_password[256];
varchar hs_dbname[256];
EXEC SQL END DECLARE SECTION; // 用户名,密码,数据库名设置
strcpy(hs_username.arr, "tokusya");
hs_username.len = strlen(hs_username.arr);
strcpy(hs_password.arr, "tokusya");
hs_password.len = strlen(hs_password.arr);
strcpy(hs_dbname.arr, "TKSY");
hs_dbname.len = strlen(hs_dbname.arr); EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL CONNECT :hs_username IDENTIFIED BY :hs_password AT :hs_dbname;
return 0;sqlerror:
EXEC SQL WHENEVER SQLERROR CONTINUE;
// 出错返回
return sqlca.sqlcode;
}
-------------------------------------------------------------------------------查了关于ORA-12154错误的内容都是围绕着tnsnames.ora和sqlnet.ora的设置。
在ora_clent上用netca设置了服务,用tokusya用户测试连接也通过了。tnsnames.ora设置如下
-------------------------------------------------------------------------------
TKSY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.172)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = TKSY)
)
)
-------------------------------------------------------------------------------sqlnet.ora设置如下
-------------------------------------------------------------------------------
NAMES.DIRECTORY_PATH= (TNSNAMES)
-------------------------------------------------------------------------------在ora_clent上tnsping TKSY也显示正常成功。
用sqlplus tokusya/tokusya@TKSY也能正常连接数据库。可就是一旦执行CGI连接数据库就会返回
-12154这个错误code。我已经无计可施,走投无路了,恳请给为高人指点,谢谢先。
DB服务器(以下皆称ora_serv)
OS: Solaris 10(x86 10/08)
安装Oracle10g Release 10.2.0.1.0 Server
数据库名:TKSY 用户:tokusya 密码:tokusya应用程序服务器(以下皆称ora_clent)
OS: Solaris 10(x86 10/08)
安装了Oracle10g Release 10.2.0.1.0 client,apache 2.2.11问题在ora_clent上用PL/SQL写了CGI当执行数据库连接的时候出现错误返回
的sqlcode是-12154,以下为连接数据库时的部分代码-------------------------------------------------------------------------------EXEC SQL INCLUDE SQLCA;int DBConnectSet()
{
EXEC SQL BEGIN DECLARE SECTION;
varchar hs_username[256];
varchar hs_password[256];
varchar hs_dbname[256];
EXEC SQL END DECLARE SECTION; // 用户名,密码,数据库名设置
strcpy(hs_username.arr, "tokusya");
hs_username.len = strlen(hs_username.arr);
strcpy(hs_password.arr, "tokusya");
hs_password.len = strlen(hs_password.arr);
strcpy(hs_dbname.arr, "TKSY");
hs_dbname.len = strlen(hs_dbname.arr); EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL CONNECT :hs_username IDENTIFIED BY :hs_password AT :hs_dbname;
return 0;sqlerror:
EXEC SQL WHENEVER SQLERROR CONTINUE;
// 出错返回
return sqlca.sqlcode;
}
-------------------------------------------------------------------------------查了关于ORA-12154错误的内容都是围绕着tnsnames.ora和sqlnet.ora的设置。
在ora_clent上用netca设置了服务,用tokusya用户测试连接也通过了。tnsnames.ora设置如下
-------------------------------------------------------------------------------
TKSY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.172)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = TKSY)
)
)
-------------------------------------------------------------------------------sqlnet.ora设置如下
-------------------------------------------------------------------------------
NAMES.DIRECTORY_PATH= (TNSNAMES)
-------------------------------------------------------------------------------在ora_clent上tnsping TKSY也显示正常成功。
用sqlplus tokusya/tokusya@TKSY也能正常连接数据库。可就是一旦执行CGI连接数据库就会返回
-12154这个错误code。我已经无计可施,走投无路了,恳请给为高人指点,谢谢先。
Bug No. 5389730 Solution
To avoid the error from happening, use one of the following solutions:
avoid accessing tnsnames.ora by using connectstring like this
jdbc:oracle:oci:@myhost:port:sid
or
jdbc:oracle:oci:@//myhost:port/service
Upgrade to JDBC 10.2.0.2.0 and install one-off Patch 8812229
用的是PL/SQL没有使用JDBC。
改为:
EXEC SQL CONNECT :hs_username IDENTIFIED BY :hs_password AT :hs_dbname USING :hs_dbname;
试试