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

article/2025/10/6 11:56:37

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

运行结果:

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


http://chatgpt.dhexx.cn/article/t0CqNF8G.shtml

相关文章

数据库系统SQL编程-01

目录 一、查询各专业学生的平均成绩(MSSQL&#xff09; 表结构: 表样例 输出样例: 编译代码&#xff1a; 二、查询平均成绩最高的前3名同学 表结构: 表样例 输出样例: 编译代码&#xff1a; 三、 查询同专业的学生&#xff08;MSSQL&#xff09; 表结构: 表样…

pl/sql编程语言

–pl/sql编程语言 –pl/sql编程语言是对sql语言的扩展&#xff0c;是的sql语言具有过程化编程的特性 –pl/sql编程语言比一般的过程化编程语言&#xff0c;更加灵活高效 –pl/sql编程语言主要用来编写存储过程和存储函数等。 --声明方法,定义变量 --赋值操作可以用 : 也可以使…

SQL编程开发

文章目录 SQL概述SQL分类SQL语言规范 基本查询语句查询全部列查询特定列过滤操作模糊查询排序操作多表查询单行函数组函数group by和having 子查询库和表的操作库的操作表的操作数据类型列的操作 数据处理之增删改事务、约束和分页事务约束分页 安装好MySQL下步就是使用MySQL&a…

SQL编程

10-1 查询学生表所有学生记录 (5 分) 本题目要求编写SQL语句&#xff0c; 检索出stu表中所有学生记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: 定义表结构的SQL语句。如&#xff1a; CREATE TABLE stu(sno char(4) NOT NULL,sname char(8) NOT NULL,sex tinyin…

SQL 编程

SQL Server中存在两种变量局部变量和成员变量&#xff0c;两种变量的特点和其他语言变量特点一样 全局变量&#xff1a;由系统定义和维护由系统定义和维护 变量名前加“” 例 name 就定义了一个全局变量“name” 局部变量&#xff1a;由用户定义和使用&#xff0c;变量…

可编程的SQL是什么样的?

背景 如果你使用传统编程语言&#xff0c;比如Python&#xff0c;那么恭喜你&#xff0c;你可能需要解决大部分你不需要解决的问题&#xff0c;用Python你相当于拿到了零部件&#xff0c;而不是一辆能跑的汽车。你花了大量时间去组装汽车&#xff0c;而不是去操控汽车去抵达自…

SQL编程语言1

1 SQL简介 SQL是一门操作关系型数据库的编程语言 SQL通用语法 SQL语句可以以单行或多行书写&#xff0c;以分号结尾。只有在读取到分号后系统才会默认你已经输入执行语句MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写注释 单行注释&#xff1a;-- 注释内…

sql数据库高级编程总结(一)

1、数学函数&#xff1a;操作一个数据&#xff0c;返回一个结果 &#xff08;1&#xff09;取上限 ceiling 如果有一个小数就取大于它的一个最小整数 列如9.5 就会取到 10 select code,name,ceiling(price) from car &#xff08;2&#xff09;取下限 floor 如果有一个小数就…

SQL基础编程

文章目录 一.SQL的环境搭载单机离线环境在线环境 二.SQL的单表操作1.sql基础三步2.sql四则运算3.limit (限制查询结果个数)4.order by&#xff08;排序&#xff09;5.where 综合条件筛选6.SQL常量7.distinct (把结果中重复的行删除)8.函数(1) 聚合函数&#xff1a;sum() ——求…

君正X1000芯片性能和处理器介绍

君正X1000芯片是针对语音识别功能做了专门定制的芯片&#xff0c;可以支持4个MIC&#xff0c;支持远场唤醒&#xff0c;功耗很低&#xff0c;适用于物联网、智能家居、智能音频、智能玩具等产品 。 X1000 芯片功能&#xff1a; 穿戴处理器级低功耗&#xff0c;待机功耗0.2mW&am…

IBM storwize V5000存储基础配置

初始帐号密码 Superuser / passw0rd 设备和系统的基本状态 首先添加配置主机&#xff0c;前提是已经连接好光纤线&#xff0c;配置好光纤交换机 这里我们使用光纤通道 系统应该可以自动识别到端口&#xff0c;主机名可以设置为主机型号或者主机应用名 两个端口完成 配置内部存…

《计算机系统概论》-第5章-习题答案

给定指令ADD、JMP、LEA、NOT&#xff0c;请判断它们分别是操作&#xff08;或运算&#xff09;指令&#xff0c;还是数据搬移指令或控制指令&#xff1f;对每一条指令&#xff0c;进一步列出该指令可以采用的寻址模式。 指令类型寻址模式ADD操作立即数、寄存器2种寻址模式JMP控…

X1000之LCD部分的翻译

1.显示大小可达640x48060Hz&#xff0c;24BBP RGB 8 8 8 RGB(256^3) 2的24次方16777216 2.支持的颜色就是我们上面计算的 3. 8080并行接口 MCU接口方式&#xff08;8080&#xff0c;6800接口&#xff09;与RGB接口主要的区别 4.支持内部DMA操作和寄存器操作&#xff08;可以…

uboot - 配置过程1(分析国产君正的ingenic-linux-kernel3.10.14-x1000-v8.2-20181116\u-boot\mkconfig脚本)

分析uboot的配置过程&#xff08;mkconfig脚本&#xff09; uboot怎么配置&#xff1f;我们在终端上执行make NAME_config时的运行过程解析&#xff01; STEP1: %_config:: unconfig$(MKCONFIG) -A $(:_config)我们执行make *_config时会运行makefile的这两行程序&#xff0c…

Opencv 以指定格式保存图片

将图像保存至本地&#xff0c;以指定的格式&#xff0c;需要用到cv::imwrite()函数 函数原型&#xff1a; bool imwrite(const string& filename, InputArray img, const vector<int>& paramsvector<int>() )参数解释&#xff1a;filename:图像保存路径&…

【OpenCV-Python】教程:1-1 图像读取显示保存

文章目录 目标代码imread接口原型参数 支持的格式 imwrite接口原型参数 imshow接口原型参数 目标 读图片显示图片保存图片 代码 ## 导入库 import cv2 import sys## 读入图片 img cv2.imread("lena.jpg")## 读入失败退出 if img is None:sys.exit("Could not…

44.Linux君正X1000-添加st7789v显示

由于板子LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使用一个st7789v型号的LCD 它们两个屏的区别在于初始化屏的参数不同,引脚都一样,也就是说需要使板子同时支持ili9335型号和st7789v型号 思路: 1.uboot在显示LOG(初始化屏参数)之前,通过命令来读LCD型号,来检测LCD型…

HaaS100硬件规格

硬件配置 类别 参数 CPU 型号 HaaS 1000 架构 Cortex M33 主频 300MHz 片上Flash 16MB 内存 2.5MB SRAM 16MB PSRAM 硬件接口 类别 数量 性能指标 TF 卡槽 1个 最大支持 64GB RS485 1路 波特率支持1200bps ~ 115200bps RS232 1路 波特率最高支…

X1000对于CPU Core的参数解读(MIPS Cache)

各自摘抄整合&#xff0c;大多来自互联网&#xff0c;链接已全部放出来 1.MIPS-Based XBurst cores (up to 1.0GHz) 基于MIPS的XBurst核(最高可达1.0GHz) MIPS架构  XBurst是北京君正针对移动多媒体便携产品推出的一种创新的32位嵌入式CPU技术&#xff0c;它重新定义了32位嵌…