什么是存储过程
stored procedure允许将运行于数据库层中的持久性逻辑与运行于中间层的商务逻辑有效地分离开来。这种分离可以降低整个应用程序的复杂性,并提供其重用性、安全性、性能和可伸缩性。
它非常类似于Java语言的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存,这样下次执行的时候直接使用缓存中的语句,这样就可以提高存储过程的性能。
但是,妨碍存储过程广泛使用的一个主要障碍是不同数据库厂商使用各种专有的、且依赖于数据库的实现语言。使用基于Java在存储过程可以解决这一问题。
选择PL/SQL还是Java
- 对于要求与SQL进行无缝集成的数据库中心来说,使用PL/SQL,从而完成对数据库对象、类型和特性的访问。
- 出于与数据库的无关性考虑时,可以选择Java。OracleJVM使得Java可以运行在数据库中。
Grails访问存储过程
给Grails项目配置好数据源以后,就可以访问数据库了。Grails开发平台已经为我们配置好了Hibernate,我们可以使用GORM通过Hibernate访问访问数据库。下面使用GSQL访问存储过程。
例子:
1.我们有一个叫“PA_PPRM_PivotCar.P_Tran”的存储过程,有三个输入参数,没有输出参数。作用是简单的insert。
下面我们来访问这个存储过程。
class LoginService {
def dataSource
def check(User u) {
我们对存储过程的访问都是在service层进行的,注意声明dataSource,这样Grails平台会将dataSource对象通过Spring注入进来,我们就可以在服务层使用数据源了。
我们对存储过程的访问在check(User u)方法里,下面是代码:
Sql sql = new Sql(dataSource)
上面的代码是初始化Sql对象,记得引入该类,“import groovy.sql.Sql”,然后就可以访问存储过程了:
sql.call("call PA_PPRM_PivotCar.P_Tran(?,?,?)",['3','cheng','m'])
}
下面我们把上面的“PA_PPRM_PivotCar.P_Tran”进行改造,给这个存储过程一个返回值。
def retn
sql.call("call PA_PPRM_PivotCar.P_Tran(?,?,?,?)",['3','cheng','m', Sql.VARCHAR]){
retn = it
}
可以看到,存储过程后面跟着四个问号,其中三个代表入参,最后一个代表出参。
下面,我们再把存储过程的输出参数难度加大,我们现在有这样一个存储过程“PA_PPRM_PivotCar.P_PivotCar_GetList”,它有一个输入参数,还有一个输出参数,但这个输出参数是游标。
sql.call("call PA_PPRM_PivotCar.P_PivotCar_GetList(?,?)",['2008',Sql.resultSet(OracleTypes.CURSOR)]){
carModel ->
carModel.eachRow(){
x ->
println"car style: ${x.carStyle},car series: ${x.carseries},car type: ${x.cartype}"
}
}
最后欢迎大家访问我的个人网站:1024s