快速过一下存储过程
学习流程
- 先去Wiki/IBM等资料库快速学习入门一下
- 掌握一下某个厂商(比如Oracle)的DDL
- 掌握其在Hibernate等库中的使用方法(本文略)
如何创建存储过程?
存储过程即可以通过鼠标在软件中点点点完成创建(强烈推荐),也可以直接手写
Oracle的文档中对存储过程有一个明确的定义,可以看出它过于接近原生AST了,因此写起来有样板代码过多的感觉。
我们在网上找一个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并没有什么本质的不同。