.pc 文件是 Pro*C 源文件,应该使用 Oracle 的预编译器 proc 来生成 .c 文件
上篇文件讲了安装oracle数据库,这篇文件是在上篇基础上使用数据库
一、新建linux的sun用户
cpp
#新建sun用户
[root@localhost ~]# useradd sun
#设置sun密码
[root@localhost ~]# passwd sun
二、将sun用户加入oracle用户的组
1.查看oracle用户组的信息
cpp
[root@localhost ~]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba)
[root@localhost ~]#
可以看到 oracle 用户的主组通常是 oinstall,同时也属于 dba、oper 等组
|----------|----------------------|
| 组名 | 作用 |
| oinstall | Oracle 软件所有者组(主组) |
| dba | 数据库管理员组,拥有 SYSDBA 权限 |
| oper | 操作员组,拥有 SYSOPER 权限 |
- 将 sun 用户添加到 dba 组(最常用,让 sun 能管理数据库)
注意:-aG 参数中的 -a 表示追加(append),不加 -a 会覆盖用户原有的所有组,非常危险!
cpp
[root@localhost ~]# usermod -aG dba sun
# 验证是否添加成功
# 查看 sun 用户现在的组
[root@localhost ~]# id sun
三、给sun用户添加oracle的环境变量
cpp
[root@localhost ~]# su - sun
Last login: Tue Jun 2 03:38:50 EDT 2026 on pts/2
[sun@localhost ~]$
[sun@localhost ~]$ vim .bash_profile
.bash_profile文件里内容如下:
第14~18行是新添加的
cpp
1 # .bash_profile
2
3 # Get the aliases and functions
4 if [ -f ~/.bashrc ]; then
5 . ~/.bashrc
6 fi
7
8 # User specific environment and startup programs
9
10 PATH=$PATH:$HOME/.local/bin:$HOME/bin
11
12 export PATH
13
14 export ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE
15 export PATH=$PATH:$ORACLE_HOME/bin
16 export ORACLE_SID=XE
17 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
18 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
sun用户退出重新登录之后,可以使用sqlplus命令了
四、数据库新建用户、新建表,便于测试
1.、以管理员身份登录到目标 PDB
打开终端,使用操作系统认证登录到 XEPDB1:
sqlplus / as sysdba
登录后,切换到 XEPDB1 容器:
ALTER SESSION SET CONTAINER = XEPDB1;
- 确认当前容器
SHOW CON_NAME;
- 创建新用户
CREATE USER app_user IDENTIFIED BY Password123;
- 授予必要权限
根据实际需求授予权限。开发环境下,通常授予 CONNECT 和 RESOURCE 角色:
CONNECT:允许用户登录数据库。
RESOURCE:允许用户创建表、视图、序列等对象。
GRANT CONNECT, RESOURCE TO app_user;
- 解锁用户(如需要)
用户创建后默认是解锁状态(OPEN)。如果因密码策略被锁定,可使用:
ALTER USER app_user ACCOUNT UNLOCK;
--授予配额
ALTER USER app_user QUOTA UNLIMITED ON USERS;
- 验证用户
退出当前会话,使用新用户登录测试,192.168.88.142是数据库ip,1521是数据库端口:
sqlplus app_user/Password123@//192.168.88.142:1521/XEPDB1
-- 创建测试表验证功能
CREATE TABLE tbl_test (id NUMBER(10) PRIMARY KEY,name VARCHAR2(50) NOT NULL,create_date DATE DEFAULT sysdate);
INSERT INTO tbl_test (id, name) VALUES (101, 'test hellow');
COMMIT;
SELECT * FROM tbl_test;
五、测试程序测试连接数据库
vim example.pc
cpp
#include <stdio.h>
#include <string.h>
// 声明SQL通信区
EXEC SQL INCLUDE SQLCA;
int main() {
EXEC SQL BEGIN DECLARE SECTION;
char username[30];
char password[30];
char dbname[50];
char buf[100];
int username_len;
int password_len;
int dbname_len;
EXEC SQL END DECLARE SECTION;
strcpy((char*)username, "app_user");
username_len = (unsigned short)strlen((char*)username);
strcpy((char*)password, "Password123");
password_len = (unsigned short)strlen((char*)password);
//strcpy((char*)dbname.arr, "//localhost:1521/ORCLCDB");
strcpy((char*)dbname, "//192.168.88.142:1521/XEPDB1");
dbname_len = (unsigned short)strlen((char*)dbname);
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname;
if (sqlca.sqlcode != 0) {
fprintf(stderr, "连接失败! 错误码: %d\n", sqlca.sqlcode);
return 1;
}
printf("成功连接到Oracle数据库!\n");
memset(buf, 0x00, sizeof(buf));
EXEC SQL select trim(name) into :buf from tbl_test where rownum=1;
if (sqlca.sqlcode != 0) {
printf(" 错误码: %d\n", sqlca.sqlcode);
return -1;
}
printf("查询出来的数据: [%s]\n", buf);
EXEC SQL COMMIT WORK RELEASE;
return 0;
}
//编译方式
//proc iname=example.pc oname=example.c include=/usr/include/oracle/19.28/client64
//gcc -o example example.c -L$ORACLE_HOME/lib -lclntsh
编译方式
proc iname=example.pc oname=example.c include=/usr/include/oracle/19.28/client64
gcc -o example example.c -L$ORACLE_HOME/lib -lclntsh
程序运行
./example