设为首页 收藏本站
查看: 1674|回复: 0

[经验分享] Oracle 10g及pro*c相关问题及解决方法

[复制链接]

尚未签到

发表于 2016-7-29 09:58:08 | 显示全部楼层 |阅读模式
最近一直在进行ORACLE 10g和PRO*C的学习,其中遇到了不少的问题,现记录下来,以供以后参考。

一、常见问题


[注:我的linux版本是rhel 5,Oracle版本是10g]
1、在ORACLE 10g 安装准备的过程中:缺少libXp.so.6依赖
上网搜过不少文章,但是都不是很好的解决
我自己摸索出一个解决方法:
在RHEL5的安装盘中找到libXp-1.0.0-8.i386.rpm,进行安装后,便可解决

2、在ORACLE 10g 安装过程中Xlib: connection to ":0.0" refused by server

Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified
Error: Can't open display: :0.0

以root用户登陆,在shell中运行
[iyunv@brady ~]# xhost local:oracle
non-network local connections being added to access control list
然后oracle身份就可以运行X程序了。

man xhost中有这样一段
A complete name has the syntax ‘‘family:name’’ where the families are as follows:
inet Internet host (IPv4)
inet6 Internet host (IPv6)
dnet DECnet host
nis Secure RPC network name
krb Kerberos V5 principal
local contains only one name, the empty string
si Server Interpreted

其中local那个是用来解决同一台机器的不同用户访问X的问题的。

3.proc: error while loading shared libraries: libclntsh.so.10.1:
cannot open shared object file: No such file or directory

解决方法:
在/etc/profile中添加
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib;
export LD_LIBRARY_PATH

然后可以用source /etc/profile 生效一下

4、PCC-S-02201错误

在用proc进行编译的时候(proc iname=test.pc) 出错
错误信息有很多:
PCC-S-02201, Encountered the symbol "<eof>;" when expecting one of the following....
发生 PCC-S-02201 错误时有两种解决办法:
1)升级编译器
2)设置 parse=none


更正后的命令:proc iname=test.pc parse=none
结果生成test.c文件

5、error: sqlca.h: No such file or directory

执行gcc -o test test.c时:
test.c:152:19: error: sqlca.h: No such file or directory
sqlca.h在$ORACLE_HOME/precomp/public/下
更正后的命令:gcc -o test test.c
-I $ORACLE_HOME/precomp/public

6、undefined reference to `sqlcxt'

执行5中的命令时出现错误如下:
test.c:(.text+0x5e5): undefined reference to `sqlcxt'
需要用到$ORACLE_HOME/lib/libclntsh.so

故需加上-L $ORACLE_HOME/lib -l clntsh
更正后的命令为:
gcc -o test test.c -I /home/oracle/oracle/product/10.2.0/db_1/precomp/public -L $ORACLE_HOME/lib -l clntsh
OK!至此编译成功!

但是这样写太麻烦


7、自定义的结构体总是编译不过去,提示类型不对

我的环境是suse10sp2+oracle10g, 程序中定义了如下结构体,并在EXEC SQL中使用此结构体的变量
typedef struct Tjkjmlog{
char m_getdatatime[18 +1];
char m_monitorcode[6 +1];
char m_ip[23 +1];
char m_res[30+1];
char m_alarmlevel[2+1];
char m_info[128 +1];
}Tjkjmlog;


编译错误如下:
hrwang:~/test # proc iname=jkserv.pc
Pro*C/C++: Release 10.2.0.1.0 - Production on Mon Sep 27 10:15:46 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
System default option values taken from: /opt/or1/precomp/admin/pcscfg.cfg
Syntax error at line 491, column 2, file jkserv.pc:
Error at line 491, column 2 in file jkserv.pc
Tjkjmlog jmlog;
.1
PCC-S-02201, Encountered the symbol "Tjkjmlog" when expecting one of the followi
ng:

auto, char, const, double, enum, extern, float, int, long,
ulong_varchar, OCIBFileLocator OCIBlobLocator,
OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
short, signed, sql_context, sql_cursor, static, struct,
typedef, union, unsigned, utext, uvarchar, varchar, void,
volatile, a typedef name, a precompiled header, exec oracle,
exec oracle begin, exec, exec sql, exec sql begin,
exec sql end, exec sql type, exec sql var, exec sql include,
The symbol "enum," was substituted for "Tjkjmlog" to continue.

Error at line 0, column 0 in file jkserv.pc
PCC-F-02102, Fatal error while doing C preprocessing



自定义的结构体提示没有发现的错误,通常是由于结构体定义在了
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;
这两个语句的外面,只要将结构体定义在这两句中间就可以了。如下:


EXEC SQL BEGIN DECLARE SECTION;
typedef struct Tjkjmlog{
char m_getdatatime[18 +1];
char m_monitorcode[6 +1];
char m_ip[23 +1];
char m_res[30+1];
char m_alarmlevel[2+1];
char m_info[128 +1];
}Tjkjmlog;

Tjkjmlog jmlog; /* 定义结构体变量 */
EXEC SQL END DECLARE SECTION;

  8、proc编译时,提示相关的表需要声明
  我的环境是在suse10sp2+oracle10g。 程序中使用exec sql insert into t_jm_err_his语句,编译时,总提示如下错误:
  hrwang:~/test # proc iname=jkserv.pc
  Pro*C/C++: Release 10.2.0.1.0 - Production on Mon Sep 27 09:42:53 2010
  Copyright (c) 1982, 2005, Oracle. All rights reserved.
  System default option values taken from: /opt/or1/precomp/admin/pcscfg.cfg
  Error at line 677, column 10 in file jkserv.pc
EXEC SQL insert into T_jm_err_his
.........1
PLS-S-00201, identifier 'T_JM_ERR_HIS' must be declared
Error at line 677, column 10 in file jkserv.pc
EXEC SQL insert into T_jm_err_his
.........1
PLS-S-00000, SQL Statement ignored
Semantic error at line 677, column 10, file jkserv.pc:
EXEC SQL insert into T_jm_err_his
.........1
PCC-S-02346, PL/SQL found semantic errors

出现这样的错误,我们可以proc iname=jkserv.pc userid=scott/hrwang来进行编译,
并且确保scott用户对这个表有权限(根据你的oracle情况更改用户名和密码)。或者你可以将userid=scott/hrwang 加入$oracle_home/precomp/admin/pcscfg.cfg文件中,这样在编译时就不用每次都指定了。



9、error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so:
cannot restore segment prot after reloc: Permission denied

执行程序(./test)时提示错误:
error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so:
cannot restore segment prot after reloc: Permission denied
相关的文章:
Topic:
Some Linux distributions with SELinux enabled may prevent IDL from running under the default security context. This TechTip is a workaround for CR#41937

Discussion:
Newer Linux distributions have enabled new kernel security extensions from the SELinux project at the NSA. These extensions allow finer-grained control over system security. However, SELinux also changes some default system behaviors, such as shared libraryloading, that can be problematic to third party programs.If you receive the error message "cannot restore segment prot after reloc: Permission denied" when launching IDL, then your SELinux configuration is preventing IDL from launching.

To rectify this issue, you can either:
(1)Change the default security context for IDL by issuing the command:
chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so

(2)Disabling SELinux altogether by setting the line
SELINUX=disabled
in your /etc/sysconfig/selinux file.

我使用的解决办法:chcon -t texrel_shlib_t $ORACLE_HOME/lib/*.so







注:这篇文章很多内容是转自互联网,具体出处找不到了:(。 7、8是自己添加上去的。3、4、5、6这几个问题也都遇到并按照上述方法解决了。其它的还没有试过。



二、SUSE10SP2+ORACLE10G的PRO*C的环境设置

下面我再将自己配置suse10sp2+oracle10的proc环境进行一下说明,供大家参考:

(1)安装oracle这步我就省略了

(2)在/etc/profile文件中添加相关oracle环境变量设置:
ORACLE_SID=HRWANG
ORACLE_HOME=/opt/or1
LD_LIBRARY_PATH=/opt/or1/lib:/lib:/usr/lib:/usr/local/lib
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID ORACLE_HOME LD_LIBRARY_PATH PATH


上述环境变量应该根据你的情况进行调整,不能死搬硬套。更改完成后可以通过source /etc/profile来使其在当前shell中生效。

(3)更改$ORACLE_HOME/precomp/admin/pcscfg.cfg为如下内容:
sys_include=(/opt/or1/precomp/public,/usr/include,/usr/lib/gcc/i586-suse-linux/4.1.2/include,/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include,/usr/lib/gcc-lib/i386-redhat-linux7/2.96/include)
ltype=short
userid=scott/hrwang #数据库用户名密码,根据你的情况填写
mode=oracle
parse=none
sqlcheck=semantics
dbms=v8
def_sqlcode=true


此文件的sys_include中应包含sqlca.h所在的路径,我这里为/opt/or1/precomp/public。还需要包括stddef.h所在的路径,我这里为/usr/lib/gcc/i586-suse-linux/4.1.2/include。如果这两个文件你也不知道在什么位置,可以通过
#find / -name "sqlca.h"
#find / -name "stddef.h"
来查找。另外再将常用的头文件路径加上即可,如/usr/include。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251028-1-1.html 上篇帖子: 怎样把Oracle查询转换为SQL Server 下篇帖子: 关于加大oracle内存后,防止使用缓存的参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表