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

相关推荐
Sokach101510 小时前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao1 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒4 天前
TShark:Wireshark CLI 功能
linux
A小辣椒4 天前
TShark:基础知识
linux
AlfredZhao5 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao5 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
ClouGence5 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
用户9718356334665 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux