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