- 浏览: 864329 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
第六章 嵌入式SQL(E-SQL)简介
第一节 什么是嵌入SQL语言?
SQL是一种双重式语言,它既是一种用于查询和更新的交互式数据库语言,又是一种应用程序进行数据库访问时所采取的编程式数据库语言。SQL语言在这两种方式中的大部分语法是相同的。在编写访问数据库的程序时,必须从普通的编程语言开始(如C语言),再把SQL加入到程序中。所以,嵌入式SQL语言就是将SQL语句直接嵌入到程序的源代码中,与其他程序设计语言语句混合。专用的SQL预编译程序将嵌入的SQL语句转换为能被程序设计语言(如C语言)的编译器识别的函数调用。然后,C编译器编译源代码为可执行程序。
各个数据库厂商都采用嵌入SQL语言,并且都符合ANSI/ISO的标准。所以,如果采用合适的嵌入SQL语言,那么可以使得你的程序能够在各个数据库平
台上执行(即:源程序不用做修改,只需要用相应数据库产品的预编译器编译即可)。当然,每个数据库厂商又扩展了ANSI/ISO的标准,提供了一些附加的
功能。这样,也使得每个数据库产品在嵌入SQL方面有一些区别。本章的目标是,对所有的数据库产品的嵌入SQL做一个简单、实用的介绍。
当然,嵌入SQL语句完成的功能也可以通过应用程序接口(API)实现。通过API的调用,可以将SQL语句传递到DBMS,并用API调用返回查询结果。这个方法不需要专用的预编译程序。
1.1 嵌入SQL程序的组成元素
我们以IBM的DB2嵌入SQL为例,来看看嵌入SQL语句的组成元素。
例1、连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; (1)
main()
{
EXEC SQL BEGIN DECLARE SECTION; (2)
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample; (3)
EXEC SQL SELECT FIRSTNME INTO :firstname (4)
FROM employee
WHERE LASTNAME = 'JOHNSON';(4)
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET; (5)
return 0;
}
上面是一个简单的静态嵌入SQL语句的应用程序。它包括了嵌入SQL的主要部分:
(1)中的include SQLCA语句定义并描述了SQLCA的结构。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。
(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了宿主变量。宿主变量可被SQL语句引用,也可以被C语言语句引用。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。在SQL语句中,主变量前均有“:”标志以示区别。
(3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上。这时,应该保证数据库实例已经启动。
(4)是一条选择语句。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在
firstname变量中。该语句返回一个结果。可以通过游标返回多个结果。当然,也可以包含update、insert和delete语句。
(5)最后断开数据库的连接。
从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“\”。
1.2 什么是静态SQL和动态SQL?
嵌入SQL语言,分为静态SQL语言和动态语言两类。静态SQL语言,就是在编译时已经确定了引用的表和列。宿主变量不改变表和列信息。可以使用主变量改变查询参数值,但是不能用主变量代替表名或列名。
动态SQL语言就是:不在编译时确定SQL的表和列,而是让程序在运行时提供,并将SQL语句文本传给DBMS执行。静态SQL语句在编译时已经生成执行
计划。而动态SQL语句,只有在执行时才产生执行计划。动态SQL语句首先执行PREPARE语句要求DBMS分析、确认和优化语句,并为其生成执行计
划。DBMS还设置SQLCODE以表明语句中发现的错误。当程序执行完“PREPARE”语句后,就可以用EXECUTE语句执行执行计划,并设置
SQLCODE,以表明完成状态。
1.3 什么是SQLCA?
应用程序执行时,每执行一条SQL语句,就返回一个状态符和一些附加信息。这些信息反映了SQL语句的执行情况,它有助于用户分析应用程序的错误所在。这
些信息都存放在sqlca.h的sqlca结构中。如果一个源文件中包含SQL语句,则必须要在源程序中定义一个SQLCA结构,而且名为SQLCA。最
简单的定义方法是在源文件中加入一些语句:EXEC SQL INCLUDE sqlca.h。每个数据库产品都提供了SQLCA结构。 1.4
什么是SQLDA?
我们知道,动态SQL语句在编译时可能不知道有多少列信息。在嵌入SQL语句中,这些不确定的数据是通过SQLDA完成的。SQLDA的结构非常灵活,在
该结构的固定部分,指明了多少列等信息,在该结构的后面有一个可变长的结构,说明每列的信息。在从数据库获得数据时,就可以采用SQLDA来获得每行的数
据。各个数据库产品的SQLDA结构都不完全相同。
第二节 SYBASE SQL Server嵌入式SQL语言
2.1 一个嵌入SQL语言的简单例子
我们首先来看一个简单的嵌入式SQL语言的程序(C语言):用sa(口令为password)连接数据库服务器,并将所有书的价格增加10%。这个例子程序如下:
例1、
/*建立通讯区域*/
Exec sql include sqlca;
main()
{
/*声明宿主变量*/
EXEC SQL BEGIN DECLARE SECTION;
char user[30],passwd[30];
EXEC SQL END DECLARE SECTION;
/*错误处理*/
EXEC SQL WHENEVER SQLERROR CALL err_p();
/*连接到SQL SERVER服务器*/
printf("\nplease enter your userid ");
gets(user);
printf("\npassword ");
gets(passwd);
exec sql connect :user identified by :passwd;
exec sql use pubs2;
EXEC SQL update titles set price=price*1.10;
EXEC SQL commit work;
/*断开数据库服务器的连接*/
Exec sql disconnect all;
return (0);
}
/*错误处理程序*/
err_p()
{
printf("\nError occurred: code %d.\n%s", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
}
从上面这个例子,我们看出嵌入SQL的基本特点是:
1、每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。
2、如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“\”,在Fortran中必须有续行符。其他语言也有相应规定。
3、每一条嵌入SQL语句都有结束符号,如:在C中是“;”。
4、嵌入SQL语句的关键字不区分大小写。
5、可以使用“/*….*/”来添加注释。也可以使用“--”来添加注释。
2.2 嵌入SQL的处理过程
嵌入SQL的处理过程如下图所示: 图6-1 SYBASE SQL SERVER嵌入SQL程序处理过程
嵌入SQL程序的后缀为.cp。嵌入SQL处理的第一步是预编译。预编译器(cpre.exe)处理过程分为两个小步:
第一小步:语法分析。检查嵌入SQL语句的语法正确性。
第二小步:增加一些预编译器变量,并注释了所有的嵌入的SQL语句,将嵌入SQL语句转换为对client-library中函数的调用(注意:在连接
时,编译后的代码需要使用client-library中的库文件)。如果在编译时,设置一些选项,则生成存储过程。预编译后可能产生3个文件:一个C文
件(肯定产生),一个列表文件(需要在编译时设置选项,才能产生)和一个isql脚本文件(需要在编译时设置选项,才能产生)。列表文件包含了输入文件的
源语句和一些警告信息和错误信息。Isql脚本文件包含了预编译器产生的存储过程脚本文件。这个存储过程是用T-SQL写的。总之,预编译器的处理方法
是,注释了嵌入的SQL语句,用一些特定的函数代替。
第二步是C源程序的编译和链接。cl是编译和链接命令的集成命令,编译的结果是产生.obj,在链接时,将C的系统库和SQL Server提供的库文件同目标文件连接在一起。最后生成.exe。也可以使用SET LIB语句设置库文件的环境信息。
2.3 嵌入SQL语句总览
除了print、readtext和writetext外,大多数的Transact-SQL语句都可以在嵌入SQL中使用。嵌入SQL语句的语法
为:“exec sql [at connection_name] sql_statement;
”。那么,你可以用Transact-SQL语句来替代sql_statement
就可以完成嵌入SQL的编写。(同T-SQL相比,嵌入SQL提供了:自动数据类型转换、动态SQL、SQLCA数据结构等功能。)
但是,也有一些嵌入式SQL所特有的语句,有些嵌入式SQL语句的名字同Transact-SQL语句相同,但是语句的语法有所不同。
嵌入SQL语句应该包含五个步骤:
1)、通过SQLCA建立应用程序和SQL SERVER的SQL通信区域。
2)、声明宿主变量。
3)、连接到SQL SERVER。
4)、通过SQL语句操作数据。
5)、处理错误和结果信息。
嵌入式SQL语句分为静态SQL语句和动态SQL语句两类。下面我们按照功能讲解这些语句。本节讲解静态SQL语句的作用。动态SQL语句将在下一节讲解。同动态SQL相关的一些语句也在下一节中讲解。
2.3.1 宿主变量
1)、声明方法
宿主变量(host variable)就是在嵌入式SQL语句中引用主语言说明的程序变量(如例中的user[31]变量)。如: EXEC SQL BEGIN DECLARE SECTION;
char user[31],passwd[31];
EXEC SQL END DECLARE SECTION;
…………
exec sql connect :user identified by :passwd;
………….
在嵌入式SQL语句中使用主变量前,必须采用BEGIN DECLARE SECTION 和END DECLARE
SECTION之间给主变量说明。这两条语句不是可执行语句,而是预编译程序的说明。主变量是标准的C程序变量。嵌入SQL语句使用主变量来输入数据和输
出数据。C程序和嵌入SQL语句都可以访问主变量。
另外,在定义宿主变量时也可以使用client-library定义的数据类型,如:CS_CHAR。这些定义存放在cspublic.h文件中。如:
EXEC SQL BEGIN DECLARE SECTION;
CS_CHAR user[30],passwd[30];
EXEC SQL END DECLARE SECTION;
client-library定义的数据类型共有:CS_BINARY、CS_BIT、 CS_BOOL、 CS_CHAR、
CS_DATETIME、CS_DATETIME4、 CS_DECIMAL、 CS_FLOAT、 CS_REAL、CS_IMAGE、
CS_INT、 CS_MONEY、 CS_MONEY4、 CS_NUMERIC、CS_RETCODE、 CS_SMALLINT、
CS_TEXT、 CS_TINYINT、CS_VARBINARY、 CS_VARCHAR、 CS_VOID。
为了便于识别主变量,当嵌入式SQL语句中出现主变量时,必须在变量名称前标上冒号(:)。冒号的作用是,告诉预编译器,这是个主变量而不是表名或列名。不能在声明时,初始化数组变量。
由上可知,SYBASE SQL
SERVER使用宿主变量传递数据库中的数据和状态信息到应用程序,应用程序也通过宿主变量传递数据到SYBASE数据库。根据上面两种功能,宿主变量分
为输出宿主变量和输入宿主变量。在SELECT
INTO和FETCH语句之后的宿主变量称作“输出宿主变量”,这是因为从数据库传递列数据到应用程序。如: exec sql begin
declare section;
CS_CHAR id[5];
exec sql end declare section;
exec sql select title_id into :id from titles
where pub_id = "0736" and type = "business"; 除了SELECT
INTO和FETCH语句外的其他SQL语句(如:INSERT、UPDATE等语句)中的宿主变量,称为“输入宿主变量”。这是因为从应用程序向数据库
输入值。如:
exec sql begin declare section;
CS_CHAR id[7];
CS_CHAR publisher[5];
exec sql end declare section;
...
exec sql delete from titles where title_id = :id;
exec sql update titles set pub_id = :publisher
where title_id = :id;
另外,也可以通过宿主变量获得存储过程的执行状态信息。如:
exec sql begin declare section;
CS_SMALLINT retcode;
exec sql end declare section;
exec sql begin transaction;
exec sql exec :retcode = update_proc;
if (retcode != 0)
{
exec sql rollback transaction;
也可以通过宿主变量获得存储过程的返回值。如:
exec sql exec a_proc :par1 out, :par2 out;
2)、主变量的数据类型
SYBASE SQL
SERVER支持的数据类型与程序设计语言支持的数据类型之间有很大差别。这些差别对主变量影响很大。一方面,主变量是一个用程序设计语言的数据类型说明
并用程序设计语言处理的程序变量;另一方面,在嵌入SQL语句中用主变量保存数据库数据。所以,在嵌入SQL语句中,必须映射C数据类型为合适的SQL
Server数据类型。必须慎重选择主变量的数据类型。在SQL SERVER中,预编译器能够自动转换兼容的数据类型。请看下面这个例子:
EXEC SQL BEGIN DECLARE SECTION;
int hostvar1 = 39;
char *hostvar2 = "telescope";
float hostvar3 = 355.95;
EXEC SQL END DECLARE SECTION; EXEC SQL UPDATE inventory
SET department = :hostvar1
WHERE part_num = "4572-3"; EXEC SQL UPDATE inventory
SET prod_descrip = :hostvar2
WHERE part_num = "4572-3"; EXEC SQL UPDATE inventory
SET price = :hostvar3
WHERE part_num = "4572-3";
在第一个update语句中,department列为smallint数据类型(integer
),所以应该把hostvar1定义为int数据类型(integer)。这样的话,从C到SQL
Server的hostvar1可以直接映射。在第二个update语句中,prod_descip列为varchar数据类型,所以应该把
hostvar2定义为字符数组。这样的话,从C到SQL Server的hostvar2可以从字符数组映射为varchar数据类
发表评论
-
mysql 安装注意
2010-07-12 21:07 861mysql 远程连接赋予权限: GRANT ALL PRIV ... -
Windows和Linux系统下面MySQL的大小写敏感性不同
2010-04-21 15:00 2053同样的建表脚本,在windows下所有的表名都成了小写的了,在 ... -
关闭Mysql日志功能
2009-08-04 17:47 1586Cacti服务器使用有一段时间了,发现在 /usr/loca ... -
ESQL编程使用说明
2009-07-30 20:51 2027ESQL编程使用说明 ... -
ESQL/C资料(完全版)四
2009-07-30 20:50 16695.3 嵌入SQL的处理过程 INFORMIX的预 ... -
ESQL/C资料(完全版)三
2009-07-30 20:47 2170第四节 ORACLE数据库的嵌 ... -
ESQL/C资料(完全版)二
2009-07-30 20:46 1947第三节 IBM DB2嵌入SQL语言 DB2支持SQL ... -
Mysql5的auto Reconnect错误
2009-07-28 09:10 4968一、解决方案一 最近 ... -
Mysql JDBC URL中几个重要参数说明
2009-07-28 08:57 2957mysql JDBC Driver 常用的有两个,一个是gj ... -
Linux平台下修正MySQL中文乱码问题
2009-07-20 16:49 1740操作系统环境: RHEL4.6 ... -
如何将syslogng的日志写入MySQL数据库
2009-07-20 11:24 3474如何将syslogng的日志写入MySQL数据库 <! ... -
shell自动连接mysql后进行查询操作的方法
2009-07-20 11:14 96311.需求,自动登录mysql(root:root,passwd ... -
用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作
2009-07-20 11:07 2341很多人用到MySQL来开发一些项目,有时为了性能,我们会直接 ... -
mysql 5.X 迁移linux上,表名大小写敏感问题!
2009-07-18 17:39 2357mysql数据库,库名以目录名存在,表名以文件名(后缀为.fr ... -
mysql常用经典操作
2009-07-18 15:42 937.连接服务器 mysql -u cnscn ... -
绿色数据库
2009-07-17 23:20 1313如今,由于网络应用的飞速发展、多媒体数据的日益增长、视频音频 ... -
linux下mysql的最常用的操作指令_创建用户、备份和还原数据库
2009-07-17 08:55 27111]如何创建mysqld数据库的管理用户? 数据库安装好后, ... -
Linux操作系统下MySQL数据库的使用方法
2009-07-17 08:54 1030一、连接MYSQL: 格式: mysql -h主机 ... -
org.gjt.mm.mysql.Driver和com.mysql.jdbc.Driver的 区别
2009-07-15 11:42 1990org.gjt.mm.mysql.Driver是早期的驱动名称 ... -
安装 MySQL、MySQL GUI Tools
2009-07-14 14:57 2470文/李红军 http://hongjunli.blogjava ...
相关推荐
ESQL/C 嵌入式 SQL 资料(完全版) ESQL/C 嵌入式 SQL 是一种特殊的编程语言,它将 SQL 语句直接嵌入到程序的源代码中,用于访问数据库。ESQL/C 嵌入式 SQL 语言是基于 SQL 语言的扩展,它提供了一个可靠的解决方案...
介绍了如何使用Microsoft SQL Server 2000和VC开发数据库(ESQL/C 嵌入式SQL)
ESQL/C是特定于C语言的嵌入式SQL版本。 在ESQL/C中,有几个关键的概念和组成部分: 1. **嵌入SQL程序的组成元素**:一个嵌入式SQL程序由宿主语言代码和SQL语句组成。宿主语言负责程序的控制流,而SQL语句用于与...
### Informix ESQL/C 关键知识点详解 #### 第一章:Informix 产品介绍 ...综上所述,这份文档涵盖了 Informix 产品的详细介绍以及 INFORMIX-ESQL/C 的核心知识点,是学习和掌握 Informix 技术不可或缺的宝贵资料。
本文将基于给定文件的信息,详细介绍使用C语言通过ESQL(Embedded SQL)与Sybase数据库进行交互的相关知识和技术细节。 #### 二、ESQL概述 ESQL是一种将SQL语句嵌入到高级编程语言中的技术。在Sybase数据库中,...
一个简单的 ESQL 程序通常包含以下几个组成部分: 1. **SQLCA(SQL Control Area)**:这是定义并描述 SQLCA 结构的语句,用于在应用程序和数据库间通信。SQLCA 包含了 SQL 语句执行后的状态信息,如 `SQLCODE`,它...
### ESQL/C资料(完全版) #### 第一节 什么是嵌入SQL语言? **1.1 嵌入SQL程序的组成元素** 嵌入式SQL(Embedded SQL, ESQL)是一种将SQL语句直接嵌入到高级编程语言(如C语言)中的方法,允许开发者直接在应用...
SQL是所有数据库操作的基础,而ESQL/C则是将SQL语句嵌入到C语言程序中的一种方法。这使得开发者可以在C语言中直接执行复杂的数据库操作。 - **提高系统效率的几点建议** 提高系统效率的方法包括优化查询语句、...
伴随着数据库的发展,Informix还提供了一系列开发工具,如4GL和ESQL/C等,这些工具为开发者提供了强大的数据库应用开发能力,极大地提升了开发效率和应用程序的性能。 #### 二、数据库管理与系统维护 数据库管理...
- `sybase-doc-11.0.3.3-1.i386.rpm`:包含了完整的文档资料。 这些RPM包可以从官方网站或其他可信源下载,例如从`http://www.openunix.org`获取。 #### 步骤二:使用RPM命令安装 使用`rpm -i`命令安装下载的RPM...
下面是一个简单的C语言程序示例,展示了如何使用`sqlstart`和`sqlexit`函数: ```c #include int main() { $DATABASE stores5; system("ps"); // 显示有一个sqlturbo进程正在运行 sqlexit(); system("ps"); //...
对于应用开发工具,Informix提供了一系列基于4GL(第四代编程语言)的产品,包括I-SQL、4GLRDS、4GLCCOMPILER、4GLID和ESQL/C等。这些工具支持开发者创建基于字符界面的数据库应用程序。随着技术的发展,Informix还...
4. **4GL(第四代编程语言)**:Informix 自有的 4GL 语言,如 Informix-4GL 和 ESQL/C,提供了高效开发数据库应用的环境。 **四、Informix 高级特性** 1. **分布式数据库**:Informix 支持分布式数据库系统,允许...
- **问题**: 一家公司有一个使用ANSI C API的内部开发系统,WMB V6.1开发者收到了在多个消息流中轮询该系统的请求。哪种方式最适合实现这个需求? - A. 使用Java Compute节点轮询系统 - B. 使用Twineball Input...
- **丰富的客户端接口**:支持 ODBC、JDBC、Python、Perl、Tcl、C/C++、ESQL 等多种编程语言的客户端接口。 - **跨平台支持**:支持多种操作系统和硬件架构,包括 Windows、Linux、macOS 等。 ### PostgreSQL 的...
Sybase IQ是一款高性能的列式数据库管理系统,具有独特的Shared-Everything MPP(大规模并行处理)架构,专门优化用于数据仓库和商业智能(BI)应用。Sybase IQ 15.4版本提供了多方面的增强和新特性,包括对分布式...