#include <stdio.h> #include <string.h> #include <stdlib.h> /* 包含OCI头文件 */ #include <oci.h>
/* 包含SQLCA头文件 */ #include <sqlca.h>
void connect(); void sql_error(); void init_clob(); void read_clob(); void write_clob();
int main() { char action; /* 安装错误处理句柄 */ exec sql whenever sqlerror do sql_error();
/* 连接到数据库 */ connect();
for( ; ; ) { printf("\nI:插入雇员,"); printf("A:添加简历,"); printf("S:检索简历,"); printf("X:退出."); printf("输出入操作:");
scanf("%c" , &action); getchar();
switch(action) { case 'i': case 'I': /* 添加雇员,初始化clob列 */ init_clob(); break;
case 'a': case 'A': /* 添加简历,修改clob列 */ write_clob(); break;
case 's': case 'S': /* 检索简历,读取clob列 */ read_clob(); break;
case 'x': case 'X': /* 提交事务,断开连接 */ exec sql commit work release; return 0;
default: continue; } }
return 0; }
void connect() { EXEC SQL BEGIN DECLARE SECTION; /* 定义宿主变量 */ char username[20] , password[20]; EXEC SQL END DECLARE SECTION; /* 输入用户名、口令和网络服务名 */ printf("输入用户名:"); gets(username);
printf("输入口令:"); gets(password);
/* 连接到数据库 */ exec sql connect :username identified by :password; }
void sql_error() { /* 显示SQL错误信息 */ printf("%.*s\n" , sqlca.sqlerrm.sqlerrml , sqlca.sqlerrm.sqlerrmc); }
void init_clob() { EXEC SQL BEGIN DECLARE SECTION; /* 定义宿主变量 */ int id; char name[10]; EXEC SQL END DECLARE SECTION; /* 为输入宿主变量输入数据 */ printf("请输入雇员ID号:"); scanf("%d" , &id); getchar();
printf("请输入雇员名:"); gets(name);
/* 插入数据并初始化clob列 */ exec sql insert into lobexample values(:id , :name , empty_clob());
/* 提交事务 */ exec sql commit; }
void read_clob() { EXEC SQL BEGIN DECLARE SECTION; /* 定义clob定位符 */ OCIClobLocator* c1;
/* 定义宿主变量 */ int id , amount; char buf[1024]; EXEC SQL END DECLARE SECTION; /* 为输入宿主变量输入数据 */ printf("请输入雇员ID号:"); scanf("%d" , &id); getchar();
/* 为clob定位符分配内存 */ exec sql allocate :c1;
/* 取得clob定位符 */ exec sql select resume into :c1 from lobexample where id = :id;
/* 获得clob列数据的长度 */ exec sql lob describe :c1 get length into :amount;
/* clob列数据-> 缓冲区*/ exec sql lob read :amount from :c1 into :buf;
/* 释放clob定位符占用的内存 */ exec sql free :c1;
/* 显示clob列数据 */ printf("简历:%.*s\n" , amount , buf); }
void write_clob() { EXEC SQL BEGIN DECLARE SECTION; /* 定义clob定位符 */ OCIClobLocator* c1;
/* 定义宿主变量 */ int id , amount , offset; char buf[1024]; EXEC SQL END DECLARE SECTION; /* 为输入宿主变量输入数据 */ printf("请输入雇员ID号:"); scanf("%d" , &id); getchar();
printf("请输入雇员简历:"); gets(buf); amount = strlen(buf);
/* 为clob定位符分配内存 */ exec sql allocate :c1;
/* 取得clob定位符 */ exec sql select resume into :c1 from lobexample where id = :id for update;
/* 获得clob列数据长度 */ exec sql lob describe :c1 get length into :offset;
/* 缓冲区->clob列数据 */ offset = offset + 1; exec sql lob write :amount from :buf into :c1 at :offset;
/* 释放clob定位符占用的内存 */ exec sql free :c1;
/* 提交事务 */ exec sql commit;
}
运行结果: