嵌入式SQL 您所在的位置:网站首页 嵌入式sql意义及实现方式有哪些特点 嵌入式SQL

嵌入式SQL

2023-11-14 05:04| 来源: 网络整理| 查看: 265

交互式SQL语言的局限性 从使用者角度

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

从SQL本身角度

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

嵌入式SQL特性 定义

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

特性 继承了高级语言的过程控制性结合了SQL语言的复杂结果集操作的非过程性为数据库操作者提供了安全可靠的操作方式:通过应用程序进行操作 和交互式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–>DBMSDB

知识点

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

在嵌入式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 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 库函数则与数据库服务器通讯,执行相应的请求动作并返回检索结果

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有