【SQL】一文详解嵌入式SQL(建议收藏)

news2024/11/20 0:36:29

在这里插入图片描述

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。


💅文章概要: 嵌入式SQL(Embedded SQL) 是应用系统使用编程方式来访问和管理数据库中数据的主要方式之一


🤟每日一言: 保护好你的梦想,等到它开花结果的那天,它会让你俯视所有曾经看低你的人。


目录

    • 嵌入式SQL概述
    • 使用嵌入式SQL的注意事项
      • 区分SQL语句与主语言语句
      • 数据库工作单元和程序工作单元之间的通信
      • 协调两种不同的处理方式
    • 嵌入式SQL程序的组成
      • 程序首都
      • 程序体
    • 在嵌入式SQL中使用游标检索多个元组
      • 游标定义语句
      • 游标打开语句
      • 游标推进语句
      • 游标关闭语句
    • 嵌入式SQL程序实例
    • 写在最后


嵌入式SQL概述

在这里插入图片描述

  嵌入式SQL(Embedded SQL) 是应用系统使用编程方式来访问和管理数据库中数据的主要方式之一。
  SQL语言有两种使用方式:一种是作为独立语言,以交互式方式使用,在这种方式下使用的SQL语言是面向集合的描述性语言,是非过程化的。即大多数语句都是独立执行,与上下文无关的。另一种是嵌入到某种高级语言中使用,利用高级语言的过程化结构来弥补SQL语言在实现诸如流程控制等复杂应用方面的不足。这种方式下使用的SQL语言称为嵌入式SQL( Embedded SQL),能嵌入SQL的高级语言称为主语言(Host Language)或宿主语言。目前SQL标准中指定的宿主语言主要有C、C++、COBOL、Pascal、Java、PL/I和FORTRAN等
  对于嵌入式SQL, DBMS一般采用预编译的方法,即由DBMS的预处理程序对源程序进行扫描识别出SQL语句,并把它们转换成主语言中相应的调用语句,成为主语言源程序,以使主语言编译程序能够识别它们,最后由主语言的编译程序将它编译成目标代码,如下图所示。

源程序
主语言+SQL
预编译
系统
主程序
源系统
主语言
编译系统
目标代码

使用嵌入式SQL的注意事项

  把SQL嵌入主语言使用时必须要解决下面几个问题:

区分SQL语句与主语言语句

  主要通过在所有的SQL语句前加前缀EXEC SQL来解决。SQL语句一般以分号(;) 作为结束的标志

EXEC SQL <SQL语句>;

数据库工作单元和程序工作单元之间的通信

  嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据。把SQL语句中使用的主语言程序变量简称为主变量共享变量
  主变量根据其作用的不同,分为输入主变量输出主变量。输入主变量由应用程序对其赋值,SQL语句引用;输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序。一个主变量有可能既是输入主变量又是输出主变量。在SQL语句中使用主变量时,需在主变量名前加冒号(:)作为标志,以区别于数据库对象的表名或属性名(字段名)。
  SQL语句执行后,系统要反馈给应用程序若干信息,这些信息被送到称为SQL的通信区的SQLCA中。SQLCA用语句EXEC SQL INCLUDE加以定义。SQLCA 是一个数据结构,SQLCA中有一个存放每次执行SQL语句后返回代码的状态指示变量SQLCODE。当SQLCODE为零时,表示SQL语句执行成功,否则返回一个错误代码(负值)警告信息(正值)


协调两种不同的处理方式

  一般情况下,一个SQL查询一次可以检索多个元组(面向集合),而主语言程序通常是"一次一个元组"(面向记录)处理,为此必须协调这两种不同的处理方式,目前大多使用游标(curor)技术来进行协调,关于游标的定义和使用方法将在稍后阐述。


在这里插入图片描述

嵌入式SQL程序的组成

  一个带有嵌入式SQL的程序一般包括两大部分:程序首都和程序体 。程序首都是由一些说明性语句组成,而程序体则由一些可执行语句组成。

程序首都

  程序首部主要包括的语句有:
  ①声明段:用于定义主变量。主变量既可以被主语言语句使用,也可以被SQL语句使用,所以也称共享变量。主变量在EXEC SQL BECIN DECLARE SECTION; EXEC SQL END DECLARE SECTION;之间进行说明。
  ②定义SQL通信区:使用EXEC SQL INCLUDE SQLCA语句定义用于在程序和DBMS之间通信的通信区。SQLCA中包含两个通信变量SQLCODESQLSTATESQLCODE变量是一个整数变量,当执行了数据库命令之后,DBMS会返回一个SQLCODE值。如果这个值是0,则表明DBMS已成功执行此语句。如果SQLCODE>0,则表明在该查询结果中没有的更多可用的数据(记录)。如果SQLCODE<0,则表明出现了错误。SQLSTATE 是一个带有5 个字符的字符串。如果SQLSTATE的值为00000则表示没有错误或异常;如果是其他值,就表明出现了错误或异常。
  ③其他说明性语句


程序体

  程序体由若干个可执行的SQL语句和主语言语句组成。包括建立和关闭与数据库连接的语句。
  建立与一个数据库连接的SQL命令如下:

EXEC SQL CONNECT TO <服务器名> AS <连接名> AUTHORIZATION <用户账户名和口令>;

  或者如下:

EXEC SQL CONNECT:<用户名> identified by:<用户口令> using:<数据库服务器路径>;

  一般情况下 ,由于一个用户或程序可以访问多个数据库服务器,因此可以建立多个连接,但是任何时刻只能有一个连接是活动的。用户可以使用<连接名>将当前活动的连接转换为另一个连接,命令如下:

EXEC SQL SET CONNECTION <连接名>;

  如果不再需要某个连接了,可以使用如下命令终止这个连接:

EXEC SQL DISCONNECT <连接名>;

在嵌入式SQL中使用游标检索多个元组

在这里插入图片描述

  一般来说,一个SQL查询一次可以检索多个元组,而主语言程序通常是"一次一个元组"处理,可以使用游标协调这两种不同的处理方式
  与游标相关的SQL语句有下列四个:

游标定义语句

EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT语句>;

游标打开语句

EXEC SQL OPEN <游标名>;

游标推进语句

EXEC SQL FETCH <游标名> INTO [<:主变量名>[,<:主变量名>]...];

游标关闭语句

EXEC SQL CLOSE <游标名>;

嵌入式SQL程序实例

  下面使用一个案例来对嵌入式SQL进行一个讲解,帮助读者更好地理解嵌入式 SQL的使用,在本案例中使用的宿主语言为C语言

  案例需求: 现有一数据库,内含一张数据库表customers,表中主要存储了客户的专属折扣和id号。每个客户有且只有一个专属折扣,即在表中每条数据都是唯一的。在C语言中使用嵌入式SQL语句,输入相关客户的id号,查找输出数据库的customer表中相关客户的信息,数据库用户名和服务器名均为175_178_184_206

#include<stdio.h>
#include"prompt.h"
exec sql include sqlca; --sqlca 表示SQL的通信区, communication area

char cid_prompt[]="please enter customer id:";--输入查询的客户编号变量cid
int main()
{
    exec sql begin declare section; --下面声明变量
    char cust_id[5], cust_name[14];--客户id号和客户姓名
    float cust_discnt;--客户折扣
    exec sql end declare section;

    exec sql whenever sqlerror goto report_error;-- 错误捕获
    exec sql whenever not found goto notfound;  -- 记录没有找到

    exec sql connect:"customer" identified by:"xxxxxx" using:"url";  -- 连接数据库
    --另注:因为隐私保密原因
    --在此数据库密码使用了xxxxxx代替
    --数据库服务器路径使用了url代替
    --实际使用时根据自己需求替换
    while((prompt(cid_prompt,1,cust_id,4))>=0){
        exec sql select cname,discnt into :cust_name,:cust_discnt
        from customers where cid=:cust_id; -- 根据输入的客户id 找到名字和折扣

        exec sql commit work;-- 提交
        printf("customer's name is %s and discount 
        is %.1f\n",cust_name, cust_discnt);
        continue; -- 接着循环,再输入客户id 
    notfound:printf("can't find customer %s, continuing\n", cust_id);}
    exec sql commit release; -- 断开数据库的连接
    return 0;
    report_error:  -- 前面报错的执行
        print_dberror();--打印报错
        exec sql rollback release; -- 断开连接
        return 1;
}

写在最后

  非常感谢大家能看到最后!码文不易!希望能得到各位大佬的三连+关注支持一波!
  你们的支持是我更新的最大动力!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLMap 扫描利用SQL注入

一、SQLMap介绍 SQLMap 是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描、发现并利用给定URL的SQL注入漏洞&#xff0c;内置了很多绕过插件&#xff0c;支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Fir…

光伏行业管理亟待变革,数商云供应链系统订单流程自动化流转助力企业降本增效

作为实现“3060”双碳目标的主力军&#xff0c;光伏产业正迎来空前的政策、市场、资本三重加持的红利期。有业内人士预测&#xff0c;到2025年全球新增光伏装机量将达到270-330GW&#xff0c;国内新增光伏装机量将达到90-110GW&#xff0c;十四五期间年均新增光伏装机量将达到7…

用React做一个音乐播放器

介绍 任何正在学习 React 并想使用 React 构建项目的人。有各种博客和文章可以为开发人员指导此类项目。我确实浏览过这些文章&#xff0c;但其中总是缺少一种项目。缺少的项目是音乐播放器和视频播放器。这两个项目都会让您有机会处理音频和视频。您将学到很多东西&#xff0…

Linux学习-97-vmware网络桥接模式配置和vmware快照操作

19.3 vmware网络桥接模式配置 桥接&#xff1a;需要保证Linux虚拟机和本机处在同一个网段&#xff01; #win平台输入ipconfig查看主机的ip地址Linux也必须要配置到对应的网段 桥接模式&#xff1a;主机ip 和虚拟机ip映射到同一块物理网卡&#xff08;光纤&#xff0c;无线…

达梦数据库-centos7安装

参考官方文档 1.环境 操作系统CPU数据库CentOS7x86_64dm8_20221121_x86_rh6_64.iso 2.安装前准备 2.1 关闭防火墙 或 开放5236端口 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 开放5236端口&#xff08;推荐使用&#xff09; firewall-cmd --pe…

TYPE A USB2.0电路设计

TYPE A USB2.0连接器可以分为公座和母座&#xff0c;放在供电端PCB板上的一般是母座&#xff0c; 2.0的母座有四个信号引脚。今天就来和大家分享下TYPE A USB2.0的板级电路设计&#xff0c; 首先来看到 TYPE A USB2.0四个引脚的信号定义&#xff0c;1脚是VBUS&#xff0c;需要…

Kafka系列之入门(荣耀典藏版)

目录 一、为什么要用消息中间件&#xff1f; 1、异步处理 2、应用解耦 3、流量削峰 4、日志处理 二、为什么选择Kafka&#xff1f; 消息中间件的编年史 1、Kafka的外在表现和内在设计 2、市场主流消息中间件对比 三、Kafka中的基本概念 1、消息和批次 2、主题和分区…

【笔记:模拟CMOS集成电路】两级运算放大器设计与仿真(带版图)

【笔记&#xff1a;模拟CMOS集成电路】两级运算放大器设计与仿真&#xff08;带版图&#xff09;前言1.电路分析1.1电路结构电路描述&#xff1a;1.2小信号分析1.3公式2指标设计2.1预期设计指标参数2.2参数分析(1)确定gm1、gm6(2)分配电流(3)确定M1尺寸(4)确定M6尺寸(5)共模输入…

学习.NET MAUI Blazor(二)、MAUI是个啥

随着.NET 7的发布&#xff0c;MAUI也正式发布了。那么MAUI是个啥&#xff1f;我们先来看看官方解释&#xff1a; .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 目录关于MAUIMAUI的工作原理如何开发MAUI该如何选择…

5万字企业数字化运营管理平台软件开发框架项目技术方案

目录 1 项目总体概述 项目总体技术方案保障 系统设计 系统体系结构设计 系统指标保障 系统质量 系统健壮性 系统应具备安全性 系统易用性 系统可维护性 系统完备性 系统可扩展性 系统可测试性 系统可移植性 系统可追踪性 系统易安装性 2 项目技术方案 2.1 系统…

没有的博客1

我虽不善言辞 但关于爱你 我无法掩饰 关于我爱你音频&#xff1a;00:0004:55 | 01 | 愿你们是渣的那一方 背负所有骂名愉快生活 而不是在深夜痛哭 辗转反侧茶饭不思 做一个痛苦的好人 | 02 | 昨晚喜欢的男孩子发了新女友的照片 很难过 做个大人真好啊 十分钟就能让自…

Linux上RabbitMQ安装使用

文章目录安装安装erlang安装rabbitMQ管理指令安装 官网 由于需要对应erlang和rabbitMQ两者版本的关系&#xff0c;先确定好下载哪个版本&#xff0c;版本关系表&#xff0c;以下教程以Erlang 23.3.4.11和RabbitMQ 3.9.14为例 安装erlang 略&#xff0c;进入对应版本下载安装…

【YApi接口管理平台】在Linux上使用Docker搭建YApi (亲测完美运行)

本期目录前言1. 创建MongoDB容器数据卷2. 安装Node.js3. 拉取MongoDB镜像4. 启动Mongo容器5. 拉取YApi镜像6. 初始化YApi7. 运行YApi容器8. 访问前言 博主想在自己的 Linux 虚拟机上使用 Docker 搭建 API 接口管理平台来团队开发一个项目&#xff0c;跟着网上的教程硬是装了好…

Unreal Engine的编译类型和命名规则

目录 编译类型 命名规则 资源命名规则 文件夹命名规则 编译类型 debug game只能调试你的项目&#xff0c;不能调试编辑器项目 多加了一个editor&#xff0c;就可以调试编辑器了。 不同的编译类型可以理解为引擎在不同的类型下的监管程度&#xff0c;用以不同的场景 Te…

树莓派驱动水星无线网卡(MW150UH)教程指南

目录 1.树莓派版本 2.无线网卡 查询无线网卡 1.如果为 Bus 001 Device 005: ID 0bda:b711 Realtek Semiconductor Corp. RTL8188GU 802.11n WLAN Adapter (After Modeswitch) 2.如果为 Bus 001 Device 007: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapte…

深度学习计算广告(更新中)

本文转自王喆的《深度学习计算广告》&#xff0c;仅用于学习。 文章目录一、计算广告系统简介二、经典的广告系统架构三、dl时代广告系统各模块技术演进1. Ad Ranking - 从大刀阔斧的革命到精雕细琢的改进&#xff08;1&#xff09;模型发展图&#xff08;2&#xff09;张俊林&…

STL之list模拟实现

list常识 list迭代器不支持【】&#xff0c;所以不支持随机访问。也不支持>、<&#xff0c;没有意义&#xff0c;因为iterator是地址&#xff0c;地址并不连续。 重要的说三遍&#xff1a; list不支持随机访问&#xff0c;因为没有重写[]。 list不支持随机访问。 list不…

vue3+ts项目 笔记总结

一、首先得先建好vue3ts的项目&#xff1a; 在终端新建项目输入&#xff1a;vue create vue3-ts接下来的每一步如图所示&#xff1a;注意要通过空格选中TypeScript二、项目建好后&#xff0c;开始正常的开发&#xff0c;注意区分vue2与vue3的区别&#xff1a; 在vue3项目中不…

移动设备软件开发-Spape详解

Spape详解 1.自定义背景shape 1.1gradient 1.简介 定义渐变色&#xff0c;可以定义两色渐变和三色渐变&#xff0c;及渐变样式&#xff0c;它的属性有下面几个2.属性 angle&#xff0c;只对线性渐变是有效的放射性渐变必须指定放射性的半径&#xff0c;gradientRadiouscentetX和…

(一)汇编语言——基础知识

目录 基础知识 总线 地址总线 数据总线 控制总线 内存地址空间 总结 今天我们就开始学习有关汇编的相关知识了&#xff0c;感觉和之前学的STM32相类似&#xff0c;所以学习起来并没有感觉很困难&#xff0c;相反&#xff0c;感觉有点好玩&#xff0c;并且理解了底层原理…