目录
一、实验目的:
二、实验工具:
三、准备工作:
1、在虚拟机上配置win10系统。
2、Oracle11g:
3、安装和使用gcc:
四、开始实验
1、在Oracle数据库中建表并插入:
2、使用gcc进行proc编程
(1)创建一个新的项目文件夹(可以是任意位置)
(2)将pc文件复制到此文件夹
(3)编写Makefile文件
(4)DOS窗口执行指令进行编译
(5)在Dos窗口输入:
(6)双击生成的exe文件就可以执行了
五、做题
代码1:
代码2:
六、结语:
一、实验目的:
练习Proc编程。
二、实验工具:
VMW虚拟机。
Oracle数据库。
gcc编译器。
练习Proc编程。
VMW虚拟机。
Oracle数据库。
gcc编译器。
注:因为本人物理机上缺乏相关插件,导致Oracle无法正常启动和使用,所以本次实验在虚拟机上完成。
三、准备工作:
1、在虚拟机上配置win10系统。
虚拟机安装包及windows系统镜像链接:
链接:https://pan.baidu.com/s/1uq0nAsLaQoSRedSqBnmckQ
提取码:gyet
虚拟机安装包及windows系统镜像链接:
链接:https://pan.baidu.com/s/1uq0nAsLaQoSRedSqBnmckQ
提取码:gyet
安装虚拟机教程:
虚拟机不能连网?教你正确安装虚拟机_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ba4y1t7ic?spm_id_from=333.1007.top_right_bar_window_history.content.click[装机工具]VMware虚拟机安装及使用教程/解决Win10玩游戏卡顿、win7及win10激活工具..._哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Cb41177pr?spm_id_from=333.1007.top_right_bar_window_history.content.click
2、Oracle11g:
链接:
链接:https://pan.baidu.com/s/1MGkqZK6ZmHxGACseJqX5RQ
提取码:q9h7
安装教程:
Oracle(11g)数据库安装详细图解教程_百里慕溪的博客-CSDN博客_oracle数据库11g安装教程https://blog.csdn.net/duoyu779553/article/details/105788791
如果出现监听器错误,下面是解决办法:
(1条消息) 关于连接Oracle数据库时出现的“ORA-12541:TNS 无监听程序”和“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”的解决办法_代码骑士的博客-CSDN博客https://blog.csdn.net/qq_51701007/article/details/124660215?spm=1001.2014.3001.5501
链接:
链接:https://pan.baidu.com/s/1MGkqZK6ZmHxGACseJqX5RQ
提取码:q9h7
安装教程:
Oracle(11g)数据库安装详细图解教程_百里慕溪的博客-CSDN博客_oracle数据库11g安装教程https://blog.csdn.net/duoyu779553/article/details/105788791
如果出现监听器错误,下面是解决办法:
(1条消息) 关于连接Oracle数据库时出现的“ORA-12541:TNS 无监听程序”和“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”的解决办法_代码骑士的博客-CSDN博客https://blog.csdn.net/qq_51701007/article/details/124660215?spm=1001.2014.3001.5501
安装好后设置环境变量(后面编译gcc代码要用到!!!)
3、安装和使用gcc:
(这步是跟大佬新学的,在此表示:非常感谢!)
看这个教程:
(1条消息) 用gcc编译器实现PC编程_代码骑士的博客-CSDN博客https://blog.csdn.net/qq_51701007/article/details/124661250?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124661250%22%2C%22source%22%3A%22qq_51701007%22%7D&ctrtid=BdhwE
四、开始实验
1、在Oracle数据库中建表并插入:
set feedback off;
show user;
drop table sc;
drop table s;
drop table c;
create table s(
sno char(4) not null primary key,
sname varchar2(10),
sex char(3),
dept varchar2(4),
age int
);
insert into s values('801','金贤重','男','CS',23);
insert into s values('802','李敏镐','男','MA',25);
insert into s values('803','那英','女','CS',41);
insert into s values('804','金秀贤','女','MA',24);
insert into s values('805','刘德华','男',null,52);
insert into s values('806','文章','男','CS',27);
insert into s values('807','刘欢','男','MA',51);
insert into s values('808','马伊琍','女','CS',36);
insert into s values('809','姚笛','女','MA',23);
insert into s values('810','周杰伦','男',null,39);
create table c(
cno char(3) primary key,
cname varchar2(20),
credit int
);
insert into c values('01','数据库概论',3);
insert into c values('02','OS',4);
insert into c values('03','OOP',2);
insert into c values('04','Java',3);
insert into c values('05','Python',3);
insert into c values('06','D语言讲座',2);
create table sc(
sno char(4),
cno char(3),
grade numeric(3),
constraint sc_pk primary key(sno,cno),
constraint sc_fk1 foreign key(sno) references s(sno),
constraint sc_fk2 foreign key(cno) references c(cno),
constraint sc_grade check (grade between 0 and 100 or grade is null)
);
insert into sc values('801','01',81);
insert into sc values('802','01',59);
insert into sc values('803','01',0);
insert into sc values('804','01',60);
insert into sc values('805','01',30);
insert into sc values('806','01',90);
insert into sc values('807','01',60);
insert into sc values('808','01',null);
insert into sc values('801','02',null);
insert into sc values('802','02',30);
insert into sc values('803','02',45);
insert into sc values('804','02',80);
insert into sc values('805','02',70);
insert into sc values('806','02',60);
insert into sc values('801','03',90);
insert into sc values('802','03',60);
insert into sc values('803','03',40);
insert into sc values('804','03',null);
insert into sc values('805','03',50);
insert into sc values('806','03',70);
insert into sc values('807','03',70);
insert into sc values('808','03',80);
insert into sc values('801','04',40);
insert into sc values('802','04',0);
insert into sc values('803','04',null);
insert into sc values('804','04',80);
insert into sc values('805','04',90);
insert into sc values('806','04',60);
insert into sc values('807','04',70);
insert into sc values('808','04',50);
insert into sc values('809','05',0);
commit;
select * from s;
select * from c;
select * from sc;
set feedback off;
show user;
drop table sc;
drop table s;
drop table c;
create table s(
sno char(4) not null primary key,
sname varchar2(10),
sex char(3),
dept varchar2(4),
age int
);
insert into s values('801','金贤重','男','CS',23);
insert into s values('802','李敏镐','男','MA',25);
insert into s values('803','那英','女','CS',41);
insert into s values('804','金秀贤','女','MA',24);
insert into s values('805','刘德华','男',null,52);
insert into s values('806','文章','男','CS',27);
insert into s values('807','刘欢','男','MA',51);
insert into s values('808','马伊琍','女','CS',36);
insert into s values('809','姚笛','女','MA',23);
insert into s values('810','周杰伦','男',null,39);
create table c(
cno char(3) primary key,
cname varchar2(20),
credit int
);
insert into c values('01','数据库概论',3);
insert into c values('02','OS',4);
insert into c values('03','OOP',2);
insert into c values('04','Java',3);
insert into c values('05','Python',3);
insert into c values('06','D语言讲座',2);
create table sc(
sno char(4),
cno char(3),
grade numeric(3),
constraint sc_pk primary key(sno,cno),
constraint sc_fk1 foreign key(sno) references s(sno),
constraint sc_fk2 foreign key(cno) references c(cno),
constraint sc_grade check (grade between 0 and 100 or grade is null)
);
insert into sc values('801','01',81);
insert into sc values('802','01',59);
insert into sc values('803','01',0);
insert into sc values('804','01',60);
insert into sc values('805','01',30);
insert into sc values('806','01',90);
insert into sc values('807','01',60);
insert into sc values('808','01',null);
insert into sc values('801','02',null);
insert into sc values('802','02',30);
insert into sc values('803','02',45);
insert into sc values('804','02',80);
insert into sc values('805','02',70);
insert into sc values('806','02',60);
insert into sc values('801','03',90);
insert into sc values('802','03',60);
insert into sc values('803','03',40);
insert into sc values('804','03',null);
insert into sc values('805','03',50);
insert into sc values('806','03',70);
insert into sc values('807','03',70);
insert into sc values('808','03',80);
insert into sc values('801','04',40);
insert into sc values('802','04',0);
insert into sc values('803','04',null);
insert into sc values('804','04',80);
insert into sc values('805','04',90);
insert into sc values('806','04',60);
insert into sc values('807','04',70);
insert into sc values('808','04',50);
insert into sc values('809','05',0);
commit;
select * from s;
select * from c;
select * from sc;
输出数据:
2、使用gcc进行proc编程
(3.3的步骤做好才能进行这步。)
(1)创建一个新的项目文件夹(可以是任意位置)
(2)将pc文件复制到此文件夹
(一开始只有这一个文件)
(3)编写Makefile文件
创建Makefile文件
先来了解一下它:(1条消息) Makefile教程(绝对经典,所有问题看这一篇足够了)_GUYUEZHICHENG的博客-CSDN博客_makefilehttps://blog.csdn.net/weixin_38391755/article/details/80380786?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165207221416781432988413%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165207221416781432988413&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-80380786-null-null.142^v9^pc_search_result_control_group,157^v4^control&utm_term=Makefile&spm=1018.2226.3001.4187怎么创建:
在文件夹中新建一个文档,更改名字为Makefile,然后删去扩展名就可以了。
编写(也可创建完直接编写再删去扩展名):
#Project example_1 example: example.o gcc -o example example.o $(ORACLE_HOME)BINoci.dll example.o: example.c gcc -c example.c -I $(ORACLE_HOME)precomppublic example.c: example.pc proc example.pc .PHONY: clean clean: del example.o example.c example.exe
这里面的example是代码文件名可以按自己的文件名更改。
(4)DOS窗口执行指令进行编译
在该文件夹路径下输入cmd回车(下面的文件还没生成,图片中的其余是我之前做好的)
(5)在Dos窗口输入:
mingw32-make
mingw32-make
(6)双击生成的exe文件就可以执行了
结果:
下面就可以做题了。
五、做题
第 1 题:
第 2 题:
原来的.pc文件代码:
#include#include #include #include #include void sql_error();//异常处理函数 int main() { exec sql include sqlca; exec sql begin declare section; char user_name[20]; char user_pwd[20]; char db_name[20]; char ip[20]; char port[20]; char url[100]; int i; char s_no[6]; char s_name[10]; char s_sex[4]; int s_age; int var_age; exec sql end declare section; exec sql whenever SQLERROR do sql_error(); //异常处理 printf("nnb 欢迎登录学生年龄查询功能nn"); printf("bb IP地址:"); gets(ip); printf("bb Port号:");gets(port); printf("bb 数据库服务器名称:");gets(db_name); printf("bb 用户名:"); gets(user_name); printf("bb 密码:");gets(user_pwd); strcpy(url,ip); strcat(url,":"); strcat(url,port); strcat(url,"/"); strcat(url,db_name); exec sql connect :user_name identified by :user_pwd using :url; printf("nn 用户:%s 密码:%s,哈哈,登陆成功.n",user_name,user_pwd); system("pause"); while(1) { system("cls"); printf("n温馨提示:键入9999退出系统"); printf("n输入年龄: "); scanf("%d",&var_age); if( var_age==9999) break; exec sql declare sx cursor for select sno,sname,sex,age from s where age<:var_age; exec sql open sx; i=0; system("cls"); printf("ntt学生(年龄 < %d)的基本信息表",var_age); printf("nt---------------------------------------------"); printf("nt序号t学号t姓名tt性别t年龄"); printf("nt---------------------------------------------"); while(1) { exec sql fetch sx into :s_no,:s_name,:s_sex, :s_age; if(sqlca.sqlcode!=0) break; i++; printf("nt %dt%st%st%st%d",i,s_no,s_name,s_sex,s_age); } printf("nt--------------------------------------------"); if(i!=0) printf("ntttt共%d人n",i); else printf("nttt未找到年龄为%d学生!n",var_age); system("pause"); } system("pause"); exec sql close sx; exec sql commit release; return 0; } void sql_error() { printf("SQL语句错误:错误代号:%d 错误描述:%sn",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc); system("pause"); exit(0); }
查询的是数据库表中的年龄小于x的学生的基本信息
代码1:
#include
#include
#include
#include
#include
void sql_error();//异常处理函数
int main()
{
exec sql include sqlca;
exec sql begin declare section;
char user_name[20];
char user_pwd[20];
char db_name[20];
char ip[20];
char port[20];
char url[100];
int i;
char s_no[6];
char s_name[10];
char s_sex[4];
char c_no[6];
char c_name[10];
char c_grade[4];
int s_age;
char var_dept[10];
exec sql end declare section;
exec sql whenever SQLERROR do sql_error(); //异常处理
printf("nnb 欢迎登录各系学生信息查询功能nn");
printf("bb IP地址:"); gets(ip);
printf("bb Port号:");gets(port);
printf("bb 数据库服务器名称:");gets(db_name);
printf("bb 用户名:");gets(user_name);
printf("bb 密码:");gets(user_pwd);
strcpy(url,ip);
strcat(url,":");
strcat(url,port);
strcat(url,"/");
strcat(url,db_name);
exec sql connect :user_name
identified by :user_pwd using :url;
printf("nn 用户:%s 密码:%s,哈哈,登陆成功.n",user_name,user_pwd);
system("pause");
while(1)
{
system("cls");
printf("n温馨提示:键入eixt退出系统");
printf("n输入系别: "); scanf("%s",&var_dept);
if( var_dept=="eixt") break;
exec sql declare sx cursor for
select sno,sname,sex,age from s where dept =: var_dept;
exec sql open sx;
i=0;
system("cls");
printf("ntt%s学生信息表",var_dept);
printf("nt---------------------------------------------");
printf("nt序号t学号t姓名tt性别t年龄");
printf("nt---------------------------------------------");
while(1)
{
exec sql fetch sx into :s_no,:s_name,:s_sex, :s_age;
if(sqlca.sqlcode!=0) break;
i++;
printf("nt %dt%st%st%st%d",i,s_no,s_name,s_sex,s_age);
}
printf("nt--------------------------------------------");
system("pause");
}
system("pause");
exec sql close sx;
exec sql commit release;
return 0;
}
void sql_error()
{
printf("SQL语句错误:错误代号:%d 错误描述:%sn",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
system("pause");
exit(0);
}
输出结果:
代码2:
#include
#include
#include
#include
#include
void sql_error();//异常处理函数
int main()
{
exec sql include sqlca;
exec sql begin declare section;
char user_name[20];
char user_pwd[20];
char db_name[20];
char ip[20];
char port[20];
char url[100];
int i;
char s_no[6];
char s_name[10];
char s_sex[4];
char c_no[6];
char c_name[20];
float c_grade;
int s_age;
char var_no[10];
exec sql end declare section;
exec sql whenever SQLERROR do sql_error(); //异常处理
printf("nnb 欢迎登录学生各科成绩查询系统nn");
printf("bb IP地址:"); gets(ip);
printf("bb Port号:");gets(port);
printf("bb 数据库服务器名称:");gets(db_name);
printf("bb 用户名:");gets(user_name);
printf("bb 密码:");gets(user_pwd);
strcpy(url,ip);
strcat(url,":");
strcat(url,port);
strcat(url,"/");
strcat(url,db_name);
exec sql connect :user_name
identified by :user_pwd using :url;
printf("nn 用户:%s 密码:%s,哈哈,登陆成功.n",user_name,user_pwd);
system("pause");
while(1)
{
system("cls");
printf("n温馨提示:键入eixt退出系统");
printf("n输入学号: "); scanf("%s",&var_no);
if( var_no=="eixt") break;
exec sql declare sx cursor for
select cname,grade
from c,sc
where sc.cno = c.cno
and sc.sno=:var_no
and grade is not null;
exec sql open sx;
i=0;
float sum=0;
system("cls");
printf("ntt%s学生信息表",var_no);
printf("nt---------------------------------------------");
printf("nt序号t课程名t成绩t");
printf("nt---------------------------------------------");
while(1)
{
exec sql fetch sx into :c_name,:c_grade;
if(sqlca.sqlcode!=0) break;
i++; sum=sum+c_grade;
printf("nt %dt%st%.2ft",i,c_name,c_grade);
}
printf("nt--------------------------------------------");
printf("nt---------------平均分:%.2f--------------",sum/i);
system("pause");
}
system("pause");
exec sql close sx;
exec sql commit release;
return 0;
}
void sql_error()
{
printf("SQL语句错误:错误代号:%d 错误描述:%sn",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
system("pause");
//exit(0);
}
遇到的问题:
解决办法是:
在查询条件中加入这句代码,跳过成绩空值。
and grade is not null;
输出:
六、结语:
我喜欢MySQL。



