[xxxx@localhost ~]$ proc
proc: error while loading shared libraries: libclntsh.so.19.1: cannot open shared object file: No such file or directory
初步判断是动态链接的路径没关联,查看了$LD_LIBRARY_PATH
环境变量的值为空,则设置了环境变量的值为$ORALCE_HOME/lib
(对应的目录),并(source 或 点号)生效
Pro*C/C++: Release 19.0.0.0.0 - Production on Fri Apr 1 22:57:59 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
System default option values taken from: /opt/oracle/product/19c/dbhome_1/precomp/admin/pcscfg.cfg
Option Name Current Value Description
-------------------------------------------------------------------------------
auto_connect no Allow automatic connection to ops$ account
char_map charz Mapping of character arrays and strings
close_on_commitno Close all cursors on COMMIT
cmax 100 CMAX Value for connection pool
cmin 2 CMIN Value for connection pool
后续未粘贴
sqlplus user/passwd@连接名称 (就是$ORACLE_HOME/network/admin/tnsnames.ora定义的连接名称)
tnsnames.ora 小部分示例
ORCLPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCLPDB1)
)
如tnsname.ora里面定义的是这样,连接名就是ORCLPDB
注意一下SERVICE_NAME为数据库的名称,在oracle12c后,引入了一种容器的概念,涉及到PDB(可插拔数据库),如果是PDB的oracle用户,则对应SERVICE_NAMRE为PDB的名称,使用select NAME from v$pdbs;查看
更详细的说明请见:redhat7 RPM 安装oracle 19c详细步骤和相关问题的解决方法
ORACLE 12C新特性:CDB与PDB详解
本人遇到问题:linux上的oracle用户可以登录数据库,但是linux上的其他用户不能登录数据库。
最后检查发现是其他用户的用户所属组的问题。
首先id oracle
查看linux的oracle用户存在哪些分组。然后将自己要用的用户也变更成对应的用户组,然后其他组作为附加组。
基本上将自己需要的用户如 zhangsan。加上oracle用户目录所属组,以及oracle安装文件目录所属组 就基本可以了
先使用root用户,然后usermod -g 组1 zhangsan;(组1可以是oracle用户目录所属组)
然后usermod -G 组2 zhangsan;(组2则为oracle安装文件目录所属组)
然后使用zhangsan用户,sqlplus sys as sysdba 看能否登陆数据库
然后sqlplus user/passwd@连接名称 能否使用数据库一般用户进行数据库登陆,如果都可以,则OK
/*网上找的简单示例:*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
void sql_error();
struct info /*结构体*/
{
int id;
char name[20];
char sex[6];
char tel[12];
};
struct info_ind /* 指示器变量*/
{
short id_ind;
short name_ind;
short sex_ind;
short tel_ind;
};
int main(int argc,char * argv[])
{
char *pConn="user/passwd@ORCLPDB";
int id=0; /*宿主变量*/
char strname[20];
char strsex[4];
char strtel[11];
struct info myinfo;
struct info_ind ind;
EXEC SQL WHENEVER SQLERROR DO sql_error();
/*连接数据库*/
EXEC SQL CONNECT :pConn;
if (sqlca.sqlcode == 0)
printf("connect sucess\n");
else
printf("connect fail\n");
#if 0
EXEC SQL drop table student; /*如果有该表则先干掉,再创表*/
#endif
EXEC SQL create table student(stuid int not null,stuname varchar(20) not null,stusex varchar(4),stutel char(11)); /*创表*/
EXEC SQL insert into student values(1,'feng','boy','12589894789'); /*插入数据*/
EXEC SQL insert into student values(2,'wang','girl','07245689145');
EXEC SQL INSERT INTO student VALUES(3,'long','boy','13122514899');
EXEC SQL insert into student values(4,'xiong','girl','13838383388');
EXEC SQL insert into student values(5,'zhang','boy','15858568945');
while (1)
{
printf("please input the id(0-exit):");
fscanf(stdin,"%d",&id);
if( 0 == id ){
printf( "exit.\n" );
return 0;
}
/*EXEC SQL select stuname,stusex,stutel into :strname ,:strsex,:strtel from student where stuid=:id; */ /*可以单个插*/
EXEC SQL select stuid,stuname,stusex,stutel into :myinfo indicator :ind from student where stuid =:id; /*可以插入到一个结构体*/
printf("\nthe infomation:%s\n",myinfo.name);
printf("%s\n",myinfo.sex);
printf("%s\n",myinfo.tel);
}
EXEC SQL commit work release; /*提交*/
return 0;
}
void sql_error()
{
printf("oracle error\n");
char buf[100];
int buflen,msglen=0;
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
buflen=sizeof(buf);
sqlglm(buf,&buflen,&msglen);
printf("%d-%s\n",msglen,buf);
exit(1);
}
#编写了个sh,执行编译过程
#修改成你的pro*c 文件
in=test.pc
#修改成你要生成的c文件
out=test.c
proc iname=$in oname=$out
gcc -I${ORACLE_HOME}/precomp/public $out -o test -L${ORACLE_HOME}/lib -lclntsh
./test
至此程序就跑起来了。
PS:
查看sqlca.sqlcode错误码对应的错误信息:oerr ora 1403
(1403为错误码)