[proc]一个完整的联合接口开发程序
2012-03-14 11:43
543 查看
本例主要是从《精通oracle 10g pro*c/c++编程》 上获取的例子,原书中有一些BUG,我改了一下。
数据库SQL:
create or replace type address_type as object(
street varchar2(50),
city varchar2(20),
state varchar2(20),
zipcode varchar2(6)
);
create table customer(
id number(6),
name varchar2(10),
address address_type
);
create or replace type employee_type as object(
id number(6),
name varchar2(10),
adress address_type
);
create or replace type home_type as object(
street varchar2(50),
city varchar2(20),
state varchar2(20),
zipcode varchar2(6),
owner varchar2(10)
);
create table homes of home_type;
in.type
----------------------------------
CASE=lower
TYPE address_type HFILE=employee.h
TYPE employee_type HFILE=employee.h
命令:
ott userid=llpaytest/llpaytest@ORA*** intype=./in.typ outtype=./out.typ CODE=C
编译命令:这里要注意include的路径
proc include=/opt/oracle/product/10g/lib include=/opt/oracle/product/10g/rdbms/public include=/opt/oracle/product/10g/network/public include=/opt/oracle/product/10g/rdbms/demo include=./ iname=demo15_1.pc intype=./out.typ
#不要缺少$ORACLE_HOME/lib -l clntsh 会报sqlcxt的错误
gcc -g -o demo15_1 demo15_1.c -I/opt/oracle/product/10g/lib -I/opt/oracle/product/10g/rdbms/public -I/opt/oracle/product/10g/network/public -I/opt/oracle/product/10g/rdbms/demo -I./ -I//opt/oracle/product/10g/precomp/public/ -L $ORACLE_HOME/lib -l clntsh
#include <stdio.h>
#include <string.h>
/* 包含sqlCA头文件 */
#include <sqlca.h>
/* 包含OCI头文件 */
#include <oci.h>
/* 包含ott转换后生成的头文件 */
#include "employee.h"
void sql_error();
void query_OBJECT();
void add_OBJECT();
void update_OBJECT();
void delete_OBJECT();
int main()
{
char action;
/* 安装错误处理句柄 */
EXEC sql whenever sqlerror do sql_error();
/* 连接到数据库 */
EXEC SQL BEGIN DECLARE SECTION;
int money;
char answerbuff[200];
int flag;
char username[10],password[10],server[10];
EXEC SQL END DECLARE SECTION;
/*
* 定义输入宿主变量:接收用户名、口令和网络服务名
*
*/
memset(username,0x00, sizeof(username));
memset(password,0x00, sizeof(password));
memset(server,0x00, sizeof(server));
strcpy(username,"llpaytest");
strcpy(password,"llpaytest");
strcpy(server,"*****"); /*这里填写的是数据库的SID*/
/* 连接到数据库 */
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
if (sqlca.sqlcode==0)
printf("连接成功!/n");
else
/* 显示连接错误消息 */
printf("%.*s/n", sqlca.sqlerrm.sqlerrml,
sqlca.sqlerrm.sqlerrmc);
for( ; ; )
{
printf("\nS:检索对象,");
printf("A:增加对象,");
printf("U:更新对象,");
printf("D:删除对象,");
printf("X:退出循环,");
printf("请输入操作:");
scanf("%c" , &action);
fflush(stdin);
switch(action)
{
case 's':
case 'S':
/* 检索对象信息 */
query_OBJECT();
getchar(); //这里要注意, 不然会有回车符带入for循环,以下相同
break;
case 'a':
case 'A':
/* 增加对象 */
add_OBJECT();
getchar();
break;
case 'u':
case 'U':
/* 更新对象 */
update_OBJECT();
getchar();
break;
case 'd':
case 'D':
/* 删除对象 */
delete_OBJECT();
getchar();
break;
case 'x':
case 'X':
/* 提交事务,断开连接 */
EXEC sql commit work release;
getchar();
return 0;
default:
getchar();
continue;
}
}
return 0;
}
void sql_error()
{
/* 显示SQl错误 */
printf("%.*s\n" , sqlca.sqlerrm.sqlerrml , sqlca.sqlerrm.sqlerrmc);
}
void query_OBJECT()
{
/* 定义宿主变量 */
address_type *address;
int id;
char name[10];
char city[20];
/* 初始化字符串 */
memset(name , 0x00 , sizeof(name));
memset(city , 0x00 , sizeof(city));
/* 为输入宿主变量输入数据 */
printf("请输入客户号:");
scanf("%d" , &id);
fflush(stdin);
/* 分配对象高速缓存 */
EXEC sql ALLOCATE :address;
/* 对象列数据->对象高速缓存 */
EXEC sql select name , address into :name , :address from customer where id = :id;
/* 取得对象属性 */
EXEC sql OBJECT get city from :address into :city;
/* 释放对象高速缓存 */
EXEC sql free :address;
/* 显示客户信息 */
printf("客户姓名:%s\n" , name);
printf("所在城市:%s\n" , city);
}
void add_OBJECT()
{
/* 定义宿主变量 */
address_type* address;
int id;
char name[20];
char city[20];
char state[20];
/* 初始化字符串 */
memset(name , 0x00 , sizeof(name));
memset(city , 0x00 , sizeof(city));
memset(state , 0x00 , sizeof(state));
/* 为输入宿主变量输入数据 */
printf("请输入客户号:");
scanf("%d" , &id);
fflush(stdin);
printf("请输入客户姓名:");
scanf("%s" , name);
fflush(stdin);
printf("请输入客户所在省份:");
scanf("%s" , state);
fflush(stdin);
printf("请输入客户所在城市:");
scanf("%s" , city);
fflush(stdin);
/* 分配对象高速缓存 */
EXEC sql ALLOCATE :address;
/* 设置对象属性 */
EXEC sql OBJECT set state of :address to :state;
EXEC sql OBJECT set city of :address to :city;
/* 插入数据 */
EXEC sql insert into customer values(:id , :name , :address);
/* 释放对象高速缓存 */
EXEC sql free :address;
/* 提交事务 */
EXEC sql commit;
}
void update_OBJECT()
{
/* 定义宿主变量 */
address_type* address;
int id;
char street[50];
char zipcode[10];
/* 初始化字符串 */
memset(street , 0x00 , sizeof(street));
memset(zipcode , 0x00 , sizeof(zipcode));
/* 为输入宿主变量输入数据 */
printf("请输入客户号:");
scanf("%d" , &id);
fflush(stdin);
printf("请输入客户所在街道:");
scanf("%s" , street);
fflush(stdin);
printf("请输入客户邮政编码:");
scanf("%s" , zipcode);
fflush(stdin);
/* 分配对象高速缓存 */
EXEC sql ALLOCATE :address;
/* 对象数据列->对象高速缓存 */
EXEC sql select address into :address from customer where id = :id;
/* 设置对象属性 */
EXEC sql OBJECT set street of :address to :street;
EXEC sql OBJECT set zipcode of :address to :zipcode;
/* 更新数据 */
EXEC sql update customer set address = :address where id = :id;
/* 释放对象高速缓存 */
EXEC sql free :address;
/* 提交事务 */
EXEC sql commit;
}
void delete_OBJECT()
{
/* 定义宿主变量 */
char city[20];
/* 初始化字符串 */
memset(city , 0x00 , sizeof(city));
/* 为输入宿主变量输入数据 */
printf("请输入客户所在城市:");
scanf("%s" , city);
fflush(stdin);
/* 删除数据 */
EXEC sql delete from customer p where p.address.city = :city;
/* 提交事务 */
EXEC sql commit;
}
数据库SQL:
create or replace type address_type as object(
street varchar2(50),
city varchar2(20),
state varchar2(20),
zipcode varchar2(6)
);
create table customer(
id number(6),
name varchar2(10),
address address_type
);
create or replace type employee_type as object(
id number(6),
name varchar2(10),
adress address_type
);
create or replace type home_type as object(
street varchar2(50),
city varchar2(20),
state varchar2(20),
zipcode varchar2(6),
owner varchar2(10)
);
create table homes of home_type;
in.type
----------------------------------
CASE=lower
TYPE address_type HFILE=employee.h
TYPE employee_type HFILE=employee.h
命令:
ott userid=llpaytest/llpaytest@ORA*** intype=./in.typ outtype=./out.typ CODE=C
编译命令:这里要注意include的路径
proc include=/opt/oracle/product/10g/lib include=/opt/oracle/product/10g/rdbms/public include=/opt/oracle/product/10g/network/public include=/opt/oracle/product/10g/rdbms/demo include=./ iname=demo15_1.pc intype=./out.typ
#不要缺少$ORACLE_HOME/lib -l clntsh 会报sqlcxt的错误
gcc -g -o demo15_1 demo15_1.c -I/opt/oracle/product/10g/lib -I/opt/oracle/product/10g/rdbms/public -I/opt/oracle/product/10g/network/public -I/opt/oracle/product/10g/rdbms/demo -I./ -I//opt/oracle/product/10g/precomp/public/ -L $ORACLE_HOME/lib -l clntsh
#include <stdio.h>
#include <string.h>
/* 包含sqlCA头文件 */
#include <sqlca.h>
/* 包含OCI头文件 */
#include <oci.h>
/* 包含ott转换后生成的头文件 */
#include "employee.h"
void sql_error();
void query_OBJECT();
void add_OBJECT();
void update_OBJECT();
void delete_OBJECT();
int main()
{
char action;
/* 安装错误处理句柄 */
EXEC sql whenever sqlerror do sql_error();
/* 连接到数据库 */
EXEC SQL BEGIN DECLARE SECTION;
int money;
char answerbuff[200];
int flag;
char username[10],password[10],server[10];
EXEC SQL END DECLARE SECTION;
/*
* 定义输入宿主变量:接收用户名、口令和网络服务名
*
*/
memset(username,0x00, sizeof(username));
memset(password,0x00, sizeof(password));
memset(server,0x00, sizeof(server));
strcpy(username,"llpaytest");
strcpy(password,"llpaytest");
strcpy(server,"*****"); /*这里填写的是数据库的SID*/
/* 连接到数据库 */
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
if (sqlca.sqlcode==0)
printf("连接成功!/n");
else
/* 显示连接错误消息 */
printf("%.*s/n", sqlca.sqlerrm.sqlerrml,
sqlca.sqlerrm.sqlerrmc);
for( ; ; )
{
printf("\nS:检索对象,");
printf("A:增加对象,");
printf("U:更新对象,");
printf("D:删除对象,");
printf("X:退出循环,");
printf("请输入操作:");
scanf("%c" , &action);
fflush(stdin);
switch(action)
{
case 's':
case 'S':
/* 检索对象信息 */
query_OBJECT();
getchar(); //这里要注意, 不然会有回车符带入for循环,以下相同
break;
case 'a':
case 'A':
/* 增加对象 */
add_OBJECT();
getchar();
break;
case 'u':
case 'U':
/* 更新对象 */
update_OBJECT();
getchar();
break;
case 'd':
case 'D':
/* 删除对象 */
delete_OBJECT();
getchar();
break;
case 'x':
case 'X':
/* 提交事务,断开连接 */
EXEC sql commit work release;
getchar();
return 0;
default:
getchar();
continue;
}
}
return 0;
}
void sql_error()
{
/* 显示SQl错误 */
printf("%.*s\n" , sqlca.sqlerrm.sqlerrml , sqlca.sqlerrm.sqlerrmc);
}
void query_OBJECT()
{
/* 定义宿主变量 */
address_type *address;
int id;
char name[10];
char city[20];
/* 初始化字符串 */
memset(name , 0x00 , sizeof(name));
memset(city , 0x00 , sizeof(city));
/* 为输入宿主变量输入数据 */
printf("请输入客户号:");
scanf("%d" , &id);
fflush(stdin);
/* 分配对象高速缓存 */
EXEC sql ALLOCATE :address;
/* 对象列数据->对象高速缓存 */
EXEC sql select name , address into :name , :address from customer where id = :id;
/* 取得对象属性 */
EXEC sql OBJECT get city from :address into :city;
/* 释放对象高速缓存 */
EXEC sql free :address;
/* 显示客户信息 */
printf("客户姓名:%s\n" , name);
printf("所在城市:%s\n" , city);
}
void add_OBJECT()
{
/* 定义宿主变量 */
address_type* address;
int id;
char name[20];
char city[20];
char state[20];
/* 初始化字符串 */
memset(name , 0x00 , sizeof(name));
memset(city , 0x00 , sizeof(city));
memset(state , 0x00 , sizeof(state));
/* 为输入宿主变量输入数据 */
printf("请输入客户号:");
scanf("%d" , &id);
fflush(stdin);
printf("请输入客户姓名:");
scanf("%s" , name);
fflush(stdin);
printf("请输入客户所在省份:");
scanf("%s" , state);
fflush(stdin);
printf("请输入客户所在城市:");
scanf("%s" , city);
fflush(stdin);
/* 分配对象高速缓存 */
EXEC sql ALLOCATE :address;
/* 设置对象属性 */
EXEC sql OBJECT set state of :address to :state;
EXEC sql OBJECT set city of :address to :city;
/* 插入数据 */
EXEC sql insert into customer values(:id , :name , :address);
/* 释放对象高速缓存 */
EXEC sql free :address;
/* 提交事务 */
EXEC sql commit;
}
void update_OBJECT()
{
/* 定义宿主变量 */
address_type* address;
int id;
char street[50];
char zipcode[10];
/* 初始化字符串 */
memset(street , 0x00 , sizeof(street));
memset(zipcode , 0x00 , sizeof(zipcode));
/* 为输入宿主变量输入数据 */
printf("请输入客户号:");
scanf("%d" , &id);
fflush(stdin);
printf("请输入客户所在街道:");
scanf("%s" , street);
fflush(stdin);
printf("请输入客户邮政编码:");
scanf("%s" , zipcode);
fflush(stdin);
/* 分配对象高速缓存 */
EXEC sql ALLOCATE :address;
/* 对象数据列->对象高速缓存 */
EXEC sql select address into :address from customer where id = :id;
/* 设置对象属性 */
EXEC sql OBJECT set street of :address to :street;
EXEC sql OBJECT set zipcode of :address to :zipcode;
/* 更新数据 */
EXEC sql update customer set address = :address where id = :id;
/* 释放对象高速缓存 */
EXEC sql free :address;
/* 提交事务 */
EXEC sql commit;
}
void delete_OBJECT()
{
/* 定义宿主变量 */
char city[20];
/* 初始化字符串 */
memset(city , 0x00 , sizeof(city));
/* 为输入宿主变量输入数据 */
printf("请输入客户所在城市:");
scanf("%s" , city);
fflush(stdin);
/* 删除数据 */
EXEC sql delete from customer p where p.address.city = :city;
/* 提交事务 */
EXEC sql commit;
}
相关文章推荐
- 20110510 Brew工程师培训笔记——第二十六章 开发一个完整的BREW程序
- [微信小程序]组件化开发,以一个自定义模块框组件当做示例(附完整示例代码和效果图)
- 从前端到后台,开发一个完整功能的小程序
- VS2013开发一个简单的asmx接口程序
- 开发一个用户喜欢的ABAP接口日志程序
- 学习思考(5):如何开发一个完整的程序?
- [微信小程序]组件化开发,以一个自定义模块框组件当做示例(附完整示例代码和效果图)
- 利用MyEclipse开发一个调用webservice接口的程序
- 开发一个用户喜欢的ABAP接口日志程序
- Windows游戏开发感想&&一个完整的Windows窗口程序
- php微信支付接口开发程序
- 【如何快速的开发一个完整的 iOS 直播 app】(美颜篇)
- DOTNETARX(一个用于.net开发AutoCAD程序的类库)实例教学(续)
- 一个完整的iOS开发框架(Frameworks)-NimbusKit
- EJB3.0开发一个远程接口无状态会话bean
- 详解如何开发一个凤蝶H5(支付宝小程序)的组件
- relaxlife.net发布一个自己开发的中文分词程序
- Java Web开发之配置一个Servlet接收多个接口
- 分享一个完整的SAP RFC调用接口封装
- 一个完整的安装程序实例—艾泽拉斯之海洋女神出品(五) --补遗 (已补充第三部分完整版)