在这样一个场景下:你已有大量Pro*C代码,但是你的Oracle数据库版本要升级了,于是你的客户端也要等版本的升级。
当然客户端一般都具有兼容性,所以也可以不升级,但是老板们一般不这么想嘛,万一出事,你负责啊?咋整,只能升级了呗。
但是又不想把proc也升级啊,因为那样的话,你的Pro*C代码怎么办,重新编译测试一遍?come on。
新数据库:Oracle 19c
老数据库:Oracle 11g
办法自然是很老套,客户端升级,但是proc嘛,还是用原来的嘛。皆大欢喜。
又是一个温暖的下午,我抓心挠肝的发现了一个问题,新客户端搭配老proc,出了个错。
proc: symbol lookup error: proc: undefined symbol: kgefac_
在linux命令行上敲 proc -v,想看一下版本对不对,哎,事情都是这样啦,不过没有问题还要我们程序员干嘛,对不对。
我用 ldd proc命令来看看,到底proc都招惹了谁
[test@test sdk]$ ldd proc
/lib64/ld-linux-x86-64.so.2 (0x00007fe18894c000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007fe183071000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe183273000)
libclntsh.so.11.1 => /u01/app/oracle/product/instantclient_19_6/libclntsh.so.11.1 (0x00007fe1846c7000)
libclntshcore.so.19.1 => /u01/app/oracle/product/instantclient_19_6/libclntshcore.so.19.1 (0x00007fe1828b5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe183d79000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe183a77000)
libnnz11.so => /u01/app/oracle/product/instantclient_19_6/libnnz11.so (0x00007fe183f7d000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fe183641000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe18385b000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fe182e57000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe188744000)
linux-vdso.so.1 => (0x00007ffcccd45000)
我发现这个libclntsh.so.11.1在11g里就一个文件,19c里分成了两个,ibclntshcore.so.xxx,这个很可疑,
另外,libnnz11.so在新客户端里连软链接都没有,估计被19c给摒弃了
所以我就从11g里面把libclntsh.so.11.1和libnnz11.so都拿过来,再试一遍,耶!可以交差啦。
[test@test sdk]$ proc -v
Pro*C/C++: Release 11.2.0.4.0 - Production on Fri 6月 5 09:55:52 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.