嵌入式SQL_BigBlackQu的博客-程序员宝宝

技术标签: 数据库  SQL  

交互式SQL语言的局限性

从使用者角度

普通用户必须通过数据库应用程序来使用
使用者角度

从SQL本身角度

特别复杂的检索结果难以用一条交互式SQL语句完成,此时需要结合高级语言中经常出现的顺序,分支和循环结构帮助处理

嵌入式SQL特性

定义

嵌入式SQL是将SQL嵌入到某一种高级语言之中,如C/C++,Java等 这种高级语言被称为宿主语言

特性

  1. 继承了高级语言的过程控制性
  2. 结合了SQL语言的复杂结果集操作的非过程性
  3. 为数据库操作者提供了安全可靠的操作方式:通过应用程序进行操作

和交互式SQL的对比

交互式: select Sname,Sage from Student Where Sname=’张三';
嵌入式(此文宿主语言为C): exec sql select Sname,Sage into :vSname.:vSage from Student where Sname="张三";

  • exec sql:引导SQL语句,提供给C编译器,以便对SQl语句预编译成C编译器可识别的语句
  • into子句: 用于指出接收SQL语句检索结果的程序比那里

高级语言–>嵌入式SQL–>DBMS<—->DB

知识点

宿主语言如何与数据库连接

在嵌入式SQl程序执行之前,首先要与数据库进行连接
连接:exec sql connect to target-server as connect-name user user-name ; or exec sql connect to default;
在嵌入式SQL程序执行之后,需要和数据库断开连接
断开连接:exec sql disconnect connect-name; or exec sql disconnect current;

如何将宿主语言的变量传递给SQL语句

变量声明:

exec sql begin declare section;
     char vSname[10],specName[10]="张三"
     int vSage;
exec sql end declare section;

变量使用:变量可传递给SQL语句的where等字句,以便SQL语言能够按照指定的要求进行检索
exec sql select Sname,Sage into :vSname.:vSage from Student where Sname=:specName;

SQL语句如何执行

SQL语句在执行过程中,必须有提交和撤销语句才能确认其操作结果
提交: exec sql commit work
撤销: exec sql rollback work

事务

定义:事务是一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看做一个事务,一般由应用程序员提出,有开始和结束,结束前需要提交或撤销
事务的特性:

  • 原子性Atoomicity:DBMS能够保证事务的一组更新操作是原子不可分的,要么全做,要么全不做
  • 一致性Consistency: DBMS保证事务的操作状态是正确的
  • 隔离性Isolation:DBMS保证并发的多个事务之间相互不受影响
  • 持久性Durability:DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的

如何将SQL检索到的结构传递回宿主程序进行处理

单行结果处理

检索单行结果,可以讲结果直接传送到宿主程序的变量中

exec sql select [ALL|DISTINCT] expression [,expression...]
     INTO host-variable,[host-variable,...]
     From tableref [corr_name][,tableref[corr_name]...]
     Where search_condition;

eg:exec sql select Sname,Sage into :vSname.:vSage from Student where Sname=:specName;

多行结果处理
游标(Cursor)

游标是指向某检索记录集的指针,通过这个指针的移动,每次读一行,处理一行,再读一行,直到处理完毕
读一行的操作是通过Fetch..into实现的,每一次Fetch,都是先向下移动指针,然后再读取,记录集有结束表示EOF,用来标记后面已经没有记录了
游标的使用需要先定义,再打开,接着一条一条处理,最后关闭
Cursor的定义:

EXEC SQL DECLARE cursor_name CURSOR FOR
     Subquery
     [ORDER BY result_column [ASC|DESC][,result_column...]]
     [FOR [READ ONLY |UPDATE [OF columnname[,columnname....]]]]

eg:

exec sql declare cur_student cursor for
     select Sno ,Sname,Sclass from Student where Sclass=:vClass
     order by Sno
     for read only;

Cursor的打开和关闭
打开: exec sql open cursor_name;
关闭: exec sql close cursor_name;

Cursor的数据读取

exec sql fetch cursor_name
     into host-variable,[host-variable,...]

eg:exec sql fetch cur_student into :vSno,:vSname,:vsAGE

数据库的删除与更新
删除

查找删除:exec sql delete from tablename [corr_name] where search_condition
eg:exec sql delete from customers c where c.city='Harbin' and not exists (select * from orders o where o.cid=c.cid)
定位删除:exec sql delete form tablename [corr_name] where current of cursor_name
eg:

exec sql declare delcust cursor for
     select cid from customers c where c.city='harbin' and not exists(select * from orders o where o.cid=c.cid)
     for update of cid;
exec sql open delcust
while(TRUE){
     exec sql fetch delcust into :cust_id;
     exec sql delete from customers where current of delcust;
}
更新

查找删除:exec sql update tablename [corr_name] SET columname= expr [,columname=expr...] where search_condition
eg:exec sql update student s set sclass='035102' where s.sclass=''034101
定位删除:exec sql update tablename [corr_name] SET columname= expr [,columname=expr...] where current of cursor_name
eg:

exec sql declare stud cursor for
     select * from student s where s.class='034101'
     for update of sclass;
exec sql open stud
while(TRUE){
     exec sql fetch stud into :vSno,:vSname,:vSclass;
     exec sql update student  set sclass='035102' where current of stud;
}
插入

插入:exec sql insert into tablename [(columnname[,columnname,...])] [values (expr[,expr,...])|subqurey]
eg:exec sql into student (sno,sname,sclass) values('03510128','张三',‘035101’)

宿主程序如何知道SQL语句的执行状态,是否发生错误

状态:是指嵌入式SQL语句的执行状态,尤其指一些出错状态,有时程序需要知道这些状态并对这些状态进行处理
状态捕获及处理由三部分构成

  • 设置SQL通信区:exec sql include sqlca ,其中SQLCA是一个已被声明过的具有C语言的结构形式的内存信息区,其中的成员变量用来记录SQL语句的执行状态,便于宿主程序读取与处理
  • 设置状态捕获语句:可设置多次,exec sql whenever condition action;该语句会对气候所有由exec sql语句所引起的对数据库系统的调用自动检查它是否满足条件,condition包括 sqlerror;not found;sqlwarning ,action包括continue;goto;stop;do|call,状态捕获语句Whenever的作用范围是其后的所有exec sql 语句,直到程序中出现另一条相同条件的whenever为止
  • 状态处理语句:某一段程序以应对SQL操作的某种状态report_error:exec sqlroollback;

动态SQL,依据条件动态构造SQL语句,但欲访问的表名和字段对编程者是已知的

静态SQL:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量传送给嵌入式SQL语句即可
eg:

SpecName='张三';
exec sql select Sno,Sname,Sclass into :vSno,:vSname,:vSclass from Student where Sname=:SpecName;

动态SQL:SQL语言可以在程序中动态构造,形成一个字符串,然后再交给DBMS执行,交给DBMS执行时仍然可以传递变量

#include <stdio.h>
exec sql include sqlca;

exec sql begin declare section;
     char user_name="Scott"; char user_pwd[]="tiger";
     char sqltext[]="delete from customers where cid=\'c006\'";
exec sql end declare section;

int main()
{
     exec sql whenever sqlerror goto report_error;
     exec sql connect :user_name identified by :user_pwd;
     exec sql execute  immediate :sqltext;
     exec sql commit release: return 0;

     report_error:print_dberror(); exec sql rollback release :return 1;
}

动态SQL的两种执行方式:
1. 立即执行语句(构造的字符串SQL内部没有变量参数):运行时编译并执行 exec sql execute immediate:host-variable;
2. Prepare-Execute-Using语句(构造的字符串内部有变量参数):Prepare语句先编译,编译后的SQL语句允许动态参数,Execute语句执行,用using语句将动态参数传送给编译好的Sql语句

exec sql prepare sql_temp from :host-variable;
-----
exec sql execute sql_temp using :cond-variable;
数据字典(Data dictionary)
  • 定义:是系统维护的一些视图的集合,存储了数据库中各类对象的定义醒醒,这些信息又称数据库的元数据–关于数据的数据
  • 内容:与关系相关的信息;用户与账户信息;统计与描述性数据;物理文件组织信息;索引相关信息

ODBC(open DataBase Connection)

定义:ODBC是一种标准—不同语言的应用程序与不同数据库服务器之间通讯的标准
实现:是一组API,应用程序通过调用ODBC API ,可以实现与数据服务器的连接,向数据库服务器发送SQL命令,一条一条的提取数据库检索结果中的元组传送给应用程序的变量,具体的DBMS提供一套驱动程序,即Driver库函数,供ODBC调用,以便实现数据库与应用系统的连接。
应用程序与数据库连接:
ODBC应用前,需要确认具体的DBMS Driver b被安装到ODBC环境中,当应用程序调用ODBC API时,ODBC API会调用具体DBMS Driver 库函数 ,DBMS Driver 库函数则与数据库服务器通讯,执行相应的请求动作并返回检索结果

  1. ODBC 首先要分配一个SQL环境,再产生一个数据库连接句柄 connection handle
  2. 应用程序使用SQLConnect(),打开一个数据库连接
  3. 使用SQLExecDirect()向数据库发送SQL命令
  4. 使用SQLFetch()获取产生的结果元组
  5. 使用SQLBindCol()绑定C语言变量与结果中的属性

JDBC(Java DataBase Connetion)

JDBC是一组Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接与通讯能力

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38470851/article/details/80711399

智能推荐

深度篇—— Deep Learning 经典网络 model 发展史(一) 关于 model 发展史 图形结构 和 LeNet-5 结构和特点_deep learning model_万道一的博客-程序员宝宝

返回主目录返回 Deep Learning 经典网络 model 发展史 目录下一章:深度篇—— Deep Learning 经典网络 model 发展史(二)细说 AlexNet 结构和特点目录内容深度篇—— Deep Learning 经典网络 model 发展史(一)关于model 发展史 图形结构 和 LeNet-5 结构和特点深度篇—— Deep Le...

UESTC Training for Graph Theory H 差分约束基础题_looooooogn的博客-程序员宝宝

H - 咸鱼睡觉觉 原题地址 大概题意:emmmmm…… 直接看题:就是在 ai ~bi 间去除ci 只咕咕,问最少的咕咕数。思路分析:涉及到区间,线段树?还是分块?貌似都不好解决。那么如何去做?差分约束。 简单说明一下,首先用 sum[ i ]表示区间的前缀和,那么 sum[ b ]-sum[ a-1 ]就是区间[ a,b ]的和,再看题目的约束条件: sum[ bi ]-s...

oracle创建一个带参数的存储过程:为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水_orcale创建带参数的过程_笔记_blog的博客-程序员宝宝

--创建一个带参数的存储过程 --创建一个带参数的存储过程    --为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水  /*    begin        raisesalary(6755);      raisesalary(4456);        commit();//这里提交,所以说我们一般不会在存储过程或者存储函数中写提交,    end;    /  */  --h...

数据结构基础知识练习_辣莫帅的博客-程序员宝宝

1-1对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。 (1分)T1-2若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。T(2 分)1-3对于顺序存储的长度为N的线性表,删除第一个元素和插入最后一个元素的时间复杂度分别对应为O(1)和O(N)。 (1分)T F作者: 徐...

UIView设置圆角、边框和阴影_OnnePiece的博客-程序员宝宝

我们经常需要对view进行圆角设置,有些view是通过设置属性来设置圆角,一般需要用修改view的layer属性。1、直接通过已有属性设置圆角对于UIButton、UITextField等,可以通过对已有属性的设置来显示圆角。UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];   UIText

看看玻璃代码,就知道你的车窗玻璃是谁造的_Adub的博客-程序员宝宝

 万一需要更换汽车玻璃 下面这些代码就有用了 记好! 不要被经销商给骗喽 用国产汽车玻璃冒充进口汽车玻璃卖给你 。。。 E000184 Saint-Gobain Sekurit Deutschland GmbH&Co.KG E000185 Saint-Gobain Sekurit Deutschland GmbH&Co.KG E000186 Saint-Gobain Sekur

随便推点

CF1609 E. William The Oblivious_cf 1609e_MoYan1082的博客-程序员宝宝

CF1609 E. William The Oblivious题意给定一个长度为nnn的字符串sss,字符串内只含有a,b,ca,b,ca,b,c三种字符,即∀i,s[i]\forall i,s[i]∀i,s[i]为a,b,ca,b,ca,b,c中一个。有qqq次询问,每次询问会将s[pos]s[pos]s[pos]修改成vvv,即s[pos]=vs[pos]=vs[pos]=v。你可以进行一种操作,使得任意一个位置的s[i]s[i]s[i]转变成a,b,ca,b,ca,b,c中的一个字符。对于每

PHP保存远程图片_weixin_33905756的博客-程序员宝宝

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

Educoder–Java 第1关:学习-Java继承和多态之方法重写_NEO ME的博客-程序员宝宝

文章目录任务描述相关知识编程要求测试说明答案任务描述本关任务:重写 Cat 类中的 toString 方法,返回 Cat 类的基本信息。相关知识在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的内容不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。子类可以根据需要,定义自

机器篇——集成学习(六) 细说 GBDT 算法_万道一的博客-程序员宝宝

返回主目录返回集成学习目录上一章:机器篇——集成学习(五)细说 梯度提升(Gradient Boost)算法下一章:机器篇——集成学习(七)细说 XGBoost 算法本小节,细说 GBDT 算法,下一小节细说 XGBoost 算法二. 具体算法6. GBDT 算法 (Gradient Boosting Decision Tree, GBDT) G...

devm_gpiod_get_index用法_canwang0的博客-程序员宝宝

调用流程:在看显示模块的代码时看到一个函数devm_gpiod_get_index(), 之前没接触过,它的调用如下:  devm_gpiod_get_index -&gt; //index为0    gpiod_get_index可以看到devm_gpiod_get_index只是对gpiod_get_index的包装而已,并且index为0。index参数后面会提。函数...

Filter method example_dianzhouyu2189的博客-程序员宝宝

The ScalaListclassfiltermethod implicitly loops over the List/Seq you supply, tests each element of the List with the function you supply. Your function must return true or false, and filter ...

推荐文章

热门文章

相关标签