天天看點

JAVA中對存儲過程的調用方法(引)

一:Java如何實作對存儲過程的調用:

   A:不帶輸出參數的

   ---------------不帶輸出參數的----------------------------------

create procedure getsum

@n int =0<--此處為參數-->

as

declare @sum int<--定義變量-->

declare @i int

set @sum=0

set @i=0

while @i<=@n begin

set @sum=@sum+@i

set @i=@i+1

end

print 'the sum is '+ltrim(rtrim(str(@sum)))

--------------在SQL中執行:--------------------

   exec getsum 100

------------在JAVA中調用:---------------------

   JAVA可以調用   但是在JAVA程式卻不能去顯示該存儲過程的結果 因為上面的存儲

   過程的參數類型int 傳遞方式是in(按值)方式

   import java.sql.*;

public class ProcedureTest

{

public static void main(String args[]) throws Exception

   //加載驅動

   DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());

   //獲得連接配接

   Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");

         //建立存儲過程的對象

         CallableStatement c=conn.prepareCall("{call getsum(?)}");

         //給存儲過程的參數設定值

         c.setInt(1,100);   //将第一個參數的值設定成100

         //執行存儲過程

         c.execute();

         conn.close();

}

   B:帶輸出參數的

     1:傳回int

         -------------------------帶輸出參數的----------------

alter procedure getsum

@n int =0,

@result int output

declare @sum int

set @result=@sum

   -------------------在查詢分析器中執行------------

   declare @myResult int

exec getsum 100,@myResult output

print @myResult

   ------------在JAVA中調用---------------------

import java.sql.*;

         CallableStatement c=conn.prepareCall("{call getsum(?,?)}");

         //給存儲過程的第一個參數設定值

         c.setInt(1,100);

         //注冊存儲過程的第二個參數

         c.registerOutParameter(2,java.sql.Types.INTEGER);

         //得到存儲過程的輸出參數值

         System.out.println (c.getInt(2));

     2:傳回varchar

       ----------------存儲過程帶遊标----------------

---在存儲過程中帶遊标   使用遊标不停的周遊orderid

create procedure CursorIntoProcedure

@pname varchar(8000) output

--定義遊标

declare cur cursor for select orderid from orders

--定義一個變量來接收遊标的值

declare @v varchar(5)

--打開遊标

open cur

set @pname=''--給@pname初值

--提取遊标的值

fetch next from cur into @v

while @@fetch_status=0

   begin

set @pname=@pname+';'+@v

   fetch next from cur into @v

print @pname

--關閉遊标

close cur

--銷毀遊标

deallocate cur

   ------------執行存儲過程--------------

exec CursorIntoProcedure ''

   --------------JAVA調用------------------

   CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");

   c.registerOutParameter(1,java.sql.Types.VARCHAR);

   c.execute();

   System.out.println (c.getString(1));

   conn.close();

   C:删除資料的存儲過程

     ------------------存儲過程--------------------------

drop table 學生基本資訊表

create table 學生基本資訊表

(

StuID int primary key,

StuName varchar(10),

StuAddress varchar(20)

)

insert into   學生基本資訊表 values(1,'三毛','wuhan')

insert into   學生基本資訊表 values(2,'三毛','wuhan')

create table 學生成績表

StuID int,

Chinese int,

PyhSics int

foreign key(StuID) references   學生基本資訊表(StuID)

on delete cascade

on update cascade

insert into   學生成績表 values(1,99,100)

insert into   學生成績表 values(2,99,100)

--建立存儲過程

create procedure delePro

@StuID int

delete from 學生基本資訊表 where StuID=@StuID

--建立完畢

exec delePro 1   --執行存儲過程

create procedure selePro

select * from 學生基本資訊表

exec selePro   --執行存儲過程

     ------------------在JAVA中調用----------------

         CallableStatement c=conn.prepareCall("{call delePro(?)}");

         c.setInt(1,1);

         c=conn.prepareCall("{call selePro}");

         ResultSet rs=c.executeQuery();

         while(rs.next())

         {

         String Stu=rs.getString("StuID");

         String name=rs.getString("StuName");

         String add=rs.getString("StuAddress");

         System.out.println ("學号:"+"     "+"姓名:"+"     "+"位址");

         System.out.println (Stu+"     "+name+"   "+add);

         }

         c.close();

   D:修改資料的存儲過程

---------------------建立存儲過程---------------------

   create procedure ModPro

@StuID int,

@StuName varchar(10)

update 學生基本資訊表 set StuName=@StuName where StuID=@StuID

   -------------執行存儲過程-------------------------

exec ModPro 2,'四毛'

   ---------------JAVA調用存儲過程--------------------

         CallableStatement c=conn.prepareCall("{call ModPro(?,?)}");

         c.setInt(1,2);

         c.setString(2,"美女");

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

     -----------------存儲過程---------------------

create procedure FindCusts

@cust varchar(10)

select customerid from orders where customerid

like '%'+@cust+'%'

     ---------------執行---------------------------

execute FindCusts 'alfki'

   -------------在JAVA中調用--------------------------

         CallableStatement c=conn.prepareCall("{call FindCusts(?)}");

         c.setString(1,"Tom");

         String cust=rs.getString("customerid");       

         System.out.println (cust);

   F:增加資料的存儲過程

------------存儲過程--------------------

create procedure InsertPro

@StuName varchar(10),

@StuAddress varchar(20)

insert into 學生基本資訊表 values(@StuID,@StuName,@StuAddress)

-----------調用存儲過程---------------

exec InsertPro 5,'555','555'

-----------在JAVA中執行-------------

         CallableStatement c=conn.prepareCall("{call InsertPro(?,?,?)}");

         c.setInt(1,6);

         c.setString(2,"Liu");

         c.setString(3,"wuhan");

         String stuid=rs.getString("StuID");       

         String name=rs.getString("StuName");       

         String address=rs.getString("StuAddress");       

         System.out.println (stuid+"   "+name+"   "+address);

G:在JAVA中建立存儲過程   并且在JAVA中直接調用

   Statement stmt=conn.createStatement();

   //在JAVA中建立存儲過程

   stmt.executeUpdate("create procedure OOP as select * from 學生成績表");

   CallableStatement c=conn.prepareCall("{call OOP}");

   ResultSet rs=c.executeQuery();

   while(rs.next())

   {

   String chinese=rs.getString("Chinese");

   System.out.println (chinese);

   }

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園