1. 程式人生 > >Java如何實現對儲存過程的呼叫:

Java如何實現對儲存過程的呼叫:

一、Java如何實現對儲存過程的呼叫:

A:不帶輸出引數的

  1. create procedure getsum  
  2. @n int =0<--此處為引數-->  
  3. as 
  4. declare @sum int<--定義變數-->  
  5. declare @i int 
  6. set @sum=0  
  7. set @i=0  
  8. while @i<
    [email protected]
     begin 
  9. set @[email protected][email protected]  
  10. set @[email protected]+1  
  11. end 
  12. print 'the sum is '+ltrim(rtrim(str(@sum))) 

在SQL中執行:

exec getsum 100

在JAVA中呼叫:

JAVA可以呼叫 但是在JAVA程式卻不能去顯示該儲存過程的結果 因為上面的儲存過程的引數型別int 傳遞方式是in(按值)方式

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //建立儲存過程的物件  
  13. CallableStatement c=conn.prepareCall("{call getsum(?)}");  
  14.  
  15. //給儲存過程的引數設定值  
  16. c.setInt(1,100); //將第一個引數的值設定成100  
  17.  
  18. //執行儲存過程  
  19. c.execute();  
  20. conn.close();  
  21. }  
  22. }  
  23.  

B:帶輸出引數的

1:返回int

  1. alter procedure getsum  
  2. @n int =0,  
  3. @result int output 
  4. as 
  5. declare @sum int 
  6. declare @i int 
  7. set @sum=0  
  8. set @i=0  
  9. while @i<[email protected] begin 
  10. set @[email protected][email protected]  
  11. set @[email protected]+1  
  12. end 
  13. set @[email protected] 

在查詢分析器中執行:

  1. declare @myResult int 
  2. exec getsum 100,@myResult output 
  3. print @myResult 

在JAVA中呼叫:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //建立儲存過程的物件  
  13. CallableStatement c=conn.prepareCall("{call getsum(?,?)}");  
  14.  
  15. //給儲存過程的第一個引數設定值  
  16. c.setInt(1,100);  
  17.  
  18. //註冊儲存過程的第二個引數  
  19. c.registerOutParameter(2,java.sql.Types.INTEGER);  
  20.  
  21. //執行儲存過程  
  22. c.execute();  
  23.  
  24. //得到儲存過程的輸出引數值  
  25. System.out.println (c.getInt(2));  
  26. conn.close();  
  27. }  
  28. }  

2:返回varchar

儲存過程帶遊標:

在儲存過程中帶遊標 使用遊標不停的遍歷orderid

  1. create procedure CursorIntoProcedure  
  2. @pname varchar(8000) output 
  3. as 
  4. --定義遊標  
  5. declare cur cursor for select orderid from orders  
  6. --定義一個變數來接收遊標的值  
  7. declare @v varchar(5)  
  8. --開啟遊標  
  9. open cur  
  10. set @pname=''--給@pname初值  
  11. --提取遊標的值  
  12. fetch next from cur into @v  
  13. while @@fetch_status=0  
  14. begin 
  15.  
  16.  
  17. set @[email protected]+';'[email protected]  
  18. fetch next from cur into @v  
  19. end 
  20. print @pname  
  21. --關閉遊標  
  22. close cur  
  23. --銷燬遊標  
  24. deallocate cur 

執行儲存過程:

  1. exec CursorIntoProcedure '' 

JAVA呼叫:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10. CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");  
  11.  
  12.  
  13. c.registerOutParameter(1,java.sql.Types.VARCHAR);  
  14.  
  15. c.execute();  
  16.  
  17. System.out.println (c.getString(1));  
  18. conn.close();  
  19. }  
  20. }  

C:刪除資料的儲存過程

儲存過程:

  1. drop table 學生基本資訊表  
  2. create table 學生基本資訊表  
  3. (  
  4. StuID int primary key,  
  5. StuName varchar(10),  
  6. StuAddress varchar(20)  
  7. )  
  8. insert into 學生基本資訊表 values(1,'三毛','wuhan')  
  9. insert into 學生基本資訊表 values(2,'三毛','wuhan')  
  10. create table 學生成績表  
  11. (  
  12. StuID int,  
  13. Chinese int,  
  14. PyhSics int 
  15. foreign key(StuID) references 學生基本資訊表(StuID)  
  16. on delete cascade  
  17. on update cascade  
  18. )   
  19. insert into 學生成績表 values(1,99,100)  
  20. insert into 學生成績表 values(2,99,100) 

建立儲存過程:

  1. create procedure delePro  
  2. @StuID int 
  3. as 
  4. delete from 學生基本資訊表 where [email protected]  
  5. --建立完畢  
  6. exec delePro 1 --執行儲存過程  
  7. --建立儲存過程  
  8. create procedure selePro  
  9. as 
  10. select * from 學生基本資訊表  
  11. --建立完畢  
  12. exec selePro --執行儲存過程 

在JAVA中呼叫:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //建立儲存過程的物件  
  13. CallableStatement c=conn.prepareCall("{call delePro(?)}");  
  14.  
  15. c.setInt(1,1);  
  16.  
  17. c.execute();  
  18.  
  19. c=conn.prepareCall("{call selePro}");  
  20. ResultSet rs=c.executeQuery();  
  21.  
  22. while(rs.next())  
  23. {  
  24. String Stu=rs.getString("StuID");  
  25. String name=rs.getString("StuName");  
  26. String add=rs.getString("StuAddress");  
  27.  
  28. System.out.println ("學號:"+" "+"姓名:"+" "+"地址");  
  29. System.out.println (Stu+" "+name+" "+add);  
  30. }  
  31. c.close();  
  32. }  

D:修改資料的儲存過程

建立儲存過程:

  1. create procedure ModPro  
  2. @StuID int,  
  3. @StuName varchar(10)  
  4. as 
  5. update 學生基本資訊表 set [email protected] where [email protected] 

執行儲存過程:

  1. exec ModPro 2,'四毛' 

JAVA呼叫儲存過程:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //建立儲存過程的物件  
  13. CallableStatement c=conn.prepareCall("{call ModPro(?,?)}");  
  14.  
  15. c.setInt(1,2);  
  16. c.setString(2,"美女");  
  17.  
  18. c.execute();  
  19.  
  20. c=conn.prepareCall("{call selePro}");  
  21. ResultSet rs=c.executeQuery();  
  22.  
  23. while(rs.next())  
  24. {  
  25. String Stu=rs.getString("StuID");  
  26. String name=rs.getString("StuName");  
  27. String add=rs.getString("StuAddress");  
  28.  
  29. System.out.println ("學號:"+" "+"姓名:"+" "+"地址");  
  30. System.out.println (Stu+" "+name+" "+add);  
  31. }  
  32. c.close();  
  33. }  

E:查詢資料的儲存過程(模糊查詢)

儲存過程:

  1. create procedure FindCusts  
  2. @cust varchar(10)  
  3. as 
  4. select customerid from orders where customerid   
  5. like '%'[email protected]+'%' 

執行:

  1. execute FindCusts 'alfki' 

在JAVA中呼叫:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //建立儲存過程的物件  
  13. CallableStatement c=conn.prepareCall("{call FindCusts(?)}");  
  14. c.setString(1,"Tom");  
  15.  
  16. ResultSet rs=c.executeQuery();  
  17.  
  18. while(rs.next())  
  19. {  
  20. String cust=rs.getString("customerid");   
  21. System.out.println (cust);  
  22. }  
  23. c.close();  
  24. }  

F:增加資料的儲存過程

儲存過程:

  1. create procedure InsertPro  
  2. @StuID int,  
  3. @StuName varchar(10),  
  4. @StuAddress varchar(20)  
  5. as 
  6. insert into 學生基本資訊表 values(@StuID,@StuName,@StuAddress) 

呼叫儲存過程:

  1. exec InsertPro 5,'555','555' 

在JAVA中執行:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //建立儲存過程的物件  
  13. CallableStatement c=conn.prepareCall("{call InsertPro(?,?,?)}");  
  14. c.setInt(1,6);  
  15. c.setString(2,"Liu");  
  16. c.setString(3,"wuhan");  
  17.  
  18. c.execute();  
  19.  
  20. c=conn.prepareCall("{call selePro}");  
  21. ResultSet rs=c.executeQuery();  
  22.  
  23. while(rs.next())  
  24. {  
  25. String stuid=rs.getString("StuID");   
  26. String name=rs.getString("StuName");   
  27. String address=rs.getString("StuAddress");   
  28. System.out.println (stuid+" "+name+" "+address);  
  29. }  
  30. c.close();  
  31. }  

G:在JAVA中建立儲存過程 並且在JAVA中直接呼叫

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //載入驅動  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //獲得連線  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. Statement stmt=conn.createStatement();  
  13. //在JAVA中建立儲存過程  
  14. stmt.executeUpdate("create procedure OOP as select * from 學生成績表");  
  15.  
  16.  
  17. CallableStatement c=conn.prepareCall("{call OOP}");  
  18.  
  19. ResultSet rs=c.executeQuery();  
  20. while(rs.next())  
  21. {  
  22. String chinese=rs.getString("Chinese");  
  23.  
  24. System.out.println (chinese);  
  25. }  
  26. conn.close();  
  27.  
  28. }  

https://www.cnblogs.com/littleCode/p/3461017.html