3.7 嵌入式SQL
可以放入所有高级语言中去,如C
因为,SQL是过程性语句,需要高级语言的非过程性处理集合的分类处理
一、一般形式
- 所有的SQL语句都必须加前缀EXEC SQL
- SQL语句完成结束标志(;或END EXEC)
EXEC SQL<SQL语句>;
EXEC SQL<SQL语句> END EXEC
例:
EXEC SQL drop table Student;
二、嵌入式SQL语言与主语言之间的通信
- 向主语言传递SQL语言的执行状态信息,使主语言能够根据此信息控制程序流程,主要使用SQL通信区(SQLCA);
- 主语言向SQL语句提供参数,主要用主变量实现;
- 将SQL语句查询数据库结果交主语言进行处理,主要用主变量和游标实现。
1.SQL通信区(SQLCA)
1)用EXEC SQL INCLUDE SQLCA进行定义;
2)每执行完一条SQL语句应测试返回代码SQL CODE的值,以了解执行情况并做相应处理
SQLCODE
=0:SQL语句执行成功,并满足条件的记录;
=100:SQL语句处理完最后一条满足条件的记录或者是数据库中没有满足条件的记录;
<0:SQL语句执行出错
2.主变量
主变量:SQL语句中使用的主语言程序变量
指示变量:指示变量的值或条件
- 必须在SQL语句BEGIN DECLARE SECTION与END DECLARE SECTION之间进行说明;
- 主变量可以在SQL语句中任一能够使用表达式的地方出现
- SQL语句中的主变量名前要加上冒号(:)作为标志,与数据库对象区别
- SQL语句之外,主变量和指示变量可以直接引用
3.游标:
用来协调SQL语言和主语言之间的处理速度失调问题(SQL语言:面向集合,可产生或处理多条记录 主语言:面向记录,只能存放一条记录)
系统为用户开设的一个数据缓冲区,存放SQL语句的结果。每个游标区都有一个名字,用户可通过游标逐一获取记录,并赋予主变量,交给主语言进一步处理
例:
exec sql include salca;
exec sql bedin declare section;
char Sno(5);
char Cno(3);
int Grade;
exec sql end declare section;
main()
{
exec sql declare c1 cursor for select Sno,Cno,Grade from SC;
exec sql open c1;
for(;;)
{
exec sql fetch c1 into :Sno,:Cno,:grade;
if(sqlCode!=0)
break;
printf("Sno:%s,Cno:%s,Grade:%d\n",:Sno,:Cno,:Grade);
}
exec sql chose c1;
}
三、不用游标的的SQL语言
- 说明性语句
exec sql begin declare section;
exec sql end declare section;
- 数据定义语句
exec sql create...
exec sql drop...
- 数据控制语句
exec sql grant...
exec sql revoke...
- 查询结果为单记录的select语句
1)用into子语句制定查询结果的存放变量
2)into语句,where语句,having短语中均可使用主变量
3)查询结果若为多记录则出错
exec sql select Sno,Sname,Sage,Sdept into:Sno,:Sname,:Sage,:Sdept from SC where Sno=: give Sno and Cno=:give Cno;
- 非current形式的update语句
exec sql update SC set Grade=Grade+:raise where Cno='';
exec sql update Student set Sage=null where Sdept='CS'
- 非current形式的delete语句
exec sql delete from SC where Sno=(select Sno from Student where Sname=:stdna);
- insert语句
gradeid=-1; 指示变量
exec sql insert into SC(Sno,Cno,Grade) values (:Sno,:Cno,:Grade,:gradeid);
四、使用游标的SQL语言
- 查询结果为多条结果的select语句
exec sql begin declare section;
...
exec sql end declare section;
...
exec sql declare SX cursor for select Sno,Sname,Sage,Ssex from Student where Sdept =:deptname;//说明游标
while(gets(deptname)!=null)
{
exec sql open SX;//打开游标
while(1)
{
exec sql fecth SX into :Sno,:Sname,:Sage,:Ssex;//推进游标指针并取当前记录
if(sqlcode=100)
break;
}
if (sqlcode<0)
{printf("error\n");
break;
}
...
};
exec sql close SX;//关闭游标
};
...
- current形式的update和delete语句
exec sql begin declare section;
...
exec sql end declare section;
...
Gets(deptname);
exec sql declare SX cursor for select Sno,Sname,Sage,Ssex from Student where Sdept=:deptname for update of Sage;//声明游标
exec sql open SX;//打开游标,进入缓冲区
while(1)
{
exec sql fetch SX into :Sno,:Sname,:Sage,:Ssex;//推进游标指针并取当前记录
if(sqlcode!=0)break;
printf("%s,%s,%d,%s\n",Sno,Sname,Sage,Ssex);
printf("update age?\n");
scanf("%c",&yn);
if(yn='y' or yn='Y')
{
print ("input new age;");
scanf("%d",&newage);
exec sal update Student set Sage =:newage where current of SX;
};
...
};
exec sql close SX;//关闭游标
...
3.7 嵌入式SQL的更多相关文章
- C语言中嵌入式SQL语句
原文:[转载]C语言中嵌入式SQL语句 http://blog.csdn.net/cnlht/archive/2007/12/12/1930960.aspx原文地址 实验内容: 掌握SQL Serve ...
- 嵌入式SQL
一.包含嵌入式SQL 程序的处理过程 由预处理程序对源程序进行扫描,识别出ESQL语句 把它们转换成主语言的函数调用语句,使主语言编译程序能够识别 最后由主语言的编译程序将整个源程序编译成目标码 ...
- SQL入门(4): 嵌入式SQL语言
本节讲述内容: 1.嵌入式SQL 语言概述 2.变量声明与数据库连接 3.数据集与游标 4.可滚动游标与数据库的增删改 5.状态捕捉以及错误处理机制 (一)嵌入式SQL语言 之前我们所学的都是交互式S ...
- 第14讲:嵌入式SQL语言(基本技巧)
一.交互式SQL的局限 & 嵌入式SQL的必要性 专业人员(如DBA)可以熟练地运用交互式SQL语言,但普通用户却不是那么容易上手,所以需要通过数据库应用程序来使用数据库.编写一个可以与数据库 ...
- 数据库原理及应用-SQL数据操纵语言(Data Manipulation Language)和嵌入式SQL&存储过程
2018-02-19 18:03:54 一.数据操纵语言(Data Manipulation Language) 数据操纵语言是指插入,删除和更新语言. 二.视图(View) 数据库三级模式,两级映射 ...
- 什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查
1 什么是Pro*C/C++ 1.通过在过程编程语言C/C++中嵌入SQL语句而开发出的应用程序 2.什么是嵌入式SQL 1.在通用编程语言中使用的SQL称为嵌入式SQL 2.在SQL标准中定义 ...
- 数据库系统学习(十)-嵌入式SQL语言之动态SQL
第十讲 嵌入式SQL语言之动态SQL 静态SQL 区别变量和属性:高级语言向嵌入式SQL传递变量的方法 动态SQL 动态构造SQL语句是应用程序员必须掌握的重要手段 SQL语句的动态构造示例 根据界面 ...
- 数据库系统学习(九)-嵌入式SQL语言之基本技巧
第九讲 嵌入式SQL语言之基本技巧 901 什么是嵌入式SQL语言 交互式SQL语言的局限性 嵌入式SQL语言 交互式和嵌入式语言的对比 高级语言中使用嵌入式语言需要解决的问题 902 程序与数据库连 ...
- 数据库-第八章 数据库编程-8.1 嵌入式SQL
嵌入式SQL 一.嵌入式SQL的处理过程 1.嵌入式SQL语句的基本格式 2.嵌入式SQL的处理过程 3.主语言访问数据库的基本步骤 ⅰ建立数据库连接 ⅱ定义必要的主变量和数据通信区 ⅲ访问数据库并返 ...
随机推荐
- VBA中自定义类和事件的(伪)注册
想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...
- [数据结构与算法]栈Stack的多种实现
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- python_way day13 sqlalchemy
sqlalchemy 一对多 多对多 1.一对多 一.#创建表结构 class Host(Base): #所有的子类都继承这个基类 #创建表结构 __tablename__ = 'hosts' id ...
- iOS - Swift Closure 闭包
1.Closure 闭包在 Swift 中非常有用.通俗的解释就是一个 Int 类型里存储着一个整数,一个 String 类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很 ...
- mysql存入数据出错总结
ELECT t0.accusation_des, t0.submit_time, t0.result, t0.handle_time, t1.content, t4.nick_name,t5.cont ...
- poj1375Intervals(点到圆的切线)
链接 貌似这样的叫解析几何 重点如何求得过光源到圆的切线与地板的交点x坐标,可以通过角度及距离来算,如图, 根据距离和半径可以求得角度a.b.r,自然也可以求得d1,d2. 至于方向问题,在求r得时候 ...
- Python学习笔记8—语句
条件语句 有的程序里写的是 /usr/bin Python,表示 Python 解释器在/usr/bin 里面.但是,如果写成 /usr/bin/env,则表示要通过系统搜索路径寻找 Python 解 ...
- (一)解决Sublime Text 2中文显示乱码问题
欲解决问题,关键在于让Sublime Text 2支持GB2312和GBK.步骤如下: 1.安装Sublime Package Control. 在Sublime Text 2上用Ctrl+-打开 ...
- java.lang.UnsupportedClassVersionError: org/sonatype/nexus/bootstrap/jsw/JswLauncher : Unsupported major.minor version 51.0
jdk 版本不对,需要修改jdk的版本
- openSUSE 国内镜像和镜像使用帮助 (zhuan)
https://my.oschina.net/u/2475751/blog/631036?p={{currentPage-1}} https://lug.ustc.edu.cn/wiki/mirror ...