嵌入式SQL编程快速上手教程
声明:我这里标题虽是《嵌入式SQL编程快速上手教程》,但只是嵌入式SQL编程的冰山一角罢了,我会通过举一道简单例题来教小白快速上手嵌入式SQL编程
第一:题目描述
其模式描述分别是:
S (sno,sname,dept,gender,age)
C (cno,cname,credit)
SC(sno,cno,grade)
ps:S 代指学生信息表,C 代指课程信息表,SC 代指学生课程信息表 ,sno代指学生学号,cno代指课程号
试使用Pro*C编写程序, 完成对数据库的操作, 并按相应格式输出,格式范例如下:
以上就是题目的要求,我们该如何该如何使用嵌入式SQL语言实现呢???如果你是小白请跟随我的脚步,我会用最简单方式教您怎么实现,如果不是我若有不足的地方请多多指教,我们一块儿学习(比心~)
第二:解决问题
小白请跟随我的脚步:
声明:我用的编译器是DEVC++去实现的
首先头文件的声明:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sqlca.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sqlca.h>
以上用颜色标记的是必写的内容不可缺失!!!
紧接着写主函数:
这里多说一句:就是你现在不懂我写的内容是什么,没关系的哈,我会大概会给出说明,您先照着做就行,然后再进一步去理解(我当初也是这么来学的)
int main(){
exec sql include sqlca;
exec sql begin declare section;
这里要写主变量,这是嵌入式SQL语言的规定!!!
主变量的声明就是在这两者之间去写!!!
我一般习惯多写几个变量,因人而异哈~
exec sql end declare section;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sqlca.h>
int main()
{
exec sql include sqlca;
exec sql begin declare section;
int i;
char s_no[6];
char s_name[15];
char s_sex[4];
int s_age;
int var_age;
int s_grade;
char c_name[15];
int c_no;
int s_avgGrade;
exec sql end declare section;
继续写:
exec sql whenever SQLERROR do sql_error();
这是出现异常时用到的函数
exec sql connect :”system” indentified by:”123456″ using:”localhost:1521/orcl”;
这是简便方式链接数据库,具体操作请看这篇:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
#include <sqlcpr.h>
void sql_error();//异常处理函数
int main()
{
exec sql include sqlca;
exec sql begin declare section;
int i;
char s_no[6];
char s_name[15];
char s_sex[4];
int s_age;
int var_age;
int s_grade;
char c_name[15];
int c_no;
int s_avgGrade;
exec sql end declare section;
/**输入登陆信息如下所示 */
exec sql whenever SQLERROR do sql_error(); //异常处理函数
exec sql connect :"system"
identified by :"123456" using :"localhost:1521/orcl";
printf("\n\n 用户登陆成功.\n");
system("pause");//这是请按任意键继续的意思
后面我就直接附代码了,有需要解释的我会单独拿出来解释:
while(1)
{
system("cls");
printf("\n温馨提示:键入9999退出系统");
printf("\n输入学生姓名: "); scanf("%s",&s_name);
if( var_age==9999) break; //这里你也可以设置成别的方式退出~
exec sql declare sx cursor for
select cname ,nvl((grade),0) from sc,c,s where sc.cno=c.cno and sc.sno=s.sno and sname=: s_name ;
exec sql open sx; //打开游标
i=0;
system("cls"); //这是实现清屏操作的代码
printf("\n\t%s 学生成绩表",s_name);
//printf("\n\t---------------------------------------------");
printf("\n\t序号\t课程名\t\t\成绩\t备注");
//printf("\n\t---------------------------------------------");
while(1)
{
exec sql fetch sx into :c_name,:s_grade;
if(sqlca.sqlcode!=0) break;
i++;
printf("\n\t %d\t%s\t%d ",i,c_name,s_grade);
}
printf("\n\t---------------------------------------------------");
exec sql select avg(grade) into : s_avgGrade from s,c,sc where s.sno=sc.sno and sc.cno=c.cno and sname=:s_name;
if(i!=0) printf("\n\t\t\t\t平均成绩:%d\n",s_avgGrade);
//printf("\n\t\t\t\t共%d人\n",i);
else printf("\n\t\t\t未找到学生%s的课程信息!\n",s_name);
printf("\n");
system("pause"); //这是请按任意键继续的意思
}
system("pause"); //这是请按任意键继续的意思
exec sql close sx;
exec sql commit release;
return 0;
}
第一:游标的概念:
1.游标是系统为用户开设的一个数据缓冲区, 存放SQL语句的执行结果。
2.每个游标区都有一个名字。
第二:游标的作用:
1.以通过游标逐一获取记录, 并赋给主变量,交给主语言进一步处理。
第三:使用游标的步骤:
1. 说明游标(declare)
语句格式 :
EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;
exec sql declare sx cursor for
select cname ,nvl((grade),0) from sc,c,s where sc.cno=c.cno and sc.sno=s.sno and sname=: s_name ;exec sql open sx;
ps:
1.sx是我自己定义的游标名,这里没有太多的要求,可以是阿猫阿狗~
2.这里的 sname=: s_name 这是我们写SQL语句时对用到的主变量的使用方式,必须得这么写!!!
3.这里用到了一个nvl() 这样的函数,为什么会用?请看这篇:(85条消息) 嵌入式SQL,C编写程序提取值为NULL情况的解决_小艾菜菜菜的博客-CSDN博客https://blog.csdn.net/m0_52318340/article/details/124384436?spm=1001.2014.3001.5501
功能 :
是一条说明性语句,这时DBMS并不执行 SELECT指定的查询操作。
2. 打开游标(open)
语句格式:
EXEC SQL OPEN <游标名>;
exec sql open sx;
功能 :
1.执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中。
2.这时游标处于活动状态,指针指向查询结果集中第一条记录。
3. 推进游标指针并提取当前记录(fetch)
语句格式 :
EXEC SQL FETCH FROM <游标名> INTO <主变量表>;
exec sql fetch sx into :c_name,:s_grade;
ps:暂时不懂没关系,看下面截的图你会明白是怎么用的~,就是我们把要题目要求让我们找的信息存在c_name和s_grade中,进而实现输出的效果
功能 :
1.指针下移一行。
2.将当前行的记录数据取出,依次给主变量赋值。
4. 关闭游标(close)
语句格式 :
EXEC SQL CLOSE <游标名>;
exec sql close sx;
功能 :
关闭游标释放结果集占用的缓冲区及其他资源。
——————————————————————————————————————————
代码 if(sqlca.sqlcode!=0) break; 解释:
if(sqlca.sqlcode!=0) break;
sqlcode,整型字段,用于保留最近执行的SQL语句的状态:
sqlca.sqlcode = 0 表示该SQL语句执行成功, 没有发生错误和异常。
sqlca.sqlcode > 0 表示执行了该SQL语句, 但有一异常。
sqlca.sqlcode < 0 表示由于DB、系统、网络或程序有错误, ORACLE 未执行该语句。如出现这类错误, 当前事务一般回退。
代码 exec sql commit release; 解释:
exec sql commit release;
commit 提交变更
release 释放数据库连接这句过后才能真正入库,并进行提交就可以改变数据库的值了
——————————————————————————————————————————
最后写前面的用到的异常处理函数:
void sql_error()
{
printf("SQL语句错误:错误代号:%d 错误描述:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
system("pause");
exit(0);
}
——————————————————————————————————————————
最后pc源码与运行结果
pc源码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
#include <sqlcpr.h>
void sql_error();//异常处理函数
int main()
{
exec sql include sqlca;
exec sql begin declare section;
int i;
char s_no[6];
char s_name[15];
char s_sex[4];
int s_age;
int var_age;
int s_grade;
char c_name[15];
int c_no;
int s_avgGrade;
exec sql end declare section;
/**输入登陆信息如下所示 */
exec sql whenever SQLERROR do sql_error(); //异常处理
exec sql connect :"system"
identified by :"123456" using :"localhost:1521/orcl";
printf("\n\n 用户哈哈,登陆成功.\n");
system("pause");//这是请按任意键继续的意思
while(1)
{
system("cls");
printf("\n温馨提示:键入9999退出系统");
printf("\n输入学生姓名: "); scanf("%s",&s_name);
if( var_age==9999) break;
exec sql declare sx cursor for
select cname ,nvl((grade),0) from sc,c,s where sc.cno=c.cno and sc.sno=s.sno and sname=: s_name ;
exec sql open sx;
i=0;
system("cls");
printf("\n\t%s 学生成绩表",s_name);
//printf("\n\t---------------------------------------------");
printf("\n\t序号\t课程名\t\t\成绩\t备注");
//printf("\n\t---------------------------------------------");
while(1)
{
exec sql fetch sx into :c_name,:s_grade;
if(sqlca.sqlcode!=0) break;
i++;
printf("\n\t %d\t%s\t%d ",i,c_name,s_grade);
}
printf("\n\t---------------------------------------------------");
exec sql select avg(grade) into : s_avgGrade from s,c,sc where s.sno=sc.sno and sc.cno=c.cno and sname=:s_name;
if(i!=0) printf("\n\t\t\t\t平均成绩:%d\n",s_avgGrade);
//printf("\n\t\t\t\t共%d人\n",i);
else printf("\n\t\t\t未找到学生%s的课程信息!\n",s_name);
printf("\n");
system("pause");
}
system("pause");
exec sql close sx;
exec sql commit release;
return 0;
}
void sql_error()
{
printf("SQL语句错误:错误代号:%d 错误描述:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
system("pause");
exit(0);
}
运行结果:
最后希望对大家有所帮助,欢迎批评指正,我们一起学习成长~(比心~)