第一篇:[轉載]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.
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(“
}
}
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);
要求你的存儲過程必須能返回記錄集,否則要出錯
如果你的存儲過程是完成非查詢任務就應該在配置文件用以下三個標簽
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.tmdps.cn