SQL 语言:嵌入式 SQL 和动态 SQL
文章目录
- 基本概述
- 嵌入式 SQL
- 动态 SQL
- 总结
基本概述
嵌入式SQL和动态SQL是两种在应用程序中嵌入和使用SQL语句的方法。它们都允许开发人员在编程语言中编写SQL语句,以便在应用程序中执行数据库操作。然而,这两种方法在实现方式、性能和灵活性方面存在一些差异。
嵌入式SQL是一种将SQL语句直接嵌入到宿主语言(如C、C++、Java等)代码中的方法。在这种情况下,开发人员需要使用特定的语法和预处理器来将SQL语句与宿主语言代码集成在一起。嵌入式SQL的主要优点是它允许开发人员在编写应用程序时使用熟悉的宿主语言语法,同时仍然能够利用SQL的强大功能。此外,嵌入式SQL通常具有较好的性能,因为它允许编译器在编译时检查SQL语句的有效性,并生成优化的代码。
动态SQL是一种在运行时构建和执行SQL语句的方法。在这种情况下,开发人员需要使用字符串拼接或模板引擎等技术来动态生成SQL语句。然后,这些语句可以在应用程序运行时传递给数据库服务器进行执行。动态SQL的主要优点是它具有很高的灵活性,因为它允许开发人员根据运行时条件构建和修改SQL语句。这使得动态SQL非常适合处理复杂的查询和更新操作,以及支持用户自定义的查询和报告功能。然而,动态SQL的性能可能较差,因为它需要在运行时解析和优化SQL语句,这可能导致额外的开销。
总的来说,嵌入式SQL和动态SQL各有优缺点。嵌入式SQL适用于那些需要高性能和编译时错误检查的场景,而动态SQL适用于那些需要高度灵活性和运行时动态生成SQL语句的场景。在选择使用哪种方法时,开发人员应权衡这些因素,并根据应用程序的具体需求做出决策。
在实际开发过程中,开发人员可能需要结合使用嵌入式SQL和动态SQL。例如,他们可以使用嵌入式SQL编写大部分数据库操作,以确保高性能和编译时错误检查;同时,对于需要高度灵活性的部分,可以使用动态SQL来实现。这种混合方法可以充分利用两种方法的优点,同时避免它们的局限性。
嵌入式 SQL
SQL 提供了将 SQL 语句嵌入某种高级语言中的使用方式,但是如何识别嵌入在高级语言中的 SQL 语句,通常采用预编译的方法。该方法的关键问题是必须区分主语言中嵌入的 SQL语句,以及主语言和 SQL 间的通信问题。采用的方法由 DBMS 的预处理程序对源程序进行扫描,识别出 SQL 语句,把它们转换为主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。
如何区分主语言语句与 SQL 语句?
需要在所有的 SQL 语句前加前缀 EXEC SQL
,而 SQL 的结束标志随主语言的不同而不同。
- PL/1 和 C 语言的引用格式为:
EXEC SQL <SQL语句>
; - COBOL 语言的引用格式为:
EXEC SQL <SQL 语句> END-EXEC
;
主语言与数据库如何通信?
(1)SQL 通信区 (SQL Communication Area,SQLCA) 向主语言传递 SQL 语句执行的状态信息,使主语言能够根据此信息控制程序流程。
(2)主变量也称共享变量。主语言向 SQL 语句提供参数主要通过主变量,主变量由主语言的程序定义,并用 SQL 的 DECLARE 语句说明,引用变量一定要加上:
。
EXEC SQL BEGIN DECLARE SECTION; /*说明主变量*/char Msno[4],Mcno[3],Givensno[5];int Mgrade;char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;
分析:以上说明了五个共享变量,其中,SQLSTATE 是一个特殊的共享变量,解释 SQL 语句执行状况的作用。当 SQL 语句执行成功时,系统自动给 SQLSTATE 赋值上全零值,否则为非全零(”02000”)。因此,当执行一条SQL语句后,可以根据 SQLSTATE 的值转向不同的分支,以控制程序的流向。引用时,为了与 SQL 属性名相区别,需在主变量前加:
。
示例1. 根据共享变量 givensno 值查询学生关系students 中学生的姓名、年龄和性别。
EXEC SQL SELECT sname,age,sexINTO :Msno,Mcno,:givensnoFROM studentsWHERE sno=:Msno;
示例2. 某学生选修了一门课程信息,将其插入学生选课表SC中,假设学号、课程号、成绩已分别赋给主变量HSno、Hcno和Hgrade。
EXEC SQL INSERT INTO SC(Sno,Cno,Grade)VALUES(:Hsno,:Hcno,:Hgrade);
(3)游标。SQL 语言是面向集合的,一条 SQL 语句可产生或处理多条记录。而主语言是面向记录的,一组主变量一次只能放一条记录,所以,引入游标,通过移动游标指针来决定获取哪一条记录。
- 定义游标:说明性语句,定义中的 SELECT 语句并不立即执行。语法如下:
EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT 语句>
- 打开游标:执行游标定义中的 SELECT 语句,同时游标处于活动状态,游标是一个指针,此时指向查询结果的第一行之前。语法如下:
EXEC SQL OPEN <游标名>
- 推进游标:使用时,游标会推进一行,并把指针指向的行(称为当前行)中的值取出,送到共享变量中。变量表由逗号分开的共享变量组成。该语句经常用于宿主程序的循环结构中,并借助宿主语言的处理语句逐一处理查询结果中的一个元组。语法如下:
EXEC SQL FETCH FROM <游标名> INTO <变量表>
- 关闭游标:使用时,关闭游标,不再和查询结果相联系。关闭了的游标,可以再次打开,与新的查询结果相联系。在游标处于活动状态时,可以修改和删除游标指向的元组。语法如下:
EXEC SQL CLOSE <游标名>
示例3. 在C语言中嵌入SQL的查询,检索某学生的学习成绩,其学号由共享主变量givensno给出,结果放在主变量Sno,Cno,Grade中。如果成绩不及格,则删除该记录,如果成绩为60~69分,则将成绩修改为70分,并显示学生的成绩信息(除60分以下的)
#DEFINE NO_MORE_TUPLES !(strcmp(SQLSTATE,"02000"))
void sel()
{EXEC SQL BEGIN DECLARE SECTION; /*说明主变量*/char Msno[4],Mcno[3],givensno[5];int Mgrade;char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE Scx CURSOR FOR /* 说明游标Scx,将查询结果与Scx建立联系*/SELECT Sno,Cno,GradeFROM SCWHERE Sno=:givensno;
EXEC SQL OPEN Scx;
While(1) /* 用循环结构逐条处理结果集中的记录*/
{EXEC SQL FETCH FROM Scx /* 游标推进一行*/INTO :Msno,:Mcno,:Mgrade; /* 送入主变量,注意每个变量要加分号;*/if (NO_MORE_TUPLES) Break; /* 处理完退出循环*/print("%s,%s,%d\n",sno,cno,g);};if (Mgrade<60) /* 成绩<60*/EXEC SQL DELETE FROM SC WHERE CURRENT OF Scx;Else {if (Mgrade < 70) /* 成绩<70*/EXEC SQL UPDATE SC SET grade = 70 WHERE CURRENT OF Scx;MGrade = 70}Printf("%s,%s,%d",Msno,Mcno,Mgrade); /*显示学生记录*/
EXEC SQL CLOSE Scx; /* 关闭游标*/
};
动态 SQL
动态 SQL 允许程序在运行时构造、提交 SQL 查询。使用动态 SQL 语句时,还可以改进技术;当预备语句组合而成的 SQL 语句只需执行一次, 那么预备语句可以在程序运行时由用户输入才组合起来,但并不执行。
动态 SQL 预备语句格式
EXEC SQL PREPARE <动态SQL语句名> FROM <共享变量或字符串>;
动态 SQL 执行语句格式
EXEC SQL EXECUTE <动态SQL语句名>;
示例4. 动态 SQL 示例
char*query = "UPDATE sc SET Grade = Grade*1.1 WHERE Cno = ?";
EXEC SQL PREPARE dynprog FROM :query;
char cno[5] = "C4";
EXEC SQL EXECUTE dynprog USING :cno;
总结
嵌入式SQL和动态SQL是两种在应用程序中嵌入和使用SQL语句的方法。它们各自具有一定的优势和局限性,适用于不同的场景。开发人员应根据应用程序的具体需求选择合适的方法,并在必要时结合使用这两种方法,以实现最佳的性能和灵活性。
相关文章:
SQL 语言:嵌入式 SQL 和动态 SQL
文章目录 基本概述嵌入式 SQL动态 SQL总结 基本概述 嵌入式SQL和动态SQL是两种在应用程序中嵌入和使用SQL语句的方法。它们都允许开发人员在编程语言中编写SQL语句,以便在应用程序中执行数据库操作。然而,这两种方法在实现方式、性能和灵活性方面存在一…...

Java Object类方法介绍
Object作为顶级类,所有的类都实现了该类的方法,包括数组。 查询Java文档: 1、object.eauqls(): 其作用与 有些类似。 : 是一个比较运算符,而不是一个方法。 ①可以判断基本类型,也可以判断引用类型。 ②若…...

2024 京麟ctf -MazeCodeV1
文章目录 检查代码思路一个字节的指令注意附上S1uM4i佬们的exp https://www.ctfiot.com/184181.html 检查 代码 __int64 __fastcall check_solve(char *a1) {__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64…...

计算机网络基础 - 计算机网络和因特网(1)
计算机网络基础 计算机网络和因特网什么是 Internet?具体构造的的角度服务角度网络结构 网络边缘网络核心电路交换分组交换概述排队时延和分组丢失转发表和路由选择协议按照有无网络层的连接 分组交换 VS 电路交换 接入网DSL 因特网接入电缆因特网接入光纤到户 FTTH无线接入网…...
自学动态规划——零钱兑换
零钱兑换 322. 零钱兑换 - 力扣(LeetCode) 注意几个关键的地方: 因为每次都是找min,所以我们不能将所有元素都初始化为0,不然最后结果一定是0,这里我设置为0x3f3f3f3f,表示无解。当amount0的…...
kafka单机安装及性能测试
kafka单机安装及性能测试 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,并于2011年开源,随后成为Apache项目。Kafka的核心概念包括发布-订阅消息系统、持久化日志和流处理平台。它主要用于构建实时数据管道和流处理应用ÿ…...

2024.05.29学习记录
1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成...
6.10 Libbpf-bootstrap(一,简介)
写在前面 在看完前面的介绍,是不是感觉看了也就看了。但是,如果想要像BCC那样使用libbpf编写BPF程序,该怎么开始呢? 那么这就需要libbpf-bootstrap了。 libbpf-bootstrap是官方推荐的一个范式,就像我们写PPT的模版。简单来说可以简化我们的BPF开发流程,它可以帮助我们…...

2.1.2 基于配置方式使用MyBatis
文章目录 实战目标实战步骤1. 创建Maven项目2. 添加项目依赖3. 创建用户实体类4. 创建用户映射器配置文件5. 创建MyBatis配置文件6. 创建日志属性文件7. 测试用户操作8. 运行测试方法 预期结果实战方法结论 实战目标 本实战的目标是演示如何使用MyBatis框架来操作数据库。通过…...

使用NuScenes数据集生成ROS Bag文件:深度学习与机器人操作的桥梁
在自动驾驶、机器人导航及环境感知的研究中,高质量的数据集是推动算法发展的关键。NuScenes数据集作为一项开源的多模态自动驾驶数据集,提供了丰富的雷达、激光雷达(LiDAR)、摄像头等多种传感器数据,是进行多传感器融合…...

氢燃料电池汽车行业发展
文章目录 前言 市场分布 整车销售 发动机配套 氢气供应 发展动能 参考文献 前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 见《燃料电池发电系统详解》 见《燃料电池电动汽车详解》 市场分布 纵观全球的燃料电池汽车市场,截至2022年底ÿ…...

Linux服务器配置ssh证书登录
1、ssh证书登录介绍 Linux服务器ssh登录有密码登录和证书登录两种。如果使用密码登录,容易遭受密码泄露或者暴力破解,我们可以使用ssh证书登录并禁止使用密码登录,ssh证书登录通过公钥和私钥来完成整个连接过程,公钥保存在服务器…...

端口扫描利器--nmap
目录 普通扫描 几种指定目标的方法 TCP/UDP扫描 端口服务扫描 综合扫描 普通扫描 基于端口连接并响应(真实) nmap -sn 网段(0/24)-sn 几种指定目标的方法 单个IP扫描 IP范围扫描 扫描文件里的IP 扫描网段,(排除某IP) 扫描网段(排除某清单IP) TCP/UDP扫描 -sS …...

React基础知识笔记
Reat简介 React:用于构建用户界面的 JavaScript 库。由 Facebook 开发且开源。是一个将视图渲染为html视图的开源库 第一章:React入门 相关js库 react.development.js :React 核心库react-dom.development.js :提供 DOM 操作的…...

筛选的艺术:数组元素的精确提取
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、筛选的基本概念 二、筛选的实际应用案例 1. 筛选能被三整除的元素 2. 筛选小于特定值…...
SQLServer2022新特性JSON_PATH_EXISTS测试输入 JSON 字符串中是否存在指定的 SQL/JSON 路径
SQLServer2022新特性JSON_PATH_EXISTS测试输入 JSON 字符串中是否存在指定的 SQL/JSON 路径 参考官方文档 https://learn.microsoft.com/en-us/sql/t-sql/functions/json-path-exists-transact-sql?viewsql-server-ver16 1、本文内容 语法参数返回值示例相关内容 适用于&a…...

力扣:104. 二叉树的最大深度
104. 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:…...
嵌入式0基础开始学习 ⅠC语言(3)分支结构
C语言程序设计结构 分三种 顺序结构: 一条一条指令执行。 int a,b; a 3; b 4; 分支结构(选择结构):…...

设计模式21——命令模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 命令模式(Command&…...

虚拟机报错:VMX 进程已提前退出。VMware Workstation 无法连接到虚拟机。
解决报错:VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 VMX 进程已提前退出。 解决方案:右键桌面图标进入VMware Workstation Pro的属性设置,兼容性–勾选“以管理员…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...