[转载]grails调用存储过程(Grails: calling a stored procedure)(范文模版)

时间:2019-05-13 16:14:34下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《[转载]grails调用存储过程(Grails: calling a stored procedure)(范文模版)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《[转载]grails调用存储过程(Grails: calling a stored procedure)(范文模版)》。

第一篇:[转载]grails调用存储过程(Grails: calling a stored procedure)(范文模版)

[转载]grails调用存储过程(Grails : calling a stored procedure)在特殊情况下,grails应用需要调用数据库的存储过程,这在grails的官方文档里边好像没有提到过,在james的blog里介绍如何解决这个问题。代码转贴如下

java 代码

1.class MainController {

2.3.def dataSource // using the datasource we define in the sprin

g's resources.xml

4.5.def index = {

6.Sql sql = new Sql(dataSource)

7.def row = sql.execute(“call create_daily_hours(${new Date

()+1})”)

8.}

9.}

需要说明的一些是:grails本身没有提供访问存储过程的便捷方法,而groovy的GSQL提供了,因此grails可以直接拿过来用了,当然也可以用spring的JdbcTemplate。

希望对grails用户有点用。

原文地址:http://grails.group.javaeye.com/group/blog/86666

My experience with grails is getting richer the longer I use it for web application developing.It's very nice that grails is built on top of

spring framework which we can take advantage of.I am not a spring user before but with a help from the nice people at the grails forum I was able to achieve what I want to do.Calling a stored procedure from a MySQL database or any other database is simple.First we need a datasource which spring could provide for us.I have the following code place in the resources.xml found in the spring folder in your grails folder.

org.hsqldb.jdbcDriver

jdbc:hsqldb:hsql://localhost

sa

I use connection pooling for better performance.In my controller here is how I use the datasource to call a store procedure.class MainController {

def dataSource // using the datasource we define in the spring's resources.xml

def index = {

Sql sql = new Sql(dataSource)

def row = sql.execute(“call create_daily_hours(${new Date()+1})”)}

}

That's it!Notice that I am using Groovy SQL instead of Spring JDBCTemplate.It's a lot more friendlier for a beginner.Grails really makes everything easy here and provides a lot of flexibility thanks to it's nice integration with spring.From here everything is possible.原文地址:

附:朝花夕拾——Groovy & Grails

posted on 2007-06-04 19:39 山风小子

第二篇:用java调用oracle存储过程总结

用java调用oracle存储过程总结

分类: PL/SQL系列 2009-09-24 15:08 253人阅读 评论(0)收藏 举报

声明:

以下的例子不一定正确,只是为了演示大概的流程。

一:无返回值的存储过程 存储过程为:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)AS BEGIN

INSERT INTO HYQ.B_ID(I_ID,I_NAME)VALUES(PARA1, PARA2);END TESTA;

然后呢,在java里调用时就用下面的代码: package com.hyq.src;

import java.sql.*;import java.sql.ResultSet;

public class TestProcedureOne {

public TestProcedureOne(){

}

public static void main(String[] args){

String driver = “oracle.jdbc.driver.OracleDriver”;

String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521: hyq ”;

Statement stmt = null;

ResultSet rs = null;

Connection conn = null;

CallableStatement cstmt = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(strUrl, “ hyq ”, “ hyq ”);

CallableStatement proc = null;

proc = conn.prepareCall(“{ call HYQ.TESTA(?,?)}”);

proc.setString(1, “100”);

proc.setString(2, “TestOne”);

proc.execute();

}

catch(SQLException ex2){

ex2.printStackTrace();

}

catch(Exception ex2){

ex2.printStackTrace();

}

finally{

try {

if(rs!= null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch(SQLException ex1){

}

}

} }

二:有返回值的存储过程(非列表)

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

存储过程为: CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)AS BEGIN

SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;END TESTB;

在java里调用时就用下面的代码: package com.hyq.src;

public class TestProcedureTWO {

public TestProcedureTWO(){

}

public static void main(String[] args){

String driver = “oracle.jdbc.driver.OracleDriver”;

String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;

Statement stmt = null;

ResultSet rs = null;

Connection conn = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(strUrl, “ hyq ”, “ hyq ”);

CallableStatement proc = null;

proc = conn.prepareCall(“{ call HYQ.TESTB(?,?)}”);

proc.setString(1, “100”);

proc.registerOutParameter(2, Types.VARCHAR);

proc.execute();

String testPrint = proc.getString(2);

System.out.println(“=testPrint=is=”+testPrint);

}

catch(SQLException ex2){

ex2.printStackTrace();

}

catch(Exception ex2){

ex2.printStackTrace();

}

finally{

try {

if(rs!= null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch(SQLException ex1){

}

}

} }

}

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE AS

TYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;

2,建立存储过程,存储过程为:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR)IS BEGIN

OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。在java里调用时就用下面的代码: package com.hyq.src;import java.sql.*;

import java.io.OutputStream;import java.io.Writer;

import java.sql.PreparedStatement;import java.sql.ResultSet;import oracle.jdbc.driver.*;

public class TestProcedureTHREE {

public TestProcedureTHREE(){

}

public static void main(String[] args){

String driver = “oracle.jdbc.driver.OracleDriver”;

String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;

Statement stmt = null;

ResultSet rs = null;

Connection conn = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(strUrl, “hyq”, “hyq”);

CallableStatement proc = null;

proc = conn.prepareCall(“{ call hyq.testc(?)}”);

proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

proc.execute();

rs =(ResultSet)proc.getObject(1);

while(rs.next())

{

System.out.println(“” + rs.getString(1)+ “”+rs.getString(2)+“”);

}

}

catch(SQLException ex2){

ex2.printStackTrace();

}

catch(Exception ex2){

ex2.printStackTrace();

}

finally{

try {

if(rs!= null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch(SQLException ex1){

}

}

} }

四。Hibernate调用存储过程

Connection con = session.connect();

CallableStatement proc = null;

con = connectionPool.getConnection();

proc = con.prepareCall(“{ call set_death_age(?, ?)}”);proc.setString(1, XXX);

proc.setInt(2, XXx);...proc.execute();

session.close();

在Hibernate中调用存储过程的示范代码--

如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:

create or replace procedure batchUpdateStudent(p_age in number)as begin update STUDENT set AGE=AGE+1 where AGE>p_age;end;以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程: tx = session.beginTransaction();Connection con=session.connection();String procedure = “{call batchUpdateStudent(?)}”;CallableStatement cstmt = con.prepareCall(procedure);cstmt.setInt(1,0);//把年龄参数设为0 cstmt.executeUpdate();tx.commit();在以上代码中,我用的是Hibernate的 Transaction接口来声明事务,而不是采用JDBC API来声明事务。

存储过程中有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:

代码内容

tx = session.beginTransaction();Connection con=session.connection();

String procedure = “{call batchUpdateCustomer(?)}”;

CallableStatement cstmt = con.prepareCall(procedure);

cstmt.setInt(1,0);//把年龄参数设为0

cstmt.executeUpdate();

tx.commit();

CREATE procedure selectAllUsers DYNAMIC RESULT SETS 1 BEGIN

DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR

SELECT * FROM test;

OPEN temp_cursor1;END;

映射文件中关于存储过程内容如下

............

{ ? = call selectAllUsers()}

{ ? = call selectAllUsers()} 也可以写成{ call selectAllUsers()},如果有参数就写成

{ ? = call selectAllUsers(?,?,?)}

代码中对query设置相应位置上的值就OK Java调用关键代码如下

Session session = HibernateUtil.currentSession();

Query query = session.getNamedQuery(“selectAllUsers”);

List list = query.list();

System.out.println(list);

要求你的存储过程必须能返回记录集,否则要出错

如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签

{call createPerson(?, ?)}

{? = call deletePerson(?)}

{? = call updatePerson(?, ?)} 有一点不好的地方就是调用存储过程获取记录集时,不能对Query使用

setFirstResult(int)和setMaxResults(int)方法来分页

第三篇:教学:数据库-存储过程资料

教学三:存储过程

一、教学目的

(1)掌握T-SQL流控制语句;(2)掌握创建存储过程的方法;(3)掌握存储过程的执行方法;(4)掌握存储过程的管理和维护。

二、教学内容

1、创建简单存储过程

(1)创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息。

if exists(select name from sysobjects where name='stu_pr'and type='p')begin print '已删除!' drop procedure stu_pr end else print '不存在,可创建!' go create procedure stu_pr as select * from Student_20103322 left outer join SC_20103322

on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where classno='051' 1

exec stu_pr

2、创建带参数的存储过程

(1)创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄,选修课程名、成绩。系名和姓名在调用该存储过程时输入,其默认值分别为“%”与“林%”。执行该存储过程,用多种参数加以测试。

if exists(select name from sysobjects where name='stu_proc1' and type='p')begin

print '已删除!' drop procedure stu_proc1 end else

print '不存在,可创建!' go create procedure stu_proc1 @Sdept char(8)='%',@Sname varchar(8)='林%' as select Sdept,Student_20103322.Sno,Sname,DATEDIFF(YEAR,Birth,GETDATE())age,Cname,Grade from Student_20103322,SC_20103322,Course_20103322 where Student_20103322.Sno=SC_20103322.Sno and Course_20103322.Cno=SC_20103322.Cno and Sdept like @Sdept and Sname like @Sname

execute stu_proc1 '计算机系','林红' 3

execute stu_proc1 '信息安全','胡光璟'

(2)创建一个名为Student_sc的存储过程,可查询出某段学号的同学的学号、姓名、总成绩。(学号起始号与终止号在调用时输入,可设默认值)。执行该存储过程。if exists(select name from sysobjects where name='Student_sc'and type='p')begin print '已删除!' drop procedure student_sc end else print '不存在,可创建!' go create procedure Student_sc @Sno1 char(8),@Sno2 char(8)as select Student_20103322.Sno,Sname,SUM(Grade)总成绩 from Student_20103322,SC_20103322,Course_20103322 where Student_20103322.Sno=SC_20103322.Sno and Course_20103322.Cno=SC_20103322.Cno and Student_20103322.Sno>=@Sno1 and Student_20103322.Sno<=@Sno2 group by Student_20103322.Sno,Sname

execute Student_sc '20110000','20110003' 5

3、创建带输出参数的存储过程

(1)创建一个名为Course_sum的存储过程,可查询某门课程考试的总成绩。总成绩可以输出,以便进一步调用。

if exists(select name from sysobjects where name='Course_sum'and type='p')begin print '已删除!' drop procedure Course_sum end else print '不存在,可创建!' go create procedure Course_sum @Cname varchar(20),@sum int output as select @sum=sum(Grade)from SC_20103322,Course_20103322 where Course_20103322.Cno=SC_20103322.Cno and Cname=@Cname

group by SC_20103322.Cno,Cname

declare @ping int exec Course_sum '高数',@ping output print '高数的考试总成绩为:'+cast(@ping as varchar(20))

(2)创建一执行该存储过程的批处理,要求当总成绩小于100时,显示信息为:“XX课程的总成绩为:XX,其总分未达100分”。超过100时,显示信息为:“XX课程的总成绩为:XX”。

declare @sum int

declare @Cname varchar(20)Exec Course_sum @cname,@sum out begin

if @sum <100 print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)+ ',其总分未达分'

else

print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)end

declare @sum int

declare @Cname varchar(20)set @Cname='高数' Exec Course_sum @cname,@sum out begin

if @sum <100 print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)+ ',其总分未达分'

else

print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)end

4、创建带重编译及加密选项的存储过程

创建一个名为update_sc、并带重编译及加密选项的存储过程,可更新指定学号、指定课程号的学生的课程成绩。(学号、课程号由调用时输入)

if exists(select name from sysobjects where name='update_sc'and type='p')begin print '已删除!' drop procedure update_sc end else print '不存在,可创建!' go create procedure update_sc

@sno char(8),@cno char(3),@grade tinyint with RECOMPILE , ENCRYPTION as update SC_20103322 set Grade=@grade

where Sno=@sno and Cno=@cno

declare @sno char(8),@cno char(3),@grade tinyint set @sno='20103322' set @cno='003' set @grade='100' exec update_sc @sno,@cno,@grade begin print cast(@sno as varchar)+'的'+cast(@cno as varchar)+'课程成绩为:'+cast(@grade as varchar)end

5、使用T-SQL语句管理和维护存储过程

(1)使用sp_helptext查看存储过程Student_sc的定义脚本

exec sp_helptext student_sc

(2)使用select语句查看Student_sc存储过程的定义脚本(提示:通过查询表sysobjects和表syscomments)

select *

from sysobjects,syscomments where name = 'Student_sc'

(3)将存储过程stu_pr改为查询学号为2011001的学生的详细资料。

alter procedure stu_pr as select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001'

(4)删除存储过程stu_pr。

drop procedure stu_pr

6、使用SQL Server Management Studio管理存储过程

(1)在SQL Server Management Studio中重新创建刚删除的存储过程stu_pr create procedure stu_pr as begin select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001' end

(2)查看存储过程stu_pr,并将该过程修改为查询051班女生的所有资料。

ALTER procedure [dbo].[stu_pr] as begin select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001' and Sex='女' end

(3)删除存储过程stu_pr

【完】

第四篇:网络数据库讲稿(存储过程)

网络数据库讲稿

4/15/2013

存储过程

P177

一、什么是存储过程

1.是一个过程,与其它语言中的过程几乎完全相同。它们可以接收参数、输出参数、返回单个或多个结果集以及返回值。2.存储在服务器上的数据库中,创建时进行编译。3.在后台运行,其主要功能是对数据库操作。4.可以在一个存储过程内调用其它存储过程。

二、.存储过程的分类

分为三类:用户自定义存储过程(普通存储过程),扩展存储过程,系统存储过程。

三、创建普通存储过程

CREATE PROCEDURE命令 例: 1.CREATE PROCEDURE 检索 @XH CHAR(6)AS SELECT * FROM 成绩 WHERE 学号=@XH 2.在成绩表中添加一条记录,如果成绩及格,还要在学生表中增加学分。

CREATE PROCEDURE 输入考试分数

@XH CHAR(6),@KCH CHAR(8),@FS DECIMAL(4,1)AS IF EXISTS(SELECT * FROM 学生 WHERE 学号=@XH)BEGIN

INSERT 成绩 VALUES(@XH,@KCH,@FS)

IF @FS>=60

UPDATE 学生 SET 已修学分

=已修学分+(SELECT 学分 FROM 课程 WHERE 课程编号=@KCH)

WHERE 学号=@XH END ELSE PRINT '无此学号'+@XH

3.在成绩表中删除指定学号和课程的记录,如果所删的分数及格,还要在学生表中减去对应的学分。CREATE PROCEDURE 删除考试分数

@XH CHAR(6),@KCH CHAR(8)AS DECLARE @FS DECIMAL(4,1)SET @FS=(SELECT MAX(分数)FROM 成绩

网络数据库讲稿

4/15/2013 WHERE 学号=@XH AND 课程编号=@KCH)IF @FS>0 DELETE FROM 成绩 WHERE 学号=@XH AND 课程编号=@KCH IF @FS>=60 UPDATE 学生 SET 已修学分

=已修学分-(SELECT 学分 FROM 课程 WHERE 课程编号=@KCH)

WHERE 学号=@XH

四、执行存储过程

P183 例: EXECUTE 检索 '200202' 检索 '200202' INSERT 成绩0 EXECUTE 检索 '200202' EXECUTE 输入考试分数 '200209','W2020610',56 EXECUTE 输入考试分数 '200209','W2020610',88 EXECUTE 输入考试分数 '200209','L2030506',90 如果执行存储过程是批处理中的第一条语句,则可以省略EXEC。

五、参数

P185 1.输入参数 按位置传递 用参数名传递 使用默认值

2.输出参数

P187 虚参和实参后边都要加上OUTPUT。例P187: CREATE PROC 班级人数@N INT OUTPUT,@CID CHAR(6)='200201' AS SELECT @N=COUNT(*)FROM 学生WHERE 班级=@CID

DECLARE @M INT EXEC 班级人数@M OUTPUT,'200208' SELECT @M

DECLARE @M INT EXEC 班级人数@M OUTPUT SELECT @M

六、查看存储过程信息

select * from sys.sql_modules SELECT OBJECT_DEFINITION(OBJECT_ID('检索'))

网络数据库讲稿

4/15/2013 sp_helptext 检索

七、修改存储过程

八、删除存储过程

1.在对象资源管理器或查询窗口中删除 2.用命令DROP PROCEDURE删除。

第五篇:mysql 5.0存储过程学习总结

mysql 5.0存储过程学习总结

一.创建存储过程 1.基本语法:

create procedure sp_name()begin end 2.参数传递

二.调用存储过程

1.基本语法:call sp_name()注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

三.删除存储过程 1.基本语法:

drop procedure sp_name// 2.注意事项

(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

四.区块,条件,循环 1.区块定义,常用 begin end;也可以给区块起别名,如: lable:begin end lable;可以用leave lable;跳出区块,执行区块以后的代码

2.条件语句 3.循环语句 :while循环 loop循环 repeat until循环 repeat until循环

五.其他常用命令

1.show procedure status 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等 2.show create procedure sp_name 显示某一个存储过程的详细信息

mysql存储过程基本函数

一.字符串类

CHARSET(str)//返回字串字符集 CONCAT(string2 [,...])//连接字串

INSTR(string ,substring)//返回substring首次在string中出现的位置,不存在返回0 LCASE(string2)//转换成小写

LEFT(string2 ,length)//从string2中的左边起取length个字符 LENGTH(string)//string长度

一起推论坛

一起推论坛www.xiexiebang.com

下载[转载]grails调用存储过程(Grails: calling a stored procedure)(范文模版)word格式文档
下载[转载]grails调用存储过程(Grails: calling a stored procedure)(范文模版).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    课题:SQLServer存储过程返回值总结

    SQLServer存储过程返回值总结 1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种......

    存储过程的优缺点个人总结

    优点 1.在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或bug),而不用重启服务器。但这一点便利被许多人滥用了。有人直接就在正式服务器上修改存储过程,而没有经过......

    数据库软件程序开发的存储调用指令设计论文(合集)

    摘 要:数据库软件是以计算机平台为基础,针对数据存储以及调用设计的一款智能化软件,其使用非常方便,智能化和集成化的能力也非常强。对于现有的技术而言,如何对数据库软件程序开......

    第8课 教小海龟用新命令 调用过程-教案

    XX学校2017-2018年度五年级下学期信息技术课程 第三册(下)教案------科任老师:XX 第八课 教小海龟用新命令—调用过程 一、教学内容 认识Logo调用过程,掌握Logo画保存图形方......

    第5章 视图、存储过程和用户自定义函数复习题范文

    第5章 视图、存储过程和用户自定函数 1.什么是基本表?什么是视图?两者的区别和联系是什么? 答: 基本表是本身独立存在的表,在 sQL 中一个关系就对应一个表。视图是从一个或几个基......

    SQL Sever 2005教案第13章 存储过程及自定义函数

    什么是存储过程,在存储在服务器上的T-SQL语句的命名集合,是封装性任务的方法,支持变量及条件的编程。 SQL Server的存储过程与其他编程语言中的过程(包括函数)类似,可以包含数据......

    sql 数据库 实验九:T-SQL语言、存储过程及数据库的安全性

    实验九:T-SQL语言、存储过程及数据库的安全性 一、实验目的 1. 掌握数据变量的使用; 2. 掌握各种控制语句及系统函数的使用; 3. 掌握存储过程的实现; 4. 掌握混合模式下数据库用......