现在的位置: 首页 > 综合 > 正文

[proc]一个完整的联合接口开发程序

2017年12月21日 ⁄ 综合 ⁄ 共 5579字 ⁄ 字号 评论关闭

本例主要是从《精通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;
}

抱歉!评论已关闭.