⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oraquery.cpp

📁 oracle下利用proc在 vc++开发的一个小例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 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 + -