普通用户必须通过数据库应用程序来使用
特别复杂的检索结果难以用一条交互式SQL语句完成,此时需要结合高级语言中经常出现的顺序,分支和循环结构帮助处理
嵌入式SQL是将SQL嵌入到某一种高级语言之中,如C/C++,Java等 这种高级语言被称为宿主语言
交互式: select Sname,Sage from Student Where Sname=’张三';
嵌入式(此文宿主语言为C): exec sql select Sname,Sage into :vSname.:vSage from Student where Sname="张三";
在嵌入式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;
变量声明:
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语句在执行过程中,必须有提交和撤销语句才能确认其操作结果
提交: exec sql commit work
撤销: exec sql rollback work
定义:事务是一个存取或改变数据库内容的程序的一次执行,或者说一条或多条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;
游标是指向某检索记录集的指针,通过这个指针的移动,每次读一行,处理一行,再读一行,直到处理完毕
读一行的操作是通过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语句的执行状态,尤其指一些出错状态,有时程序需要知道这些状态并对这些状态进行处理
状态捕获及处理由三部分构成
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为止report_error:exec sqlroollback;
静态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;
定义:ODBC是一种标准—不同语言的应用程序与不同数据库服务器之间通讯的标准
实现:是一组API,应用程序通过调用ODBC API ,可以实现与数据服务器的连接,向数据库服务器发送SQL命令,一条一条的提取数据库检索结果中的元组传送给应用程序的变量,具体的DBMS提供一套驱动程序,即Driver库函数,供ODBC调用,以便实现数据库与应用系统的连接。
应用程序与数据库连接:
ODBC应用前,需要确认具体的DBMS Driver b被安装到ODBC环境中,当应用程序调用ODBC API时,ODBC API会调用具体DBMS Driver 库函数 ,DBMS Driver 库函数则与数据库服务器通讯,执行相应的请求动作并返回检索结果
JDBC是一组Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接与通讯能力
返回主目录返回 Deep Learning 经典网络 model 发展史 目录下一章:深度篇—— Deep Learning 经典网络 model 发展史(二)细说 AlexNet 结构和特点目录内容深度篇—— Deep Learning 经典网络 model 发展史(一)关于model 发展史 图形结构 和 LeNet-5 结构和特点深度篇—— Deep Le...
H - 咸鱼睡觉觉 原题地址 大概题意:emmmmm…… 直接看题:就是在 ai ~bi 间去除ci 只咕咕,问最少的咕咕数。思路分析:涉及到区间,线段树?还是分块?貌似都不好解决。那么如何去做?差分约束。 简单说明一下,首先用 sum[ i ]表示区间的前缀和,那么 sum[ b ]-sum[ a-1 ]就是区间[ a,b ]的和,再看题目的约束条件: sum[ bi ]-s...
--创建一个带参数的存储过程 --创建一个带参数的存储过程 --为指定的员工,涨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作者: 徐...
我们经常需要对view进行圆角设置,有些view是通过设置属性来设置圆角,一般需要用修改view的layer属性。1、直接通过已有属性设置圆角对于UIButton、UITextField等,可以通过对已有属性的设置来显示圆角。UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; UIText
万一需要更换汽车玻璃 下面这些代码就有用了 记好! 不要被经销商给骗喽 用国产汽车玻璃冒充进口汽车玻璃卖给你 。。。 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题意给定一个长度为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中的一个字符。对于每
为什么80%的码农都做不了架构师?>>> ...
文章目录任务描述相关知识编程要求测试说明答案任务描述本关任务:重写 Cat 类中的 toString 方法,返回 Cat 类的基本信息。相关知识在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的内容不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。子类可以根据需要,定义自
返回主目录返回集成学习目录上一章:机器篇——集成学习(五)细说 梯度提升(Gradient Boost)算法下一章:机器篇——集成学习(七)细说 XGBoost 算法本小节,细说 GBDT 算法,下一小节细说 XGBoost 算法二. 具体算法6. GBDT 算法 (Gradient Boosting Decision Tree, GBDT) G...
调用流程:在看显示模块的代码时看到一个函数devm_gpiod_get_index(), 之前没接触过,它的调用如下: devm_gpiod_get_index -> //index为0 gpiod_get_index可以看到devm_gpiod_get_index只是对gpiod_get_index的包装而已,并且index为0。index参数后面会提。函数...
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 ...