GKD-BASE PL/SQL引擎实现关键技术研究
这个SELECT语句首先把变量v_date绑定到列名birthday,然后根据条件查出相应的结果 (empno,name),并赋值给预先定义的变量(v_empno,v_name)。对于GKD-BASE的SQL引擎来说,只能识别出如下格式的SELECT语句:
SELECT empno,name INTO:v_empno,:v_nameFROM emp WHERE birthday=:1;
在把SQL语句交由GKD-BASE SQL引擎处理之前,识别出变量v_empno、v_name及v_date进行格式转换,在into之后的变量前面添加“:”,where后面的变量用带有冒号的数字序号代替,构造出符合SQL引擎要求的语句;完成这些处理之后,把新的语句作为字符串交由SQL引擎进行语法分析,检查这条语句的语法是否正确,以及语句中的变量与对应的列是否匹配;最后返回结果,报错或者生成语法树。
2.3 游标的解析
游标是指向内存中上下文区的句柄或指针。借助于游标,PL/SQL程序可以控制上下文区和语句处理过程中游标的变化。PL/SQL游标按使用方式可以分为显式游标和隐式游标。
显式游标的使用包括声明游标、打开游标、游标检索、关闭游标四个步骤。编译游标声明语句时,首先调用SQL引擎分析SQL语句成分,转换为SQL引擎可以识别的格式,把游标的索引信息加入名字堆栈和符号表中。游标打开操作在名字堆栈中搜索游标名字,获取声明阶段在符号表保存的相关信息并加入到语法树中。游标检索语句的编译首先获取游标的符号表的信息;然后关联游标中SQL语句的信息和取值变量链表的信息,检查游标变量与游标引用列是否匹配;最后保存相关信息,加入语法树。游标的关闭操作释放资源并把游标状态初始化,把游标在符号表中的信息保存并加入语法树。
隐式游标一般用于对DML语句的处理。每条DML语句对应于一个隐式游标,编译时可以作为一般的SQL语句来处理,直接调用GKD-BASE的SQL引擎对其进行编译。这些语句的游标处理是由SQL引擎自动完成的,不需要PL/SQL引擎对干涉。
图3
3 GKD-BASE PL/SQL解释器实现中的一些关键问题
解释器实现中的关键问题有语句的执行、执行状态堆栈的设计以及返回值的处理。
对于语句的执行,可分为SQL语句执行和过程语句执行两部分,根据语法树上相应节点分别编写函数来完成解释任务。这些函数例程之间也是树状的层次调用结构,树根的解释执行依赖于其子树上各个节点的解释函数的成功运行。
在GKD-BASE PL/SQL引擎的解释执行器中,设计了“执行状态”的数据结构来记载函数的执行状态信息。解释器中所有的解释函数都拥有一个指针参数指向这个结构,需要在这些函数间传递的信息将被拷贝到这个结构。PL/SQL引擎调用子程序的过程中,构造“执行状态堆栈”。调用之前,保存现场,将执行状态压栈;调用结束后恢复现场,弹出当前执行状态,回到上一层继续,如图3。
在语句块执行完毕后,解释器会根据情况给出三种类型的返回状态:ok、exit、return。当正常执行完一条过程语句或SQL语句后,返回ok;或者当执行状态当前层中所有语句都执行正常,向上一层返回ok。当执行时遇到EXIT关键字,如果执行状态中的退出标号与输人参数中的退出标号一致时,说明是正常退出,返回exit。当执行时遇到RETURN关键字,说明语句链中所有语句执行完毕,返回return。直到到达执行状态顶层并给出返回值,结束整个解释执行过程。
《GKD-BASE PL/SQL引擎实现关键技术研究(第2页)》