C程序退出给出错误ORA-12162:TNS:错误地指定了网络服务名称

时间:2015-12-11 09:21:10

标签: c oracle redhat oracle12c tnsnames

我正在开发一个远程red-hat服务器,我正在开发一个c应用程序来将数据插入远程oracle数据库。首先,我在服务器上安装了OCI即时客户端rpm,并尝试编译示例程序。经过某些联系,我可以编译它。但是当我要去运行时。退出时会出现错误

ORA-12162: TNS:net service name is incorrectly specified

我使用的示例代码来自博客(如果您需要澄清这些内容,请参阅此代码。我在这篇文章中只引用了几篇文章) René Nyffenegger's collection of things on the web René Nyffenegger on Oracle

(如果你需要澄清一些事情,请参考此代码。我在这篇文章中只引用了几篇文章)

在代码中我添加了一些打印来检查错误并且它似乎卡在OCIServerAttach()函数r中,打印的walue为-1

r=OCIServerAttach(srv, err,  dbname, strlen(dbname), (ub4) OCI_DEFAULT);
printf("r value %d",r);

if (r != OCI_SUCCESS) {
checkerr(err, r);
goto clean_up;
}

另一点是,在编译过程中,它会发出警告,说明某个libry不包括在内。但是可以创建exicutable文件。这是我在编译过程中得到的按摩。

[laksithe@loancust ~]$ gcc -L$ORACLE_HOME/lib/ -L$ORACLE_HOME/rdbms/lib/ -o oci_test oci_test.o -L/usr/lib/oracle/12.1/client64/lib  -lclntsh   `cat $ORACLE_HOME/lib/sysliblist`
cat: /lib/sysliblist: No such file or directory

通过网络我发现通过创建一个带有连接细节的tnsnames.ora文件,我可以解决问题。但即使它对我没有用。以下是该博客blog

的链接

这个错误已经过了一个星期,我感到很冷淡。有人可以帮助我。

我使用的

连接字符串格式为abc.ghi.com:1521/JKLMN

1 个答案:

答案 0 :(得分:1)

我的建议是完全绕过tnsnames。 Oracle一直允许您输入直接连接详细信息,但EZConnect使这更容易。

格式化连接字符串时,请使用以下格式的实际连接属性,而不是列出TNS名称:

servername:port/service name

例如

MyOracle.MyCompany.Com:1521/SalesReporting

您的连接字符串可能还需要direct=true,但我老实说不确定。

我喜欢tnsnames的想法,但它是一把双刃剑。当它工作时,它很棒。如果它没有,你想扔东西。使用EZConnect,它始终有效。

顺便说一下,如果您不知道上述三个项目的属性,请找一台通过tnsnames连接的机器:

tnsping <your TNS-named database>