嵌入式SQL(英文 Embedded SQL)是一种将
SQL语句直接写入C语言,
COBOL,
FORTRAN, Ada等编程语言的
源代码中的方法。
简介
嵌入式SQL(英文: Embedded SQL)是一种将
SQL语句直接写入C语言,
COBOL,
FORTRAN, Ada等编程语言的
源代码中的方法。借此方法,可使得应用程序拥有了访问数据以及处理数据的能力。在这一方法中,将SQL文嵌入的目标源码的语言称为
宿主语言。
在SQL标准的SQL86(1986年发布)中定义了对于COBOL, FORTRAN, PI/L等语言的嵌入式SQL的规范。在SQL89(1989年发布)规范中,定义了对于C语言的嵌入式SQL的规范。一些大型的数据库厂商发布的数据库产品中,都提供了对于嵌入式SQL的支持。比如Oracle, DB2等。
工作原理
提供对于嵌入式SQL的支持,需要数据库厂商除了提供DBMS之外,还必须提供一些工具。为了实现对于嵌入式SQL的支持,技术上必须解决以下4个问题:
1.
宿主语言的编译器不可能识别和接受SQL文,需要解决如何将SQL的宿主语言
源代码编译成可执行码;
2.宿主语言的应用程序如何与DBMS之间传递数据和消息;
3.如何把对数据的查询结果逐次赋值给
宿主语言程序中的变量以供其处理;
4.数据库的数据类型与宿主语言的数据类型有时不完全对应或等价,如何解决必要的数据类型转换问题。
嵌入式SQL源码的处理流程 为了解决上述这些问题,数据库厂商需要提供一个嵌入式SQL的
预编译器,把包含有嵌入式SQL文的
宿主语言源码转换成纯宿主语言的代码。这样一来,源码即可使用宿主语言对应的
编译器进行编译。通常情况下,经过嵌入式SQL的预编译之后,原有的嵌入式SQL会被转换成一系列
函数调用。因此,数据库厂商还需要提供一系列函数库,以确保
链接器能够把代码中的函数调用与对应的实现链接起来。
扩展语法
嵌入式SQL中除了可以执行标准SQL文之外,为了对应嵌入的需要,还增加了一些额外的语法成分。主要包含以下内容:
数据库产品
支持嵌入式SQL的数据库产品以下列出支持嵌入式SQL的数据库产品以及各自支持的
宿主语言Oracle DatabaseAda Pro*Ada在Oracle 7.3的版本中被加入产品族,并且在Oracle 8中被替换为SQL*Module。但在此之后就一直没有更新。SQL*Module支持Ada 83.C/C++
Pro*C 在Oracle 8 时被替换成了Pro*C/C++。之后Pro*C/C++ 到Oracle Database 11g仍都在被支持。COBOL Pro*
COBOL到Oracle Database 11g仍都在被支持。Fortran Pro*FORTRAN 在Oracle 8之后的Oracle版本中就不再被更新,但Bug修正仍在维护中。Pascal Pro*
Pascal在Oracle 8之后的
Oracle版本中就不再被更新[3]。PI/L Pro*
PL/I 自Oracle 8之后就不再被更新,但文档中仍然有记述。IBM DB2IBM DB2的版本9中提供了对于C/C++,
COBOL,
Java等
宿主语言的嵌入式SQL的支持。
PostgreSQLC/
C++ PostgreSQL 自版本6.3起就提供了对于C/C++的嵌入式SQL的支持,以ECPG组件的形式存在。
嵌入形式
对
宿主型
数据库语言SQL,DBMS可以采用两种方法处理,一种是
预编译,另一种是修改和扩充主语言使之能处理
SQL语句。目前采用较多的是预编译的方法。即有DBMS的预处理程序对源程序进行扫描,识别出SQL语句,把它们转换成主语言调用语句,以使主语言
编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。
在嵌入式SQL中,为了能够区分SQL语句与主语言语句,所以SQL语句都必须加前缀EXEC SQL。SQL语句的结束标准则随主语言的不同而不同。
例如:在PL/1和C中以分号(;)结束:
EXEC SQL;
例如一条交互形式的SQL语句:
DROP TABLE Student;
嵌入到
C程序中应写作:EXEC SQL DROP TABLE Student;