8.8.1 SQL与宿主语言接口

2025-06-05 16:34:52 更新

SQL提供了将SQL语句嵌入某种高级语言中的使用方式,但是如何识别嵌入在高级语言

中的SQL语句,通常采用预编译的方法。该方法的关键问题是必须区分主语言中嵌入的SQL

语句,以及主语言和SQL间的通信问题。采用的方法由DBMS的预处理程序对源程序进行扫

描,识别出SQL语句,把它们转换为主语言调用语句,以使主语言编译程序能识别它,最后由

主语言的编译程序将整个源程序编译成目标码。

可见将SQL嵌入主语言使用时应当注意如下问题。

1.区分主语言语句与SQL语句

为了区分主语言语句与SQL语句,需要在所有的SQL语句前加前缀EXEC SQL ,而SQL

的结束标志随主语言的不同而不同。

例如,PL/1和C语言的引用格式为:EXECSQLVSQL语句〉:

又如,COBOL语言的引用格式为:EXEC SQL<SQL语句> END-EXEC.

2.主语言工作单元与数据库工作单元通信

1)SQL通信区

SQL通信区(SQL Communication Aiea, SQLCA)向主语言传递SQL语句执行的状态信

息,使主语言能够根据此信息控制程序流程。

2)主变量

主变量也称共享变量。主语言向SQL语句提供参数主要通过主变量,主变量由主语言的

程序定义,并用SQL的DECLARE语句说明。

3)游标

SQL语言是面向集合的,一条SQL语句可产生或处理多条记录。而主语言是面向记录的,

一组主变量一次只能放一条记录,所以,引入游标,通过移动游标指针来决定获取哪一条记录。

与游标相关的SQL语句有四条:

(1)定义游标,格式如下:

EXEC SQL DECLARE <游标名〉CURSOR FOR

<SELECT 语句〉

END_EXEC

这是一条说明性语句,定义中的SELECT语句并不立即执行。

(2)打开游标,格式如下:

EXEC SQL OPEN〈游标名〉END_EXEC

该语句执行游标定义中的SELECT语句,同时游标处于活动状况。游标是一个指针,此时

指向查询结果的第一行之前。

(3)推进游标,格式如下:

EXEC SQL FETCH FROM〈游标名〉INTO〈变量表〉END EXEC

该语句使用时,游标推进一行,并把游标指向的行(称为当前行)中的值取出,送到共享变量中。变量表由用逗号分开的共享变量组成。该语句常置于宿主语言程序的循环结构中,并借助宿主语言的处理语句逐一处理查询结果中的一个元组。

(4)关闭游标,格式如下:

EXEC SQL CLOSE <游标名> END_EXEC

该语句关闭游标,使它不再和查询结果相联系。关闭了的游标,可以再次打开,与新的查询结果相联系。在游标处于活动状态时,可以修改和删除游标指向的元组。