您的位置:首页 > 其它

[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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: