ESQL的资料

ESQL的资料

SYBA SE SQL SERVER 使用宿主变量传送数据库中的数据和状态信息到应用顺序,由上可知。应用顺序也通过宿主变量传送数据到 SYBA SE 数据库。根据上面两种功能,宿主变量分为输出宿主变量和输入宿主变量。 SELECT INTO 和 FETCH 语句之后的宿主变量称作 “ 输出宿主变量 ” 这是因为从数据库传送列数据到应用顺序。如:

第六章 嵌入式 SQL E-SQL 简介

第一节 什么是嵌入 SQL 语言?

既是一种用于查询和更新的交互式数据库语言,SQL 一种双重式语言。又是一种应用顺序进行数据库访问时所采取的编程式数据库语言。 SQL 语言在这两种方式中的大部分语法是相同的编写访问数据库的顺序时,必需从普通的编程语言开始(如 C 语言)再把 SQL 加入到顺序中。所以,嵌入式 SQL 语言就是将 SQL 语句直接嵌入到顺序的源代码中,与其他顺序设计语言语句混合。专用的 SQL 预编译顺序将嵌入的 SQL 语句转换为能被顺序设计语言(如 C 语言)编译器识别的函数调用。然后, C 编译器编译源代码为可执行程序。

并且都符合 ANSI/ISO 规范。所以,各个数据库厂商都采用嵌入 SQL 语言。如果采用合适的嵌入 SQL 语言,那么可以使得你顺序能够在各个数据库平台上执行(即:源顺序不用做修改,只需要用相应数据库产品的预编译器编译即可)当然,每个数据库厂商又扩展了 ANSI/ISO 规范,提供了一些附加的功能。这样,也使得每个数据库产品在嵌入 SQL 方面有一些区别。本章的目标是对所有的数据库产品的嵌入 SQL 做一个简单、实用的介绍。

嵌入 SQL 语句完成的功能也可以通过应用顺序接口( API 实现。通过 API 调用,当然。可以将 SQL 语句传送到 DBMS 并用 API 调用返回查询结果。这个方法不需要专用的预编译程序。

1.1 嵌入 SQL 顺序的组成元素

来看看嵌入 SQL 语句的组成元素。 以 IBM DB2 嵌入 SQL 为例。

查询 LA STNA ME 为 JOHNSON FIRSTNA ME 信息。 例 1 连接到 SA MPLE 数据库。

#includ <stdio.h>

#includ <stdlib.h>

#includ <string.h>

#includ "util.h"

#includ <sqlca.h>

EXEC SQL INCLUDE SQLCA ; 1

main

{

EXEC SQL BEGIN DECLA RE SECTION; 2

char firstname[13];

char userid[9];

char passwd[19];

EXEC SQL END DECLA RE SECTION;

EXEC SQL CONNECT TO sample; 3

EXEC SQL SELECT FIRSTNME INTO :firstnam 4

FROM employee

WHERE LA STNA ME = 'JOHNSON'; 4

firstnam printf "First name = %s/n".;

EXEC SQL CONNECT RESET; 5

return 0;

}

上面是一个简单的静态嵌入 SQL 语句的应用顺序。包括了嵌入 SQL 主要局部:

其中的 SQLCODE 返回 SQL 语句执行后的结果状态。 1 中的 includ SQLCA 语句定义并描述了 SQLCA 结构。 SQLCA 用于应用顺序和数据库之间的通讯。

也可以被 C 语言语句引用。用于将程序中的数据通过 SQL 语句传给数据库管理器, 2 BEGIN DECLA RE SECTION 和 END DECLA RE SECTION 之间定义了宿主变量。宿主变量可被 SQL 语句引用。或从数据库管理器接收查询的结果。 SQL 语句中,主变量前均有 “ 标志以示区别。

以连接到某一个数据库上。这时, 3 每次访问数据库之前必需做 CONNECT 操作。应该保证数据库实例已经启动。

并将它放在 firstnam 变量中。该语句返回一个结果。可以通过游标返回多个结果。当然, 4 一条选择语句。将表 employe 中的 LA STNA ME 为 “ JOHNSON 行数据的 FIRSTNA ME 查出。也可以包含 updat insert 和 delet 语句。

5 最后断开数据库的连接。

每条嵌入式 SQL 语句都用 EXEC SQL 开始,从上例看出。标明它一条 SQL 语句。这也是告诉预编译器在 EXEC SQL 和 “ 之间是嵌入 SQL 语句。如果一条嵌入式 SQL 语句占用多行, C 顺序中可以用续行符 “ /

1.2 什么是静态 SQL 和动态 SQL?

分为静态 SQL 语言和动态语言两类。静态 SQL 语言,嵌入 SQL 语言。就是编译时已经确定了引用的表和列。宿主变量不改变表和列信息。可以使用主变量改变查询参数值,但是不能用主变量代替表名或列名。

而是让程序在运行时提供,动态 SQL 语言就是不在编译时确定 SQL 表和列。并将 SQL 语句文本传给 DBMS 执行。静态 SQL 语句在编译时已经生成执行计划。而动态 SQL 语句,只有在执行时才发生执行计划。动态 SQL 语句首先执行 PREPA RE 语句要求 DBMS 分析、确认和优化语句,并为其生成执行计划。 DBMS 还设置 SQLCODE 以标明语句中发现的错误。当顺序执行完 “ PREPA RE 语句后,就可以用 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 结构都不完全相同。

第二节 SYBA SE SQL Server 嵌入式 SQL 语言

2.1 一个嵌入 SQL 语言的简单例子

并将所有书的价格增加 10% 这个例子顺序如下: 首先来看一个简单的嵌入式 SQL 语言的顺序( C 语言)用 sa 口令为 password 连接数据库服务器。

例 1

/* 建立通讯区域 */

Exec sql includ sqlca;

main

{

/* 声明宿主变量 */

EXEC SQL BEGIN DECLA RE SECTION;

passwd[30]char user[30].;

EXEC SQL END DECLA RE SECTION;

/* 错误处置 */

EXEC SQL WHENEVER SQLERROR CA LL err_p ;

/* 连接到 SQL SERVER 服务器 */

printf "/npleas enter your userid " ;

get user ;

printf "/npassword " ;

get passwd ;

exec sql connect :user identifi by :passwd;

exec sql us pubs2

EXEC SQL updat titl 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.sqlerrm.sqlerrmc sqlca.sqlcode.;

}

看出嵌入 SQL 基本特点是 从上面这个例子。

标明它一条 SQL 语句。这也是告诉预编译器在 EXEC SQL 和 “ 之间是嵌入 SQL 语句。 1 每条嵌入式 SQL 语句都用 EXEC SQL 开始。

C 顺序中可以用续行符 “ / Fortran 中必需有续行符。其他语言也有相应规定。 2 如果一条嵌入式 SQL 语句占用多行。

如: C 中是 3 每一条嵌入 SQL 语句都有结束符号。

4 嵌入 SQL 语句的关键字不区分大小写。

5 可以使用 “ /* .*/ 来添加注释。也可以使用 “ -- 来添加注释。

2.2 嵌入 SQL 处置过程

嵌入 SQL 处置过程如下图所示:

图 6-1 SYBA SE SQL SERVER 嵌入 SQL 顺序处置过程

嵌入 SQL 顺序的后缀为 .cp 嵌入 SQL 处置的第一步是预编译。预编译器( cpre.ex 处置过程分为两个小步:

第一小步:语法分析。检查嵌入 SQL 语句的语法正确性。

并注释了所有的嵌入的 SQL 语句,第二小步:增加一些预编译器变量。将嵌入 SQL 语句转换为对 client-librari 中函数的调用(注意:连接时,编译后的代码需要使用 client-librari 中的库文件)如果在编译时,设置一些选项,则生成存储过程。预编译后可能产生 3 个文件:一个 C 文件(肯定发生)一个列表文件(需要在编译时设置选项,才干发生)和一个 isql 脚本文件(需要在编译时设置选项,才干发生)列表文件包含了输入文件的源语句和一些警告信息和错误信息。 Isql 脚本文件包括了预编译器产生的存储过程脚本文件。这个存储过程是用 T-SQL 写的总之,预编译器的处置方法是注释了嵌入的 SQL 语句,用一些特定的函数代替。

编译的结果是发生 .obj 链接时,第二步是 C 源程序的编译和链接。 cl 编译和链接命令的集成命令。将 C 系统库和 SQL Server 提供的库文件同目标文件连接在一起。最后生成 .ex 也可以使用 SET LIB 语句设置库文件的环境信息。

2.3 嵌入 SQL 语句总览

大多数的 Transact-SQL 语句都可以在嵌入 SQL 中使用。嵌入 SQL 语句的语法为: exec sql [at connection_name] sql_statement; 那么,除了 print readtext 和 writetext 外。可以用 Transact-SQL 语句来替代 sql_statement 就可以完成嵌入 SQL 编写。同 T-SQL 相比,嵌入 SQL 提供了自动数据类型转换、动态 SQL SQLCA 数据结构等功能。

有些嵌入式 SQL 语句的名字同 Transact-SQL 语句相同,但是也有一些嵌入式 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 variabl 就是嵌入式 SQL 语句中引用主语言说明的顺序变量(如例中的 user[31] 变量)如:

EXEC SQL BEGIN DECLA RE SECTION;

passwd[31]char user[31].;

EXEC SQL END DECLA RE SECTION;

exec sql connect :user identifi by :passwd;

.

必需采用 BEGIN DECLA RE SECTION 和 END DECLA RE SECTION 之间给主变量说明。这两条语句不是可执行语句,嵌入式 SQL 语句中使用主变量前。而是预编译程序的说明。主变量是规范的 C 顺序变量。嵌入 SQL 语句使用主变量来输入数据和输出数据。 C 顺序和嵌入 SQL 语句都可以访问主变量。

定义宿主变量时也可以使用 client-librari 定义的数据类型,另外。如: CS_CHA R 这些定义存放在 cspublic.h 文件中。如:

EXEC SQL BEGIN DECLA RE SECTION;

passwd[30]CS_CHA R user[30].;

EXEC SQL END DECLA RE SECTION;

client- librari 定义的数据类型共有: CS_BINA RY CS_BIT CS_BOOL CS_CHA R CS_DA TETIME CS_DA TETIME4 CS_DECIMA L CS_FLOA T CS_REA L CS_IMA GE CS_INT CS_MONEY CS_MONEY4 CS_NUMERIC CS_RETCODE CS_SMA LLINT CS_TEXT CS_TINYINT CS_VA RBINA RY CS_VA RCHA R CS_VOID

当嵌入式 SQL 语句中出现主变量时,为了便于识别主变量。必需在变量名称前标上冒号(冒号的作用是告诉预编译器,这是个主变量而不是表名或列名。不能在声明时,初始化数组变量。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值