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

本文提供了一个嵌入式SQL编程的快速上手指南,通过一个简单的例题教读者如何使用Pro*C实现数据库操作。教程详细介绍了如何声明和使用主变量、处理数据库连接、定义游标以及异常处理。示例代码展示了如何根据学生姓名查询并显示其课程及成绩,同时计算平均成绩。此外,还解释了SQL错误处理和事务提交的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

运行结果:

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

嵌入式SQL编程的范例,使用VC6编译Oracle 10g 嵌入式SQL程序操作步骤 一、 基本要求 1、所需软件Visual C++ 6.0 2、 源代码包括 PRO C 文件: student.pc 3、安装ORACLE10G 或其客户端 在ORACLE10G CLIENT 安装时并没有 Precomp C 的选项,可以选择全部安装或者开发人员选项进行安装。安装后确保有如下几个文件: PROC的可执行文件 : $ORACLE_HOME\BIN\PROC.EXE Oracle支持SQL在VC环境的库文件OraSQL10.LIB Oracle支持SQL在VC环境的头文件 : 位于$ORACLE_HOME\precomp\ PUBLIC \*.h 文件 二、 将PROC集成到VC环境中 1、增加PROC到Tools(工具)菜单列表 在本例中,$ORACLE_HOME指的是E:\oracle\product\10.1.0\db_1目录。   a) 运行Microsoft Visual C++ 6.0;   b) 从菜单项Tools(工具)中选择Customize(定制)项。为表述简单起见,书写成如下格式:菜单Tools/ Customize(工具/定制) 项。以下采用类似的表达方法。此时出现Customize(定制)对话框;   c) 单击Tools(工具)选项卡(或属性页),用鼠标移动“Menu contents(菜单目录)”框滚动条到底部区域;   d) 双击点划线矩形区域,在空白区域上输入“PROC”,然后按回车键;   e) 在“Command(命令)”框中,输入PROC的可执行文件名。例如:E:\oracle\product\10.1.0\db_1\BIN\ PROC. EXE  f) 在“Arguments(参数)”框中输入“$(TargetName)”。其作用在从菜单Tools中选择PROC项时,VC会将当前项目名传递给PROC,尔后PROC会直接打开该项目文件目录下扩展名为 .pre的同名文件; g) 在“Initial directory(初始化目录)”框中输入“$(WkspDir)” / 单击“Close(关闭)”按钮,完成将PROC集成到VC环境中的工作。 2、指定头文件路径   为了确保VC顺利完成编译链接,需要将Oracle提供的头文件增加到VC环境中。指定头文件路径的具体步骤如下。   a) 菜单Tools / Options(工具/选择)项,出现“Options(选择)”对话框;   b) 单击“Directories(目录)”选项卡,从“Show directories for(显示目录为):”列表框中选择“Include files”;   c) 移动“Directories(路径)”框的滚动条到底部区域; d) 双击点划线矩形区域,在空白区域上输入包含Oracle支持SQL在VC环境头文件的子目录,对缺省安装即输入E:\oracle\product\10.1.0\db_1\ PRECOMP \ PUBLIC。 e) 单击“Directories(目录)”选项卡,从“Show directories for(显示目录为):”列表框中选择“Library files”;   f) 移动“Directories(路径)”框的滚动条到底部区域; d) 双击点划线矩形区域,在空白区域上输入包含Oracle支持SQL在VC环境头文件的子目录,对缺省安装即输入E:\oracle\product\10.1.0\db_1\ PRECOMP \ lib\msvc。 3、可执行文件路径 a) 菜单Tools / Options(工具/选择)项,出现“Options(选择)”对话框; b) 单击“Directories(目录)”选项卡,从“Show directories for(显示目录为):”列表框中选择“Executable files”; c) 查看“Directories(路径)”框是否包括$ORACLE_HOME\BIN 路径,一般先安装ORACLE再安装VC,这个路径会包括在内的,如果没有包括,添加这么一条路径。 三、 程序创建过程 1、 创建新工程 当运行Visual C++ 6.0后,操作步骤如下:   a) 菜单File / New项 / Project卡;   b) 选择Win32 console Application 项;   c) 由浏览选择或直接输入工程将位于的路径 / 填入创建的工程名如student 。 d) 单击OK按钮 / 依缺省值单击Finish / 单击OK,完成创建控制台应用工程框架。 e) 菜单工程/设置 项/link卡, 添加两个文件 oraSQL10.lib, oraSQX10.lib 到对象/库模块中 2、将PRO C 文件加入工程  a) 菜单Project / Add To Project 项 / Files 项;   b) 将文件对话框的文件类型改为“所有文件”;   c) 路径选为student.pc 文件所在目录   d) 选择student.pc文件,单击“打开”钮,完成将PRO C文件加入工程。 3、预编译  通过预编译,将预编译源文件如student.pc转换成为student.c的C程序源文件。在PROC集成到VC环境下时操作步骤如下:   a) 菜单Tools / PROC 项; b)此时弹出PROC预编译命令行窗口,从窗口标题可以看成,其执行E:\oracle\product\10.1.0\db_1\BIN\ PROC. EXE student 当窗口提示:“press any key to continue” ,敲任意键该窗口关闭。 此时可以看到生成student.c 文件 c) 如果预编译结束,预编译对话框左边显示的状态图标为黄色(警告)或红色(预编译失败)时,应双击该标识观察帮助或出错信息。预编译失败,应当修改源程序,再进行预编译,直到通过预编译。 4、编译准备   为了使工程能通过编译,需要将预编译输出的工程源文件和Oracle支持SQL在VC环境下的运行库文件加入到工程中,下面具体介绍增加这两个文件的步骤。   1) 将预编译的输出文件和有关头文件加入工程   a) 菜单Project / Add To Project 项 / Files 项;   b) 在文件对话框中选择正确路径,选定预编译输出生成的文件student.c,单击“打开”按钮,即将这些文件加入工程。   2) 将运行库文件加入工程   a) 菜单Project / Add To Project 项 / Files 项;   b) 将文件对话框的文件类型改为“所有文件”;   c) 路径选为$ORACLE_HOME\precomp\LIB   d) 选择OraSQL10.LIB文件,单击“打开”钮,完成将运行库文件加入工程。 5、编译链接   按F7键或单击编译图标,对工程进行编译链接。如果没有出现错误,则通过编译链接,生成可执行文件如student.exe。
第六章 嵌入式SQL(E-SQL)简介 3 第一节 什么是嵌入SQL语言? 3 1.1 嵌入SQL程序的组成元素 3 1.2 什么是静态SQL和动态SQL? 4 1.3 什么是SQLCA? 4 1.4 什么是SQLDA? 5 第二节 SYBASE SQL SERVER嵌入式SQL语言 5 2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主变量 7 2.3.2 连接数据库 12 2.3.3 数据的查询和修改 13 2.3.4 游标的使用 14 2.3.5 SQLCA 15 2.3.6 WHENEVER 17 2.3.7 批处理 18 2.3.8 事务 18 2.4动态SQL语句 19 2.4 .1 动态修改 19 2.4.2 动态游标 21 2.4.3 SQLDA 23 2.4.4 DESCRIBE语句 27 2.5 两个例子程序 27 2.5.1 TELECOM程序 27 2.5.2 ADHOC程序 29 第三节 IBM DB2嵌入SQL语言 35 3.1 一个简单示例 35 3.2 嵌入SQL语句 37 3.2.1宿主变量 37 3.2.2单行查询 39 3.2.3多行查询 39 3.2.4插入、删除和修改操作 40 3.2.5 SQLCA 44 3.2.6事务 46 3.3 DB2的嵌入SQL程序处理过程 46 3.4 DB2的动态SQL嵌入语句 53 3.4.1 基本方法 53 3.4.2 动态游标 55 3.4.3 SQLDA 55 第四节 ORACLE数据库的嵌入SQL语言 66 4.1 基本的SQL语句 66 4.1.1宿主变量和指示符 66 4.1.2 查询 68 4.1.3 修改数据 68 4.1.4 游标 68 4.2 嵌入PL/SQL 71 4.3 动态SQL语句 72 4.3.1 ORACLE动态SQL语句的一些特点 72 4.3.2 使用动态SQL的四种方法 72 4.3.3 SQLDA 75 第五节INFORMIX的嵌入SQL/C语言 89 5.1 一个简单的入门例子 89 5.2 宿主变量 91 5.3 嵌入SQL的处理过程 96 5.4 动态SQL语言 96 5.4.1 SQLDA 97 第六节MICROSOFT SQL SERVER7嵌入式SQL语言 105 6.1 一个嵌入SQL语言的简单例子 105 6.2 嵌入SQL的处理过程 106 6.3 嵌入SQL语句 112 6.3.1 声明嵌入SQL语句中使用的C变量 112 6.3.2 连接数据库 115 6.3.3 数据的查询和修改 115 6.3.4 游标的使用 116 6.3.5 SQLCA 117 6.3.6 WHENEVER 118 6.4动态SQL语句 119 6.4 .1 动态修改 119 6.4.2 动态游标 120 6.4.3 SQLDA 122 6.4.4 DESCRIBE语句 130 6.5 API 130
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值