jdbc調用存儲過程和函數

 一:無返回值的存儲過程java

 
表:
 
create table person(id number not null primary key,name varchar2(20),age int);
 
存儲過程爲:
CREATE OR REPLACE PROCEDURE insertperson(name IN VARCHAR2,age IN int)  AS
BEGIN 
   INSERT INTO person VALUES (seq_id.nextval,name, age);
   commit;
END insertperson;
 
Java代碼:
public static Connection getConnection(){
Connection con = null ;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orclzy", "zy", "oracle");
} catch (ClassNotFoundException e) {
System.out.println("驅動找不到");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("鏈接數據庫出現異常");
e.printStackTrace();
}
return con ;
}
public void insertperson(String name,int age){
Connection con = ProcedureTest.getConnection() ;
                CallableStatement cst = null ;
try {
cst = con.prepareCall("{call insertperson(?,?)}");
cst.setString(1, name);
cst.setInt(2, age);
cst.execute();
System.out.println("插入數據成功");
} catch (SQLException e) {
e.printStackTrace();
}finally{
try { 
                                cst.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
 
 
二:有返回值的存儲過程(單個返回值)
 
存儲過程爲:
 
CREATE OR REPLACE PROCEDURE selectNameByid(pid IN number,pname OUT VARCHAR2)  AS
BEGIN 
   SELECT name INTO pname FROM person WHERE id=pid; 
END selectNameByid;
 
Java代碼:
public void findNamepersonByid(int id){
Connection con = ProcedureTest.getConnection() ;
ResultSet rs = null ;
CallableStatement cst = null ;
try {
cst = con.prepareCall("{call selectNameByid(?,?)}");
cst.setInt(1, id);
cst.registerOutParameter(2, Types.VARCHAR);
cst.execute();
String name = cst.getString(2);
System.out.println("name:"+name);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try { 
                                cst.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
 
 
三:返回列表
 
因爲oracle存儲過程沒有返回值,它的全部返回值都是經過out參數來替代的,
列表一樣也不例外,但因爲是集合,因此不能用通常的參數,必需要用pagkage了.可分兩部分實現:
 
一、建一個程序包。以下:
 
CREATE OR REPLACE PACKAGE PERSONPACKAGE  AS
 TYPE PERSON_CURSOR IS REF CURSOR;
end PERSONPACKAGE;
/
 
二、創建存儲過程,存儲過程爲:
 
CREATE OR REPLACE PROCEDURE findallperson(p_CURSOR out PERSONPACKAGE.PERSON_CURSOR) IS 
BEGIN
    OPEN p_CURSOR FOR SELECT * FROM person;
END findallperson;
 
能夠看到,它是把遊標(能夠理解爲一個指針),做爲一個out 參數來返回值的。
 
在java裏調用時就用下面的代碼:
public void findAllPerson(){
Connection con = ProcedureTest.getConnection() ;
ResultSet rs = null ;
CallableStatement cst = null ; 
try {
cst = con.prepareCall("{call findallperson(?)}");
cst.registerOutParameter(1, OracleTypes.CURSOR);
cst.execute();
rs = (ResultSet)cst.getObject(1);
while(rs.next()){
System.out.println(rs.getInt("id")+"   "+rs.getString("name")+"   "+rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
cst.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
 
在這裏要注意,在執行前必定要先把oracle的驅動包放到class路徑裏,不然會報錯的。
 
-------------------------------------------------------------------------------
4、jdbc調用自定義函數
 
CREATE OR REPLACE FUNCTION get_age(pid in person.id%type)
return number
is
v_age person.id%type :=0;
begin
select age into v_age from person where id=pid;
return v_age;
end;
/
 
在java代碼裏去調用函數:
public void invokeFunction() {
Connection con = null ;
CallableStatement cs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Properties p = new Properties();
p.load(new FileInputStream("config.properties"));
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orclzy", p);
System.out.println("con: " + con);
// 調用一個沒有參數的函數 函數返回 a int 預處理callable語句
cs = con.prepareCall("{? = call get_age(1)}");
// 註冊返回值類型
cs.registerOutParameter(1, Types.INTEGER);
// Execute and retrieve the returned value
cs.execute();
int age = cs.getInt(1);
System.out.println("age:"+age);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
con.close();
cs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
 
}
相關文章
相關標籤/搜索