📄 oraquery.cpp
字号:
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)bind;
sqlstm.sqhstl[0] = (unsigned int )0;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) error();
}
if(bind->F<0){
fprintf(ORAout,"\nToo many bind variables(%d),maximum is %d\n",-(bind->F),nitem);
return;
}
bind->N=bind->F;
for(k=0;k<bind->F;k++){
fprintf(ORAout,"\nEnter value for bind variable %.*s:",
(int)bind->C[k],bind->S[k]);
fgets(bind_var,sizeof(bind_var),stdin);
len=strlen(bind_var)-1;
bind->L[k]=len;
delete[] bind->V[k];
bind->V[k]=new char[bind->L[k]+1];
strncpy(bind->V[k],bind_var,len);
if((strncmp(bind->V[k],"NULL",4)==0)
||(strncmp(bind->V[k],"null",4)==0))
*bind->I[k]=-1;
else
*bind->I[k]=0;
bind->T[k]=1;
}
}
void ORAquery::select_list(){
int k,null_ok,precision,scale;
if((strncmp(_sql,"SELECT",6)!=0)
&&(strncmp(_sql,"select",6)!=0)){
select->F=0;
return;
}
select->N=nitem;
/* EXEC SQL DESCRIBE SELECT LIST FOR SS INTO select; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )62;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)select;
sqlstm.sqhstl[0] = (unsigned int )0;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) error();
}
if(select->F<0){
fprintf(ORAout,"\nToo many select_list items(%d),maximum is %d\n",
-(select->F),nitem);
return;
}
select->N=select->F;
fprintf(ORAout,"\n");
for(k=0;k<select->F;k++){
sqlnul(&(select->T[k]),&(select->T[k]),&null_ok);
switch(select->T[k]){
case 1:break;
case 2:
sqlprc(&select->L[k],&precision,&scale);
if(precision==0)precision=40;
select->L[k]=precision+2;
break;
case 8:
select->L[k]=240;
break;
case 11:
select->L[k]=18;
break;
case 12:
select->L[k]=9;
break;
case 23:
select->L[k]=240;
break;
}
delete [] select->V[k];
select->V[k]=new char[select->L[k]+1];
if(select->T[k]==2)
fprintf(ORAout,"%.*s",select->L[k],select->S[k]);
else
fprintf(ORAout,"%-.*s",select->L[k],select->S[k]);
if(select->T[k]!=24)
select->T[k]=1;
}
fprintf(ORAout,"\n\n");
/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */
for(;;){
/* EXEC SQL FETCH CC USING DESCRIPTOR select; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )81;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)select;
sqlstm.sqhstl[0] = (unsigned int )0;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode == 1403) goto end_select_loop;
if (sqlca.sqlcode < 0) error();
}
for(k=0;k<select->F;k++){
if(*select->I[k]==0)
fprintf(ORAout,"%-.*s",(int)select->L[k],select->V[k]);
else
fprintf(ORAout,"%-.*s",(int)select->L[k],select->V[k]);
}
fprintf(ORAout,"\n");
}
end_select_loop:
return;
}
int ORAquery::free(){
int k;
for(k=0;k<nitem;k++){
if(bind->V[k]!=(char*)0) delete[] bind->V[k];
delete bind->I[k];
if(select->V[k]!=(char*)0) delete[] select->V[k];
delete select->I[k];
}
sqlclu(bind);
sqlclu(select);
/* EXEC SQL WHENEVER SQLERROR CONTINUE; */
/* EXEC SQL CLOSE CC; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )100;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
/* EXEC SQL COMMIT WORK RELEASE; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )115;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
return 0;
}
void ORAquery::error(){
fprintf(ORAout,"\n\n%.70s\n",sqlca.sqlerrm.sqlerrmc);
if(flag)
fprintf(ORAout,"Parse error at character offset %d in SQL statement.\n",sqlca.sqlerrd[4]);
/* EXEC SQL WHENEVER SQLERROR CONTINUE; */
/* EXEC SQL ROLLBACK WORK; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )130;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
ORAresult=-2;
longjmp(jmp_continue,1);
}
ORAquery query;
ORAqueryBase* pQuery=(ORAqueryBase*)&query;
#ifdef TESTMAIN
void main(){
if(oracle_connect()!=0)exit(1);
query.set(40,30,30);
if(query.alloc()!=0)exit(1);
for(;;){
setjmp(jmp_continue);
if(query.get_statement()!=0)break;
query.execute();
}
query.free();
return;
}
#endif
int oracle_connect(){
/* EXEC SQL BEGIN DECLARE SECTION; */
/* VARCHAR username[20]; */
struct { unsigned short len; unsigned char arr[20]; } username;
/* VARCHAR password[20]; */
struct { unsigned short len; unsigned char arr[20]; } password;
/* EXEC SQL END DECLARE SECTION; */
fprintf(ORAout,"\nEnter user name: ");
fgets((char*)username.arr,20,ORAin);
username.len=strlen((char*)username.arr);
fprintf(ORAout,"\nEnter password: ");
fgets((char*)password.arr,20,ORAin);
password.len=strlen((char*)password.arr);
/* EXEC SQL WHENEVER SQLERROR GOTO connect_error; */
/* EXEC SQL CONNECT :username IDENTIFIED BY :password; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )145;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)&username;
sqlstm.sqhstl[0] = (unsigned int )22;
sqlstm.sqhsts[0] = ( int )22;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = ( void *)&password;
sqlstm.sqhstl[1] = (unsigned int )22;
sqlstm.sqhsts[1] = ( int )22;
sqlstm.sqindv[1] = ( void *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned int )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) goto connect_error;
}
fprintf(ORAout,"\nConnected to ORACLE as user %s.\n",username.arr);
return 0;
connect_error:
fprintf(ORAout,"Cannot connect to ORACLE as user %s \n",username.arr);
return -1;
}
void help(){
fprintf(ORAout,"\nEnter a SQL statement at the SQL prompt.\n");
fprintf(ORAout,"Use standard (not embedded) SQL syntax.\n");
}
int get_sql_statement(char*s){
char*cp,linebuf[256];
int iter;
for(iter=2;;){
if(iter==2){
fprintf(ORAout,"\nSQL");
s[0]=0;
}
fgets(linebuf,sizeof(linebuf),ORAin);
cp=strrchr(linebuf,'\n');
if(cp&&cp!=linebuf)*cp=' ';
else if(cp==linebuf)continue;
if(strncmp(linebuf,"exit",4)==0
||strncmp(linebuf,"EXIT",4)==0){
return -1;
}else if(linebuf[0]=='?'
||strncmp(linebuf,"help",4)==0
||strncmp(linebuf,"HELP",4)==0){
help();
iter=2;
continue;
}
strcat(s,linebuf);
if((cp=strrchr(s,';'))!=(char*)NULL){
*cp=0;
break;
}else{
fprintf(ORAout,"%3d",iter++);
}
}
return 0;
}
void ORAerror(){
/* EXEC SQL WHENEVER SQLERROR CONTINUE; */
fprintf(ORAout,"\nOracle error detected:\n");
fprintf(ORAout,"\n%.70s\n\n",sqlca.sqlerrm.sqlerrmc);
/* EXEC SQL ROLLBACK RELEASE; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )176;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
ORAresult=-1;
longjmp(jmp_continue,1);
}
int ORAconnect(
const char*const user
,const char*const password){
if(!user||!*user)return -1;
if(!password||!*password)return false;
/* EXEC SQL BEGIN DECLARE SECTION; */
/* VARCHAR un[30]; */
struct { unsigned short len; unsigned char arr[30]; } un;
/* VARCHAR pwd[30]; */
struct { unsigned short len; unsigned char arr[30]; } pwd;
/* EXEC SQL END DECLARE SECTION; */
strcpy((char*)un.arr,user);
un.len=strlen(user);
strcpy((char*)pwd.arr,password);
pwd.len=strlen(password);
/* EXEC SQL WHENEVER SQLERROR GOTO conn_err; */
/* EXEC SQL CONNECT :un IDENTIFIED BY :pwd; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )191;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)&un;
sqlstm.sqhstl[0] = (unsigned int )32;
sqlstm.sqhsts[0] = ( int )32;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = ( void *)&pwd;
sqlstm.sqhstl[1] = (unsigned int )32;
sqlstm.sqhsts[1] = ( int )32;
sqlstm.sqindv[1] = ( void *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned int )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) goto conn_err;
}
fprintf(ORAout,"\nConnected to ORACLE as user: %s\n",un.arr);
return 0;
conn_err:
fprintf(ORAout,"\nCan not connect to ORACLE as user: %s\n",un.arr);
return -1;
}
int ORAdisconnect(){
/* EXEC SQL WHENEVER SQLERROR GOTO disc_err; */
/* EXEC SQL COMMIT WORK RELEASE; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )222;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) goto disc_err;
}
return 0;
disc_err:
fprintf(ORAout,"\nDisconnect from ORACLE\n");
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -