天天看點

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);

   }

}

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請注明:部落格園