proc文件:database.h(类)#include <stdio.h>
#include <iostream>
#include <string.h>#define SQLNOTFOUND 1403EXEC SQL INCLUDE sqlca;class DB{
public:
void connect(int argc,char *argv[]);
void select();
void insert(int argc,char *argv[]);
void update();
void tdelete();
private:
EXEC SQL BEGIN DECLARE SECTION;
char username[40];
char *argv[];
struct tab_struct{
char cat_id[20];
char obj_id[20];
char obj_desc[20];
}tab;
struct attr_list_struct{
char cat_id[20];
char attr_id[20];
char attr_name[20];
char attr_desc[20];
}attr_list;
struct attr_value_struct{
char cat_id[20];
char obj_id[20];
char attr_id[20];
char attr_value[20];
}attr_value;
EXEC SQL END DECLARE SECTION;
};void DB::connect(int argc,char *argv[])
{
if(argc==1)
{
printf("请输入用户,密码");
exit(0);
}
strcpy(username,argv[1]);

EXEC SQL CONNECT:username;
printf("连接ORACLE@:%s",username);
if(sqlca.sqlcode<0)
    {
      printf("数据库连接出错@:%s.\n",sqlca.sqlerrm.sqlerrmc);
      exit(0);
    }
}
void DB::select()
{
EXEC SQL DECLARE Ctab CURSOR FOR
SELECT cat_id
,obj_id
,obj_desc
FROM obj_tab
ORDER BY cat_id;

EXEC SQL OPEN Ctab;
    if(sqlca.sqlcode<0)
    {
       printf("打开游标Ctab时出错@:%s.\n",sqlca.sqlerrm.sqlerrmc);
       exit(0);
    }
    
    printf("\ncat_id\tobj_id\tobj_desc\n");
    
    while(1)
    {
     EXEC SQL FETCH Ctab INTO
     :tab.cat_id
      ,:tab.obj_id
      ,:tab.obj_desc;
    
     if(sqlca.sqlcode == SQLNOTFOUND )
         break;
      if(sqlca.sqlcode<0)
      {
          printf("处理游标Ctab时出错,错误信息:%s.\n",sqlca.sqlerrm.sqlerrmc);
          exit(0);
      }
      for(char *pbegin=tab.cat_id,*pend=tab.cat_id+strlen(tab.cat_id);pbegin!=pend;++pbegin)
       printf("%c",*pbegin);
      for(char *pbegin=tab.obj_id,*pend=tab.obj_id+strlen(tab.obj_id);pbegin!=pend;++pbegin)
       printf("%c",*pbegin);
for(char *pbegin=tab.obj_desc,*pend=tab.obj_desc+strlen(tab.obj_desc);pbegin!=pend;++pbegin)
       printf("%c",*pbegin);
      printf(" \n");

}

    EXEC SQL CLOSE Ctab;
EXEC SQL COMMIT WORK;
}
void DB::insert(int argc,char *argv[])
{
EXEC SQL insert into obj_tab(cat_id,obj_id,obj_desc)
VALUES(:argv[2],:argv[3],:argv[4]);
EXEC SQL COMMIT WORK;
}
void DB::update()
{
EXEC SQL update obj_tab 
set
cat_id='test' 
where cat_id='1';
EXEC SQL COMMIT WORK;
}
void DB::tdelete()
{
EXEC SQL delete from obj_tab where cat_id='test';
EXEC SQL COMMIT WORK;
}主程序:rundb.cc#include "database.h"
//#include "test.h"
#include <iostream>
int main(int argc,char *argv[])
{
printf("begin,now!\n");
DB mydb;
mydb.connect(argc,argv);
printf("\1th step!\n");
mydb.insert(argc,argv);
printf("\2th step!\n");
mydb.select();
printf("\3th step!");
mydb.update();
printf("\4th step!");
mydb.tdelete();
printf("\nthe end!");
}
makefile:include $(ORACLE_HOME)/precomp/lib/env_precomp.mk
ORALIBPATH=$(ORACLE_HOME)/lib32
ORALIBS=-lclntsh -lpthread
PRODLIBHOME64=$(PRODHOME)lib64
PRECOMPHOME=$(ORACLE_HOME)/precomp/publicPROCPPFLAGS= code=cpp
NETWORKHOME=$(ORACLE_HOME)/network/
PLSQLHOME=$(ORACLE_HOME)/plsql/I_SYM=-ISTLINCLUDE = -I $(COMPILER)/include
INCLUDE=$(I_SYM). $(I_SYM)$(PLSQLHOME)public $(I_SYM)$(NETWORKHOME)public $(I_SYM)$(PRECOMPHOME)CFLAGS= -c -lct -lcs -ltcl -lcomn -lintl -lmLIBHOME=$(ORACLE_HOME)/lib64/rundb: xlC $(INCLUDE) $(STLINCLUDE) $(CFLAGS) $*.cc
xlC $*.o -L $(ORALIBPATH) $(ORALIBS) -o $*

解决方案 »

  1.   

    最终完成了,呵呵database.pc#include <stdio.h>
    #include <iostream>
    #include <string.h>#define SQLNOTFOUND 1403EXEC SQL INCLUDE sqlca;class DB{
    public:
    void connect(int argc,char *argv[]);
    void select();
    void insert();
    void update();
    void del();
    private:
    EXEC SQL BEGIN DECLARE SECTION;
    char username[40];
    //char *argv[];
    char con1[20],con2[20],con3[20];
    char sel1[20],sel2[20],sel3[20];
    char in1[20],in2[20],in3[20];
    char up1[20],up2[20],up3[20];
    char del1[20],del2[20],del3[20];
    struct tab_struct{
    char cat_id[20];
    char obj_id[20];
    char obj_desc[20];
    }tab;
    struct attr_list_struct{
    char cat_id[20];
    char attr_id[20];
    char attr_name[20];
    char attr_desc[20];
    }attr_list;
    struct attr_value_struct{
    char cat_id[20];
    char obj_id[20];
    char attr_id[20];
    char attr_value[20];
    }attr_value;
    EXEC SQL END DECLARE SECTION;
    };void DB::connect(int argc,char *argv[])
    {
    if(argc==1)
    {
    printf("请输入用户,密码");
    exit(0);
    }
    strcpy(username,argv[1]);

    EXEC SQL CONNECT:username;
    printf("连接ORACLE@:%s",username);
    if(sqlca.sqlcode<0)
        {
          printf("数据库连接出错@:%s.\n",sqlca.sqlerrm.sqlerrmc);
          exit(0);
        }
    }
    void DB::select()
    {
    printf("\nnow~ select start!\n");
    scanf("%s",sel1);
    EXEC SQL DECLARE Ctab CURSOR FOR
    SELECT cat_id
    ,obj_id
    ,obj_desc
    FROM obj_tab
    WHERE cat_id=:sel1
    ORDER BY cat_id;

    EXEC SQL OPEN Ctab;
        if(sqlca.sqlcode<0)
        {
           printf("打开游标Ctab时出错@:%s.\n",sqlca.sqlerrm.sqlerrmc);
           exit(0);
        }
        
        printf("\ncat_id\tobj_id\tobj_desc\n");
        
    while(1)
        {
         EXEC SQL FETCH Ctab INTO
         :tab.cat_id
          ,:tab.obj_id
          ,:tab.obj_desc;
        
         if(sqlca.sqlcode == SQLNOTFOUND )
             break;
          if(sqlca.sqlcode<0)
          {
              printf("处理游标Ctab时出错,错误信息:%s.\n",sqlca.sqlerrm.sqlerrmc);
              exit(0);
          }   for(char *pbegin=tab.cat_id,*pend=tab.cat_id+strlen(tab.cat_id);pbegin!=pend;++pbegin)
          printf("%c",*pbegin);
      for(char *pbegin=tab.obj_id,*pend=tab.obj_id+strlen(tab.obj_id);pbegin!=pend;++pbegin)
          printf("%c",*pbegin);
    for(char *pbegin=tab.obj_desc,*pend=tab.obj_desc+strlen(tab.obj_desc);pbegin!=pend;++pbegin)
          printf("%c",*pbegin);
      printf(" \n");
    }

        EXEC SQL CLOSE Ctab;
    EXEC SQL COMMIT WORK;
    }
    /*
    void DB::insert(int argc,char *argv[])
    {
    EXEC SQL insert into obj_tab(cat_id,obj_id,obj_desc)
    VALUES(:argv[2],:argv[3],:argv[4]);
    EXEC SQL COMMIT WORK;
    }
    */
    void DB::insert()
    {
    printf("\nnow~ insert start!\n");
    scanf("%s%s%s",in1,in2,in3);
    EXEC SQL insert into obj_tab(cat_id,obj_id,obj_desc)
    VALUES(:in1,:in2,:in3);
    EXEC SQL COMMIT WORK;
    }
    void DB::update()
    {
    printf("\nnow~ update start!\n");
    scanf("%s%s",up1,up2);
    EXEC SQL update obj_tab 
    set
    cat_id=:up2 
    where cat_id=:up1;
    EXEC SQL COMMIT WORK;
    }
    void DB::del()
    {
    printf("\nnow~ delete start!\n");
    scanf("%s",del1);
    EXEC SQL delete from obj_tab where cat_id=:del1;
    EXEC SQL COMMIT WORK;
    }
      

  2.   

    是一个PRO*C程序呀挺不错的  就是缺少些异常处理方面的东东
      

  3.   

    楼上是成都的高校吗?maybe 校友哦!
      

  4.   

    1.异常处理是属于什么方面的内容呢?我在网上的一些pro*c的资料里没有找到相关内容
    2.我觉得这个类的功能实现了,但是还是不好用;是不是利用动态SQL语言要好些?
      

  5.   

    例如:
    EXEC SQL WHENEVER SQLERROR GOTO errprint;
    .....
    errprint:
        EXEC SQL WHENEVER SQLERROR CONTINUE;
        printf("\n\n>>>>> Error during execution:\n");
        printf("%s\n",sqlca.sqlerrm.sqlerrmc);
        EXEC SQL ROLLBACK RELEASE;
      

  6.   

    或者:先定义一个函数
    sqlerror()
    {
        EXEC SQL WHENEVER SQLERROR CONTINUE;    printf("\nORACLE error detected:");
        printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc);    EXEC SQL ROLLBACK WORK RELEASE;
        exit(1);
    }
    main(){
    ...
    EXEC SQL WHENEVER SQLERROR DO sqlerror();
    ...
    }
      

  7.   

    异常处理特别针对INSERT  UPDATE   DELETE 才显的最重要,就是在执行这些语句的时候,若是出错了,可以进行回滚
      

  8.   

    void DB::insert()
    {
    printf("\nnow~ insert start!\n");
    scanf("%s%s%s",in1,in2,in3);
    EXEC SQL insert into obj_tab(cat_id,obj_id,obj_desc)
    VALUES(:in1,:in2,:in3);
    EXEC SQL WHENEVER SQLERROR DO sqlerror();
    EXEC SQL COMMIT WORK;
    }
    void sqlerror()
    {
        EXEC SQL WHENEVER SQLERROR CONTINUE;    printf("\nORACLE error detected:");
        printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc);    EXEC SQL ROLLBACK WORK RELEASE;
        exit(1);
    }
    “原来SQLERROR就是sqlca.sqlcode<0////记住了!”