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,同时也属于 dba、oper 等组

|----------|----------------------|
| 组名 | 作用 |
| 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

相关推荐
一条破秋裤3 小时前
【1114】【并发控制】【笔记】
linux
2035去旅行5 小时前
ADB的底层原理
linux·adb·嵌入式·arm·soc
武子康5 小时前
单卡 A6000 跑 Qwen-Drive:怎样留下可比较的第一条基线?
linux·人工智能·深度学习
女神下凡5 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
爱和冰阔落9 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
say_fall11 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
ö Constancy12 小时前
一台电脑的硬件组成与作用:按功能分类详解(Windows 与 Linux 视角)
linux·windows·电脑
江湖有缘12 小时前
基于Ubuntu部署SoduWork:企业级 AI 原生协同平台实战全流程
linux·人工智能·ubuntu·ai·soduwork
another heaven12 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造