首页 > 代码库 > 数据库技术之存储过程设计与实现(三)

数据库技术之存储过程设计与实现(三)

原创性声明

此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/39251241如果进行转载请注明出处。本文作者原创,邮箱zhujunxxxxx@163.com,如有问题请联系作者

 

一个java模拟的存储过程

在前两篇博客中介绍了存储过程的设计方法和数据结构。但是没有一个例子恐怕文章在好也没有很容易理解把

为此博主专门给了一个实例,我用java模拟了一个存储过程来实现,由于java下我没有进行词法语法解析,所以我的语法树就得自己来构造了(这真累)

我的所有表达式计算都是通过数据引擎计算的(其实很多数据库的存储过程都是这样的 比如postgresql)

先把给出我的数据结构

数据结构类

package java_test;

import java.util.List;

enum NodeType
{
	t_none,t_var,t_stmt,t_create,t_declare,t_set,t_expr,
	t_if,t_elseif,t_when,t_case,t_while,t_for,
	t_exec,t_proc
}
enum DataType{
	TT_INT,TT_CHAR,TT_BOOL,TT_DATE,TT_TIME,TT_APPROXNUM,TT_NULL,TT_VAR,TT_EXPR,TT_SIGN
}

class Node {
	int dno;
	NodeType node_type;

}
class VarNode extends Node{
	String		var_name;
	DataType	data_type;
	int			isconst;
	int			notnull;
	String		default_val;/*默认值*/
	int			isnull;
	String 		setvalue;/*赋值过后值*/
	ExprNode	expr_value;
}

class  DeclareNode extends Node{
	List<Node>		var_list;/*这个declare语句所包含的变量*/
}
class  DeclNode extends Node{	/*定义存储过程的节点*/


	String		proc_name;/*存储过程名*/
	List<Node> 		params;/*存储过程参数*/
}
/*终结点*/
class  ProcNode extends Node{

	DeclNode	declnode;/*定义存储过程的节点*/
	List<Node> 	 	proc_body;/*存储过程的具体块,我觉得它有各种 if-else declare set sql when-case for while 构成的list*/
	List<Node>		except_list;/*异常列表*/
}
class  StmtNode extends Node{/*具体的一个sql语句节点*/
	int			sql_type;
	String		str_sql;
	List<Node>		params;/*此sql语句的参数*/
}

class  SetNode extends Node{
	List<Node>		var_list;/*这个set语句所包含的变量,和具体的值*/
}

class  ExprNode extends Node{

	int			is_const;/*是否是常量 -1 0 1*/ 
	int 		is_wrap;/*是否有括号*/
	DataType	data_type;/*类型*/
	String		const_value;/*常量表达式的*/
	String		sign;
	String		param;
	String		str_value;/*无用*/
	VarNode		var_value;/*变量表达式的变量*/
	ExprNode 	lnext;
	ExprNode 	rnext;
}

class  IfNode extends Node{

	ExprNode	expr;
	List<Node>		then_body;
	List<Node>		elseif_body;
	List<Node>		else_body;
}
class  ElseIfNode extends Node{
	ExprNode	expr;
	List<Node>	body;
}

class  CaseNode extends Node{
	ExprNode	expr;
	List<Node>		case_list;
	int			have_else;
	List<Node>		else_stmts;
} 

class  WhenNode extends Node{
	ExprNode	expr;
	List<Node>		stmts;
}

class  WhileNode extends Node{

	ExprNode	expr;
	List<Node>	body;
}

class  ForNode extends Node{

	ExprNode	lower;
	ExprNode	upper;
	ExprNode	step;
	List<Node>		body;
}

class  ProcExecState{
	int 		dno;
	ProcNode  	proc;
	int			rettype;
	Node 		lastnode;
	Node 		nextnode;
	String 		error;
}
class Dataum
{
	DataType type;
	String value;
	boolean is_init;
	public Dataum(DataType t)
	{
		this.type=t;
		is_init=false;
	}
	public Dataum(DataType t,String v)
	{
		this.type=t;
		this.value=http://www.mamicode.com/v;>


 

这个类就是我们基本的数据结构

 

然后是一个解释器类,专门用来解释执行语法树的

解释器类

package java_test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


enum ProcSQLState
{
	PROC_SQL_RC_ERROR(0),
	PROC_SQL_RC_OK(1),
	PROC_SQL_RC_EXIT(2),
	PROC_SQL_RC_CONTINUE(3),
	PROC_SQL_RC_RETURN(4);
	
    private int nCode ;
    private ProcSQLState( int _nCode) {
          this . nCode = _nCode;
    }
    public int toInt()
    {
    	return this.nCode;
    }
    @Override
    public String toString() {
         return String.valueOf (this.nCode );
    }
}
public class language {

	public static MysqlHelper mysql=new MysqlHelper();
	public static HashMap<String,Object> var_table =new HashMap<String,Object>();
	public static int exec_stmts(ProcExecuteState estate,List<Node> stmts)
	{
		if(stmts==null)
			return 0;
		for (Node node : stmts) {
			int rc=exec_stmt(estate,node);
			if(rc==0)
				return 0;
		}
		return 1;
	}
	public static int exec_stmt(ProcExecuteState estate,Node stmt)
	{
		int rc=-1;
		switch(stmt.node_type)
		{
			case t_if:
				rc=exec_stmt_if(estate,(IfNode)stmt);
				break;
			case t_while:
				rc=exec_stmt_while(estate,(WhileNode)stmt);
				break;
			case t_case:
				rc=exec_stmt_case(estate,(CaseNode)stmt);
				break;
			case t_declare:
				rc=exec_stmt_declare(estate,(DeclareNode)stmt);
				break;
			case t_set:
				rc=exec_stmt_assign(estate,(SetNode)stmt);
				break;
			case t_stmt:
				rc=exec_stmt_sql(estate,(StmtNode)stmt);
				break;
			default:
				break;

		}
		return rc;
	}
	public static int exec_stmt_declare(ProcExecuteState estate,DeclareNode stmt)
	{
		for (Node node : stmt.var_list) {
			VarNode vnode=(VarNode)node;
			if(vnode.isconst!=1)
			{
				Dataum data=http://www.mamicode.com/new Dataum(vnode.data_type);>

可以看出来一个存储过程的执行基本上就是一个递归的过程

此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/39251241如果进行转载请注明出处。本文作者原创,邮箱zhujunxxxxx@163.com,如有问题请联系作者

作者简介

作者是一名软件工程出生的苦逼程序员,本科阶段也是软件工程,目前研究生在读,热爱新技术,热爱编程,为人幽默,热爱开源。

个人网站:http://www.zhujuncoding.com/

github: https://github.com/zhujunxxxxx/

邮箱: zhujunxxxxx@163.com

数据库技术之存储过程设计与实现(三)