linux环境编译Pro*C 源文件(.pc文件)

.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,同时也属于 dbaoper 等组

|----------|----------------------|
| 组名 | 作用 |
| oinstall | Oracle 软件所有者组(主组) |
| dba | 数据库管理员组,拥有 SYSDBA 权限 |
| oper | 操作员组,拥有 SYSOPER 权限 |

  1. 将 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;

  1. 确认当前容器

SHOW CON_NAME;

  1. 创建新用户

CREATE USER app_user IDENTIFIED BY Password123;

  1. 授予必要权限

根据实际需求授予权限。开发环境下,通常授予 CONNECT 和 RESOURCE 角色:

CONNECT:允许用户登录数据库。

RESOURCE:允许用户创建表、视图、序列等对象。

GRANT CONNECT, RESOURCE TO app_user;

  1. 解锁用户(如需要)

用户创建后默认是解锁状态(OPEN)。如果因密码策略被锁定,可使用:

ALTER USER app_user ACCOUNT UNLOCK;

--授予配额

ALTER USER app_user QUOTA UNLIMITED ON USERS;

  1. 验证用户

退出当前会话,使用新用户登录测试,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

相关推荐
dnbug Blog1 小时前
C语言 简介
c语言·开发语言
憧憬成为java架构高手的小白1 小时前
mysql(ai总结每章的知识)
数据库·mysql·oracle
用户937855808701 小时前
Linux 基础教程(二)】系统目录结构、用户与用户组管理(useradd/usermod/passwd/sudo)
linux
kkeeper~1 小时前
0基础C语言积跬步之自定义类型联合和枚举
c语言·开发语言·算法
一只fish1 小时前
Oracle官方文档翻译《Database Concepts 26ai》第19章-应用与网络服务架构
数据库·oracle
邪修king1 小时前
C++map_set封装 : 红黑树底层迭代器以及仿函数的运用
android·c语言·数据结构·c++·b树
ZC跨境爬虫1 小时前
SQL学习日志_Day2_深入SQL语法与数据库层级结构
数据库·sql·学习·oracle
着迷不白1 小时前
实战一:用户、权限、组 案例
linux·运维
仙俊红2 小时前
事务消息是什么
jvm·数据库·oracle