我正在远程 Red-Hat 服务器上工作,正在开发一个 C 应用程序来将数据插入到远程 Oracle 数据库中。所以首先我在服务器上安装了 OCI 即时客户端 rpm 并尝试编译一个示例程序。经过某些链接后我可以编译它。但当我要运行它时。它退出并给出错误消息
ORA-12162: TNS:net 服务名称指定不正确
我使用的示例代码来自博客(如果您需要澄清事情,请参阅此代码。我在这篇文章中仅引用了几段内容) René Nyffenegger's collection of things on the web René Nyffenegger on Oracle
(如果您需要澄清一些事情,请参阅此代码。我在这篇文章中仅引用了几段内容)
在代码中,我添加了一些打印来检查错误,它似乎卡在了 OCIServerAttach()
函数中 r
给出了 -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;
}
还有一点是,在编译过程中会给出一个警告,说某个库没有被包含。但已创建可执行文件。这是我在编译过程中得到的信息。
[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
最佳答案
我的建议是完全绕过 tnsnames。 Oracle 始终允许您输入直接连接详细信息,但 EZConnect 使这变得更加容易。
格式化连接字符串时,不要列出 TNS 名称,而是使用以下格式的实际连接属性:
servername:port/service name
例如
MyOracle.MyCompany.Com:1521/SalesReporting
您的连接字符串可能还需要 direct=true
,但老实说我不确定。
我喜欢 tnsnames 的想法,但它是一把双刃剑。当它起作用时,那就太棒了。如果没有,你就想扔东西。有了 EZConnect,它总是有效。
顺便说一句,如果你不知道上面三项的属性,请找到一台通过 tnsnames 连接的机器:
tnsping <your TNS-named database>
关于C 程序退出并出现错误 ORA-12162 : TNS:net service name is incorrectly specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219948/