GKD-BASE PL/SQL引擎实现关键技术研究
关键词:过程语言PL/SQL符号表 游标
GKD-BASE数据库是一个具有自主知识产权的数据库管理系统,具有兼容SQL89标准的SQL引擎,能够为用户提供一个统一、有效的数据库访问接口,实现对数据库的各种操作。但是SQL语言缺乏对算法的描述能力,难以胜任复杂的程序设计。为了融合SQL语言强大的集合数据处理能力和第三代语言(3GL)灵活的过程处理能力,主流数据库管理系统产品都已提供了对过程式SQL语言的支持,如Oracle的PL/SQL[1]。为了使GKD-BASE适应发展现状,满足管理人员和开发人员的需求,急需开发GKD-BASE自身的PL/SQL引擎。
本文在数据库管理系统GKD-BASE上设计并实现了兼容Oracle PL/SQL V2.3语言规范的PL/SOL引擎,扩展了GKD-BASE过程处理功能。
1 GKD-BASE PL/SQL引擎的体系结构
GKD-BASE PL/SQL引擎的基本功能是将用户用PL/SQL语言编写的程序通过词法分析程序、语法分析程序进行解析,生成中间代码并解释执行。如果在分析阶段或解释执行阶段发现错误,则向用户报告错误号及相应的错误信息,以便用户排错[2]。根据PL/SQL语言兼有过程式语句和SQL语句的特点,采取分治策略,把过程语句和SQL语句分开处理。PL/SQL引擎在对PL/SQL源程序编译执行时,首先进行预处理,把SQL语句和过程语句分开;然后对SQL语句和过程语句分别解析,生成语法树;最后通过执行模块对中间代码进行解释执行。
图1
GKD-BASE PL/SQL引擎对源程序编译生成中间代码,不能直接在目标机器上执行,需要一个解释中间代码的环境,以提供对PL/SQL语言中的数据类型的支持,保证PL/SQL正确执行。因此GKD-BASE PL/SQL引擎可分为编译器和解释器两部分,如图1。编译器接收到PL/SQL语句块后进行预处理,将句子分为SQL语句和过程语句。对于SQL语句,编译器建立SQL语句节点,进行相应的变量绑定和语法检查;检查无误后产生中间代码。对于过程语句,编译器对语句成分进行语法分析并建立相应的符号表,也生成中间代码。因此,可以把编译器划分为SQL语言解析、过程语言解析、符号表生成与管理、中间代码表示与管理等模块。解释器的作用是对编译器生成的中间代码进行解释执行[3],与编译器对应,具有独立的SQL语句解释模块和过程语句解释模块。解释器还包括执行状态堆栈的管理、与GKD-BASESQL引擎的调用接口。异常处理模块主要实现程序运行时的错误检查和报告,并支持用户自定义异常和预定义异常的检查和处理。
2 GKD-BASE PL/SQL编译器实现中的一些关键问题
GKD-BASE PL/SQL编译器主要是对PL/SQL源程序进行词法分析、语法分析和语义处理[4]。本文借助构建词法分析器的Lex和编译程序自动产生工具Yacc[5],实现了对PL/SQL源程序的编译。下面分别说明符号表的设计与管理、SQL语句解析以及游标解析。
2.1 符号表的设计与管理
符号表是一个包含程序中的变量、自定义类型和函数信息的数据库。通过索引对应于库中的一条记录;每条记录对应着一个对象的信息,如变量的类型或函数的返回值等[2]。
考虑到PL/SQL语言的块结构和名字作用域,可以使用名字堆栈存放源程序中所使用的标志符的索引、名字和类型。每个项目只包括名字本身和用来表明它的类型的标志值,以及该名字在符号表中的项目索引。名字堆栈采用层次结构,是链表型的堆栈,堆栈的每一层存放了解析的语句块嵌套层内的所有名字信息,如图2。在进入或退出一个嵌套层时调用相应的压栈和弹栈操作;查找符号时,从栈顶向栈底搜索。名字堆栈实现了标志符名称与相应的符号表索引间的映射,解决了标志符的作用域问题和可见性问题,满足了对符号表管理和调用的要求。
(凹丫丫范文网fanwen.oyaya.net收集整理)
2.2 SQL语句的解析
为了避免SQL语句在执行时出现语法错误,需要提前检查其语法的正确性。SQL语句是面向集合的数据操作语言,只能交由SQL引擎处理。但是PL/SQL语言为了增强SQL语句与过程式语句的交互能力,在SQL语句中引入变量,GKD-BASE的SQL引擎无法识别,必须在提交之前提取出变量,替换为SQL引擎可以识别的格式。如:SELECT empno,n
《GKD-BASE PL/SQL引擎实现关键技术研究》