您的位置:首页 > 其它

一个使用Pro*C实现增删改查的小例子

2010-08-07 19:52 411 查看
环境:

WinXPSP3 + VC6 + ORACLE 11g

步骤:

1)新建demo.pc,内容如下:

#include <stdio.h>

// 全程说明段
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;

// 说明通讯区
EXEC SQL INCLUDE sqlca;

// 外部函数说明
void insert(),update(),del(),query();

main()
{
char operate[5];

// 登录到oracle
strcpy(username.arr,"SCOTT"); // 用户名
username.len=strlen(username.arr);
strcpy(password.arr,"x"); // 密码
password.len=strlen(password.arr);

EXEC SQL WHENEVER SQLERROR GOTO logon_error;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("/nConnect to ORACLE as user: %s",username.arr);

for(;;)
{
printf("/n***********************");
printf("/n*	1.Query		*");
printf("/n*	2.Update	*");
printf("/n*	3.Insert	*");
printf("/n*	4.Delete	*");
printf("/n*	5.Exit		*");
printf("/n***********************");
printf("/n Enter selection:/n");
gets(operate);

switch(operate[0])
{
case '1':query();
break;
case '2':update();
break;
case '3':insert();
break;
case '4':del();
break;
case '5':break;
default :printf("/n/n invalid selection/n");
break;
}
if(operate[0]=='5')
break;
}

// 结束处理
EXEC SQL COMMIT RELEASE;
printf("/n/n very good !/n/n");
exit(0);

// 登录出错处理
logon_error:
printf("/n invalid username/password/n");
printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK RELEASE;
exit(1);
}

// 更新处理
void update()
{
EXEC SQL BEGIN DECLARE SECTION;
int emp_number;
VARCHAR emp_name[20];
VARCHAR job[50];
short ind_job;
EXEC SQL END DECLARE SECTION;

char empnum[8];

printf("/n/nEnter employee number(press RETURN to abort):");
gets(empnum);
if(!strcmp(empnum,""))
{
printf("/n");
return;
}
emp_number = atoi(empnum);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL WHENEVER NOT FOUND GOTO notfound;

EXEC SQL SELECT ENAME,JOB
INTO :emp_name,:job:ind_job
FROM EMP
WHERE EMPNO = :emp_number;
emp_name.arr[emp_name.len]='/0';
switch(ind_job)
{
case -1:strcpy(job.arr,"NULL");
job.len=strlen(job.arr);
break;
case 0:job.arr[job.len]='/0';
break;
default:if(ind_job>0)
printf("/n/nWARNING: Job truncated./n");
break;
}
printf("/n/nNumber Employee Name Job/n");
printf("----------------------------------/n");
printf("%-9d%-15s%-8s/n",emp_number,emp_name.arr,job.arr);
printf("/nEnter new employee name:");
gets(emp_name.arr);
emp_name.len=strlen(emp_name.arr);
printf("/n/nEnter new job:");
gets(job.arr);
job.len=strlen(job.arr);
ind_job=0;
if(!strcmp(job.arr,""))
ind_job=-1;
EXEC SQL UPDATE EMP
SET ENAME= :emp_name,JOB=:job:ind_job
WHERE EMPNO= :emp_number;
printf("/n/nEmployee %d updated./n",emp_number);
EXEC SQL COMMIT;
return;

notfound:
printf("/n/nWARNING: Employee %d does not exist./n",emp_number);
return;
sqlerror:
printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK;
exit(1);
}

// 插入处理
void insert()
{
EXEC SQL BEGIN DECLARE SECTION;
int emp_number;
VARCHAR emp_name[20];
VARCHAR job[20];
short ind_job;
EXEC SQL END DECLARE SECTION;

char empnum[8];
printf("/n/nEnter employee number(press RETURN to abort):");
gets(empnum);
if(!strcmp(empnum,""))
{
printf("/n");
return;
}
emp_number = atoi(empnum);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL WHENEVER NOT FOUND GOTO resume;

EXEC SQL SELECT ENAME INTO :emp_name
FROM EMP
WHERE EMPNO = :emp_number;
printf("/n/nWARNING: Employee %d alread exist./n",emp_number);

return;

resume:
printf("/n/nEnter employee name:");
gets(emp_name.arr);
emp_name.len=strlen(emp_name.arr);

printf("/n/nEnter job:");
gets(job.arr);
job.len=strlen(job.arr);
ind_job=0;
if(!strcmp(job.arr,""))
ind_job = -1;
EXEC SQL INSERT INTO EMP(EMPNO,ENAME,JOB)
VALUES(:emp_number,:emp_name,:job:ind_job);

printf("/n/nEmployee %d inserted. /n",emp_number);
EXEC SQL COMMIT;
return;

sqlerror:
printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK;
exit(1);
}

// 查询处理
void query()
{
EXEC SQL BEGIN DECLARE SECTION;
int emp_number;
VARCHAR emp_name[20];
VARCHAR job[20];
short ind_job;
EXEC SQL END DECLARE SECTION;

char empnum[8];
printf("/n/nEnter Employee number (press RETURN to abort):");
gets(empnum);
if(!strcmp(empnum,""))
{
printf("/n");
return;
}

emp_number = atoi(empnum);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
EXEC SQL SELECT ENAME,JOB
INTO :emp_name,:job:ind_job
FROM EMP
WHERE EMPNO = :emp_number;
emp_name.arr[emp_name.len]='/0';
switch(ind_job)
{
case -1:strcpy(job.arr,"NULL");
job.len=strlen(job.arr);
break;
case 0:job.arr[job.len]='/0';
break;
default:if(ind_job >0 )
printf("/n/nWARNING: Job truncated./n");
break;
}
printf("/n/nNumber Employee Name Job/n");
printf("------------------------------------------/n");
printf("%-9d%-15s%-8s/n",emp_number,emp_name.arr,job.arr);
return;

notfound:
printf("/n/nWARING: Employee %d does not exist./n",emp_number);
return;
sqlerror:
printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK;
exit(1);
}

// 删除处理
void del()
{
EXEC SQL BEGIN DECLARE SECTION;
int emp_number;
EXEC SQL END DECLARE SECTION;

char empnum[8];

printf("/n/nEnter employee number(press RETURN to abort):");
gets(empnum);
if(!strcmp(empnum,""))
{
printf("/n");
return;
}
emp_number = atoi(empnum);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
EXEC SQL DELETE
FROM EMP
WHERE EMPNO = :emp_number;
printf("/n/nEmployee %d deleted./n",emp_number);
EXEC SQL COMMIT;
return;

notfound:
printf("/n/nWARING: Employee %d does not exist./n",emp_number);
return;
sqlerror:
printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK;
exit(1);
}


2)将demo.pc预编译成demo.c:

proc demo.pc


3)将demo.c编译成demo.obj:

cl demo.c /nologo /c /I F:/app/tonko/product/11.1.0/db_1/precomp/public


4)将demo.obj链接成demo.exe:

link demo.obj /nologo /LIBPATH:F:/app/tonko/product/11.1.0/db_1/precomp/LIB orasql11.lib


5)执行demo.exe进行测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: