快速过一下存储过程

学习流程

  • 先去Wiki/IBM等资料库快速学习入门一下
  • 掌握一下某个厂商(比如Oracle)的DDL
  • 掌握其在Hibernate等库中的使用方法(本文略)

如何创建存储过程?

存储过程即可以通过鼠标在软件中点点点完成创建(强烈推荐),也可以直接手写

Oracle的文档中对存储过程有一个明确的定义,可以看出它过于接近原生AST了,因此写起来有样板代码过多的感觉。

create_procedure

我们在网上找一个PROCEDURE的例子

CREATE OR REPLACE PROCEDURE count_comments (  
   postId IN NUMBER,  
   commentCount OUT NUMBER )  
AS 
BEGIN 
    SELECT COUNT(*) INTO commentCount  
    FROM post_comment  
    WHERE post_id = postId; 
END;

如果通过Groovy的Closure进行类比,它实际上就是这样的

def count_comments = {NUMBER postId->
	NUMBER commentCount = "SELECT COUNT(*) FROM post_comment WHERE post_id = postId".eval();
  	return commentCount
}

所以存储过程是一个非常简单的函数,纯体力劳动,甚至外包都会写。并不是很多博客上说的高级DBA操作。

一般用存储过程干啥?

上面也说了存储过程一般只是一个纯函数,而在实际业务开发中,我们通常直接用XML/注解等DSL在Java源码中去描述数据库中的对象,然后再调用Hibernate等工具帮你生成SQL,而不是手动拼接SQL(有注入风险,而且拼接的SQL项目难维护)。

那么为什么需要存储过程呢?当然是不得不用时才会用,比如超大数据,性能问题才会使用。

SQL是一种对数据库进行查询操作的外部DSL,相对于Java/js等语言来说,学起来并不舒服。王垠曾在一篇文章中批评过“数据库完全可以使用普通的程序语言(Java,Scheme 等)的“远程执行”来进行查询,而不需要专门的查询语言"。

今天本文说的存储过程就是SQL中的”函数“,它用于直接操作数据库中的”结构体“数组,与JVM类语言中设计的Closure并没有什么本质的不同。