- 浏览: 864242 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (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中把日志写入远程数据库
第三节 IBM DB2嵌入SQL语言
DB2支持SQL嵌入到C/C++、JAVA、COBOL、FORTRAN和REXX等语言。本节以SQL嵌入C/C++为例子,讲解静态的嵌入SQL编程和动态的嵌入SQL编程。
静态SQL嵌入C语言编程是指,应用程序在书写时,每个SQL语句的大部分都已确定下来(如:查询的表、列和语句的格式等),唯一不确定的是查询语句中某些特定变量的值,这些值可以在执行时由变量传进去,但是,值的类型要事先确定。
3.1 一个简单示例
首先,我们来看一个嵌入静态SQL语句的C程序。
例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)
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
int check_error (char eString[], struct sqlca *caPointer) {
char eBuffer[1024];
char sBuffer[1024];
short rc, Erc;
if (caPointer->sqlcode != 0) {
printf ("--- error report ---\n");
printf ("ERROR occured : %s.\nSQLCODE : %ld\n", eString,
caPointer->sqlcode);
}
return 0;
}
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION; (2)
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
printf( "Sample C program: STATIC\n" );
if (argc == 1) {
EXEC SQL CONNECT TO sample;
CHECKERR ("CONNECT TO SAMPLE");
}
else if (argc == 3) {
strcpy (userid, argv[1]);
strcpy (passwd, argv[2]);
EXEC SQL CONNECT TO sample USER :userid USING :passwd; (3)
CHECKERR ("CONNECT TO SAMPLE");
}
else {
printf ("\nUSAGE: static [userid passwd]\n\n");
return 1;
} /* endif */
EXEC SQL SELECT FIRSTNME INTO :firstname
FROM employee
WHERE LASTNAME = 'JOHNSON';(4)
CHECKERR ("SELECT statement"); (5)
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET; (6)
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : STATIC.SQC */ 上面是一个简单的静态嵌入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变量中。该语句返回一个结果。可以通过游标返回多个结果。
(5)在该程序中通过调用宏CHECKERR(即调用函数check_error)来返回SQL语句执行的结果。Check_error函数在下面讲解。
(6)最后断开数据库的连接。
从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“\”。
3.2 嵌入SQL语句
3.2.1宿主变量
1)、声明方法
宿主变量就是在嵌入式SQL语句中引用主语言说明的程序变量(如上例中的firstname变量)。如:
………….
EXEC SQL SELECT FIRSTNME INTO :firstname (4)
FROM employee
WHERE LASTNAME = 'JOHNSON';
………….
在嵌入式SQL语句中使用宿主变量前,必须采用BEGIN DECLARE SECTION 和END DECLARE
SECTION之间给宿主变量说明。这两条语句不是可执行语句,而是预编译程序的说明。宿主变量是标准的C程序变量。嵌入SQL语句使用宿主变量把数据库
中查询到的值返回给应用程序(称为输出宿主变量),也用于将程序中给定的值传到SQL语句中(称为输入宿主变量)。显然,C程序和嵌入SQL语句都可以访
问宿主变量。
在使用宿主变量前,请注意以下几点:
l宿主变量的长度不能超过30字节。开始的字母不能是EXEC和SQL。
l宿主变量必须在被引用之前定义。
l一个源程序文件中可以有多个SQL说明段。
l宿主变量名在整个程序中必须是唯一的。
2)、宿主变量的数据类型
宿主变量是一个用程序设计语言的数据类型说明并用程序设计语言处理的程序变量;另外,在嵌入SQL语句中用宿主变量保存数据库数据。所以,在嵌入SQL语句中,必须映射C数据类型为合适的DB2数据类型。必须慎重选择宿主变量的数据类型。请看下面这个例子:
EXEC SQL BEGIN DECLARE SECTION;
short hostvar1 = 39;
char *hostvar2 = "telescope";
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";
在第一个update语句中,department列为smallint数据类型,所以应该把hostvar1定义为short数据类型。这样的话,从C
到DB2的hostvar1可以直接映射。在第二个update语句中,prod_descip列为varchar数据类型,所以应该把hostvar2
定义为字符数组。这样的话,从C到DB2的hostvar2可以从字符数组映射为varchar数据类型。
下表列出了C的数据类型和DB2的数据类型的一些转换关系:
DB2数据类型C数据类型
Smallintshort
IntegerLong
Decimal(p,s)无
DoubleDouble
DateChar[11]
TimeChar[9]
TimestampChar[27]
Char(X)Char[X+1]
Varchar(X)Char[X+1]
Graphic(X)Wchar_t[X+1]
Vargraphic(X)Wchar_t[X+1]
因为C没有date或time数据类型,所以DB2的date或time列将被转换为字符。缺省情况下,使用以下转换格式:mm dd yyyy
hh:mm:ss[am |
pm]。你也可以使用字符数据格式将C的字符数据存放到DB2的date列上。对于DECIMAL数据类型,在C语言中也没有对应的数据类型。但可以使用
char数据类型实现。
3)、宿主变量和NULL
大多数程序设计语言(如C)都不支持NULL。所以对NULL的处理,一定要在SQL中完成。我们可以使用主机指示符变量来解决这个问题。在嵌入式SQL
语句中,宿主变量和指示符变量共同规定一个单独的SQL类型值。指示变量和前面宿主变量之间用一个空格相分隔。如:
EXEC SQL SELECT price INTO :price :price_nullflag FROM titles
WHERE au_id = "mc3026"
其中,price是宿主变量,price_nullflag是指示符变量。指示符变量的值为:
l-1。表示宿主变量应该假设为NULL。(注意:宿主变量的实际值是一个无关值,不予考虑)。
l=0。表示宿主变量不是NULL。
l>0。表示宿主变量不是NULL。而且宿主变量对返回值作了截断,指示变量存放了截断数据的长度。
所以,上面这个例子的含义是:如果不存在mc3026写的书,那么price_nullflag为-1,表示price为NULL;如果存在,则price为实际的价格。
指示变量也是一种宿主变量,也需要在程序中定义,它对应数据库系统中的数据类型为SMALLINT。为了便于识别宿主变量,当嵌入式SQL语句中出现宿主变量时,必须在变量名称前标上冒号(:)。冒号的作用是,告诉预编译器,这是个宿主变量而不是表名或列名。
3.2.2单行查询
单行查询是通过SELECT
INTO语句完成。当这条语句执行时,查询的结果送入INTO所标志的变量中。如果SQLCODE是100,或者SQLSTATE是02000,则说明没
有查询到结果或返回结果为NULL,这时,宿主变量不改变,否则,宿主变量中将包含查询的结果。如:
………….
EXEC SQL SELECT FIRSTNME INTO :firstname
FROM employee
WHERE LASTNAME = 'JOHNSON';
…………. 3.2.3多行查询
对于多行结果,必须使用游标来完成。游标是一个与SELECT语句相关联的符号名,它使用户可逐行访问由DB2返回的结果集。下面这个例子演示了游标的使用方法。这个例子的作用是,逐行打印出每个经理的名字和部门。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
EXEC SQL INCLUDE SQLCA;
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION;
char pname[10];
short dept;
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
printf( "Sample C program: CURSOR \n" );
if (argc == 1) {
EXEC SQL CONNECT TO sample;
CHECKERR ("CONNECT TO SAMPLE");
}
else if (argc == 3) {
strcpy (userid, argv[1]);
strcpy (passwd, argv[2]);
EXEC SQL CONNECT TO sample USER :userid USING :passwd;
CHECKERR ("CONNECT TO SAMPLE");
}
else {
printf ("\nUSAGE: cursor [userid passwd]\n\n");
return 1;
} /* endif */
EXEC SQL DECLARE c1 CURSOR FOR (1)
SELECT name, dept FROM staff WHERE job='Mgr'
FOR UPDATE OF job;
EXEC SQL OPEN c1; (2)
CHECKERR ("OPEN CURSOR");
do {
EXEC SQL FETCH c1 INTO :pname, :dept; (3)
if (SQLCODE != 0) break;
printf( "%-10.10s in dept. %2d will be demoted to Clerk\n",
pname, dept );
} while ( 1 );
EXEC SQL CLOSE c1; (4)
CHECKERR ("CLOSE CURSOR");
EXEC SQL ROLLBACK;
CHECKERR ("ROLLBACK");
printf( "\nOn second thought -- changes rolled back.\n" );
EXEC SQL CONNECT RESET;
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : CURSOR.SQC */
在上面这个程序中,
(1)定义了一个游标,并指明游标的名字为C1,同时给出了相对于游标的查询语句和游标类型(UPDATE)。
(2)打开游标。系统执行查询语句,建立结果表,将游标指针指向第一条记录之前。
(3)FETCH语句将指针的下一条记录取出,将记录中的数据存放在相应的宿主变量中。同时指针下移。
(4)用CLOSE关闭游标。 3.2.4插入、删除和修改操作
DB2中的插入、删除和修改操作同SQL语句中INSERT、DELETE和UPDATE语句类似。只需在相应的SQL语句前加上EXEC SQL即可。请看下面这个例子:
例、将staff表中所有工作为“Mgr”的职工的工作改变为“clerk”,并将staff表中所有工作为“sale”的职工信息删除。最后插入一新行。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlenv.h>
#include "util.h"
EXEC SQL INCLUDE SQLCA; (1)
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION; (2)
char statement[256];
char userid[9];
char passwd[19];
char jobUpdate[6];
EXEC SQL END DECLARE SECTION;
printf( "\nSample C program: UPDAT \n");
if (argc == 1) {
EXEC SQL CONNECT TO sample;
CHECKERR ("CONNECT TO SAMPLE");
}
else if (argc == 3) {
strcpy (userid, argv[1]);
strcpy (passwd, argv[2]);
EXEC SQL CONNECT TO sample USER :userid USING :passwd; (3)
CHECKERR ("CONNECT TO SAMPLE");
}
else {
printf ("\nUSAGE: updat [userid passwd]\n\n");
return 1;
} /* endif */
strcpy (jobUpdate, "Clerk");
EXEC SQL UPDATE staff SET job = :jobUpdate WHERE job = 'Mgr'; (4)
CHECKERR ("UPDATE STAFF");
printf ("All 'Mgr' have been demoted to 'Clerk'!\n" );
strcpy (jobUpdate, "Sales");
EXEC SQL DELETE FROM staff WHERE job = :jobUpdate; (5)
CHECKERR ("DELETE FROM STAFF");
printf ("All 'Sales' people have been deleted!\n");
EXEC SQL INSERT INTO staff
VALUES (999, 'Testing', 99, :jobUpdate, 0, 0, 0); (6)
CHECKERR ("INSERT INTO STAFF");
printf ("New data has been inserted\n");
EXEC SQL ROLLBACK; (7)
CHECKERR ("ROLLBACK");
printf( "On second thought -- changes rolled back.\n" );
EXEC SQL CONNECT RESET;
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : UPDAT.SQC */
上述语句:
(1)包含SQLCA结构。该结构用于将SQL语句执行的结果信息返回给应用程序。
(2)宿主变量定义。
(3)连接到DB2的SAMPLE数据库。
(4)UPDATE语句将staff表中所有工作为“Mgr”的职工的工作改变为“clerk”。
(5)DELETE语句将staff表中所有工作为“sale”的职工信息删除。
(6)INSERT语句插入一新行。 指定位置的UPDATE语句和DELETE语句
游标操作除了可以将多行的查询结果返回给应用程序,它还可以与UPDATE语句和DELETE相结合,根据游标当前的位置,对指针所指的这个行数据执行
UPDATE操作和DELETE操作。它的语法为:
UPDATE…. WHERE CURRENT OF cursor_name
DELETE [FROM] {table_name | view_name} WHERE CURRENT OF cursor_name
请看下面这个例子。这个例子的作用是:将部门大于40的员工的工作改变为“clerk”,部门小于等于40的员工信息删除。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
发表评论
-
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 2026ESQL编程使用说明 ... -
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:45 2533第六章 嵌入式SQL(E-SQL)简介 ... -
Mysql5的auto Reconnect错误
2009-07-28 09:10 4967一、解决方案一 最近 ... -
Mysql JDBC URL中几个重要参数说明
2009-07-28 08:57 2957mysql JDBC Driver 常用的有两个,一个是gj ... -
Linux平台下修正MySQL中文乱码问题
2009-07-20 16:49 1739操作系统环境: RHEL4.6 ... -
如何将syslogng的日志写入MySQL数据库
2009-07-20 11:24 3473如何将syslogng的日志写入MySQL数据库 <! ... -
shell自动连接mysql后进行查询操作的方法
2009-07-20 11:14 96291.需求,自动登录mysql(root:root,passwd ... -
用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作
2009-07-20 11:07 2340很多人用到MySQL来开发一些项目,有时为了性能,我们会直接 ... -
mysql 5.X 迁移linux上,表名大小写敏感问题!
2009-07-18 17:39 2356mysql数据库,库名以目录名存在,表名以文件名(后缀为.fr ... -
mysql常用经典操作
2009-07-18 15:42 936.连接服务器 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 1989org.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 语言的扩展,它提供了一个可靠的解决方案...
ESQL/C是特定于C语言的嵌入式SQL版本。 在ESQL/C中,有几个关键的概念和组成部分: 1. **嵌入SQL程序的组成元素**:一个嵌入式SQL程序由宿主语言代码和SQL语句组成。宿主语言负责程序的控制流,而SQL语句用于与...
### Informix ESQL/C 关键知识点详解 #### 第一章:Informix 产品介绍 ...综上所述,这份文档涵盖了 Informix 产品的详细介绍以及 INFORMIX-ESQL/C 的核心知识点,是学习和掌握 Informix 技术不可或缺的宝贵资料。
#### 二、ESQL概述 ESQL是一种将SQL语句嵌入到高级编程语言中的技术。在Sybase数据库中,通常采用C语言作为宿主语言来实现ESQL编程。这种方式允许开发者直接在C程序中编写SQL语句,从而更方便地管理和操作数据库。 ...
在 ESQL/C 的上下文中,SQL 语句被预编译器处理,转换成宿主语言可识别的函数调用,然后由对应的编译器(如 C 编译器)编译为可执行程序。 在 ANSI/ISO 标准下,不同数据库厂商都支持嵌入式 SQL,但每个厂商可能会...
### ESQL/C资料(完全版) #### 第一节 什么是嵌入SQL语言? **1.1 嵌入SQL程序的组成元素** 嵌入式SQL(Embedded SQL, ESQL)是一种将SQL语句直接嵌入到高级编程语言(如C语言)中的方法,允许开发者直接在应用...
SQL是所有数据库操作的基础,而ESQL/C则是将SQL语句嵌入到C语言程序中的一种方法。这使得开发者可以在C语言中直接执行复杂的数据库操作。 - **提高系统效率的几点建议** 提高系统效率的方法包括优化查询语句、...
伴随着数据库的发展,Informix还提供了一系列开发工具,如4GL和ESQL/C等,这些工具为开发者提供了强大的数据库应用开发能力,极大地提升了开发效率和应用程序的性能。 #### 二、数据库管理与系统维护 数据库管理...
- `sybase-ase-11.0.3.3-1.i386.rpm`:包含了Sybase ASE 11.0.3.3的主要组件,包括SQL Server、Backup Server、Sybinit和Sybmon,以及OpenClient 10.0.4和OpenServer,还有ESQL/C接口。 - `sybase-doc-11.0.3.3-1....
4. **4GL(第四代编程语言)**:Informix 自有的 4GL 语言,如 Informix-4GL 和 ESQL/C,提供了高效开发数据库应用的环境。 **四、Informix 高级特性** 1. **分布式数据库**:Informix 支持分布式数据库系统,允许...
### 控制数据库服务 在IT领域,特别是数据库管理与应用开发方面,掌握如何有效地控制数据库服务至关重要。...了解这些函数的工作原理对于任何从事Informix-ESQL/C应用开发的工程师来说都是非常有价值的。
对于应用开发工具,Informix提供了一系列基于4GL(第四代编程语言)的产品,包括I-SQL、4GLRDS、4GLCCOMPILER、4GLID和ESQL/C等。这些工具支持开发者创建基于字符界面的数据库应用程序。随着技术的发展,Informix还...
#### 完整问题与答案集合 Pass4sure提供的106个问题及答案集合覆盖了000-315考试的所有方面,帮助考生全面掌握所需知识。以下是几个具体的知识点: 1. **构建无WSDL访问的消息流**: - **问题**: 一个WMB V6.1...
- **丰富的客户端接口**:支持 ODBC、JDBC、Python、Perl、Tcl、C/C++、ESQL 等多种编程语言的客户端接口。 - **跨平台支持**:支持多种操作系统和硬件架构,包括 Windows、Linux、macOS 等。 ### PostgreSQL 的...
Sybase IQ 15.4中文手册详细介绍了该版本的命令和系统参数,对于数据库管理员和开发者而言,这是极为重要的参考资料。手册涵盖了SQL语句的使用,包括数据定义语言(DDL)、数据操纵语言(DML)和事务控制语句等。...