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 $*
#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 $*
#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.我觉得这个类的功能实现了,但是还是不好用;是不是利用动态SQL语言要好些?
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;
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();
...
}
{
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////记住了!”