Java 调用存储过程 返回结果集
? ?這里使用Oracle數(shù)據(jù)庫(kù)的thin連接。
???? 下面是存儲(chǔ)過(guò)程SQL
1 createorreplaceprocedure proc3(stid in student.stuid%type, stname out student.sname%type, stphone out student.phonenumber%type, stuadd out student.saddress%type)2 as countnumber number;
3 begin
4 selectcount(*) into countnumber from student where stuid=stid;
5 if countnumber=1then
6 select phonenumber into stphone from student where stuid=stid;
7 select saddress into stuadd from student where stuid=stid;
8 select sname into stname from student where stuid=stid;
9 else
10 dbms_output.put_line('返回值過(guò)多');
11 endif;
12 end;
??? 調(diào)用存儲(chǔ)過(guò)程時(shí),要用CallabelStatement的prepareCall 方法。結(jié)構(gòu):{call 存儲(chǔ)過(guò)程名(?,?,...)}
在設(shè)置參數(shù)的時(shí)候,輸入?yún)?shù)用set,輸出參數(shù)要registerOutParameter。取出輸出參數(shù)的值可以直接用CallabelStatement的get方法
?
import java.sql.CallableStatement;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
public class Dao {
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn=null;
CallableStatement cs=null;//PreparedStatement,Statement
ResultSet rs;
public void getConn(){
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, "scott", "tiger");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void callProc(){
try {
cs = conn.prepareCall("{call proc3(?,?,?,?)}");
cs.setInt(1, 1);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.VARCHAR);
cs.registerOutParameter(4, Types.VARCHAR);
cs.execute();
String name = cs.getString(2);
String phone = cs.getString(3);
String address = cs.getString(4);
System.out.println("Name:"+name+"\t Phone:"+phone+"\t Address:"+address);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if (cs!=null) cs.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Dao dao = new Dao();
dao.getConn();
dao.callProc();
}
}
?????? 以上方法只支持返回個(gè)別數(shù)據(jù)的,不能像SQL返回結(jié)果集類型那樣。其實(shí),Oracle并不能直接用存儲(chǔ)過(guò)程來(lái)返回結(jié)果集,需要借用包才能實(shí)現(xiàn)。看代碼:
1 CREATEORREPLACE PACKAGE mypack IS2 TYPE mycursor IS REF CURSOR;
3 PROCEDURE myproc(outcursor IN OUT mycursor);
4 END mypack;
這里建了一個(gè)包,其中有兩個(gè)元素:mycursor游標(biāo)和myproc存儲(chǔ)過(guò)程。執(zhí)行該語(yǔ)句之后要再定義這個(gè)包中的內(nèi)容,代碼如下:
1 CREATEORREPLACE PACKAGE BODY mypack IS2 PROCEDURE myproc(
3 outcursor IN OUT mycursor
4 )
5 IS
6 BEGIN
7 OPEN outcursor FOR
8 SELECT*FROM Student WHERE ROWNUM<10;
9 RETURN;
10 END myproc;
11 END;
這里詳細(xì)定義了mycursor和myproc的body。注意:CREATE PACKAGE和CREATE PACKAGE BODY不能一起執(zhí)行,必須先后執(zhí)行,否則會(huì)報(bào)錯(cuò)(用goto;連接是可以的)。OKay,包和存儲(chǔ)過(guò)程定義好了,該寫Java代碼了:
import java.sql.CallableStatement;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import oracle.jdbc.OracleTypes;
publicclass Dao {
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn=null;
CallableStatement cs=null;//PreparedStatement,Statement
ResultSet rs;
publicvoid getConn(){
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, "scott", "tiger");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
publicvoid callProc(){
try {
cs = conn.prepareCall("{call proc3(?,?,?,?)}");
cs.setInt(1, 1);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.VARCHAR);
cs.registerOutParameter(4, Types.VARCHAR);
cs.execute();
String name = cs.getString(2);
String phone = cs.getString(3);
String address = cs.getString(4);
System.out.println("Name:"+name+"\t Phone:"+phone+"\t Address:"+address);
} catch (SQLException e) {
e.printStackTrace();
}
}
publicvoid callProcForResult(){
try {
cs = conn.prepareCall("{call mypack.myproc(?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet)cs.getObject(1);
while(rs!=null&& rs.next()){
System.out.println(new StringBuilder("ID:").append(rs.getInt(1)).append("\t Name:").append(rs.getString(2))
.append("\t Phone:").append(rs.getString(6)).append("\t Address:").append(rs.getString(7)).toString());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
publicvoid closeConn(){
try {
if (cs!=null) cs.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
publicstaticvoid main(String[] args) {
Dao dao =new Dao();
dao.getConn(); //得到連接
dao.callProc(); //調(diào)用返回單屬性的存儲(chǔ)過(guò)程
dao.callProcForResult(); //調(diào)用返回結(jié)果集的存儲(chǔ)過(guò)程
dao.closeConn(); //關(guān)閉連接
}
}
轉(zhuǎn)載于:https://www.cnblogs.com/likeju/p/5009561.html
總結(jié)
以上是生活随笔為你收集整理的Java 调用存储过程 返回结果集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Web API Test Client
- 下一篇: Java 5种字符串拼接方式性能比较。