嵌入式SQL编程快速上手教程

  • Post author:
  • Post category:其他

嵌入式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”;

这是简便方式链接数据库,具体操作请看这篇

(85条消息) 嵌入式SQL数据库连接简便操作_小艾菜菜菜的博客-CSDN博客https://blog.csdn.net/m0_52318340/article/details/124409813?spm=1001.2014.3001.5501

#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);
}

运行结果:

最后希望对大家有所帮助,欢迎批评指正,我们一起学习成长~(比心~)


版权声明:本文为m0_52318340原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。