jdbc如何調用oracle儲存過程大全

-----------------無返回值示例------------------------

存儲過程:

·添加學生,如果班級不存在,則先添加班級信息,再添加學生。

create or replace procedure sp_add_stu
(
  p_stu_id t_stu.s_id%type, --參數類型定義爲字段類型
  p_s_name t_stu.s_name%type,
  p_c_id t_class.c_id%type
)
as
  num number;
  new_name t_stu.s_name%type;
begin
  --處理姓名(如果不從查詢結果取值,用 := )
  new_name := substr(trim(p_s_name),1,8);
 
  --將查詢結果保存到變量,只能用select into
   select count(*) into num from t_class c where c.c_id=p_c_id;
   if(num=0) then
       insert into t_class(c_id,c_name) values(p_c_id,'新班');
    end if;
   
  insert into t_stu(s_id,s_name,c_id,s_sex)
  values(p_stu_id,new_name,p_c_id,'1');
   
  commit;
 
  dbms_output.put_line('執行完畢');
end;

-----------------在Oracle中調用(無返回值)-----------------

SQL> call sp_add_stu(800,'李小龍',88);

 

Method called

 

SQL>

-----------------JDBC調用(無返回值)-----------------

Connection conn = null;

CallableStatement cstmt = null;

conn = DriverManager.getConnection(url, user, password);

String procedure = "{call sp_add_stu(?,?,?)}";

cstmt = conn.prepareCall(procedure);

cstmt.setString(1, "2000");

cstmt.setString(2, "張三);

cstmt.setString(3, "40");

cstmt.executeUpdate();

-----------------返回結果值示例------------------------

create or replace procedure sp_value(
id1 in number,
id2 out number
)
as
begin
  id2 := id1*200;
end;

-----------------調用(有簡單返回值)----------------

Connection conn = null;

CallableStatement cstmt = null;

conn = DriverManager.getConnection(url, user, password);

String procedure = "{call sp_value(?,?)}";

cstmt = conn.prepareCall(procedure);

--------------------JDBC獲取存儲過程中的值-------------------

//學號、姓名、班級編號

cstmt.setString(1, "2000");

//註冊輸出參數

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

cstmt.executeUpdate();

//從輸出參數中獲取值

int value = cstmt.getInt(2);

System.out.println("返回: "+value);

-----------------返回結果集示例------------------------

·建包,包中定義遊標類型變量

CREATE OR REPLACE PACKAGE TESTPACKAGE  AS

    TYPE Test_CURSOR IS REF CURSOR;

end;

·存儲過程返回指定遊標類型變量

CREATE OR REPLACE PROCEDURE sp_select_stu

(

p_c_id t_class.c_id%type,

p_cursor out TESTPACKAGE.Test_CURSOR

) IS

BEGIN

OPEN p_CURSOR FOR

   SELECT s.stu_id,s.s_name,to_char(s.s_birthday,'yy.mm') FROM t_stu s

   where s.c_id=p_c_id

   order by s.s_name;

END;

 

-----------------JDBC獲取存儲過程中的結果集---------------

Connection conn = null;

CallableStatement cstmt = null;

conn = DriverManager.getConnection(url, user, password);

String procedure = "{call sp_select_stu(?,?)}";

cstmt = conn.prepareCall(procedure);

//學號、姓名、班級編號

cstmt.setString(1, "C01");

//註冊輸出參數

cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);

cstmt.execute();

//從輸出參數中獲取值

ResultSet rs = (ResultSet)cstmt.getObject(2);//第2個?所代表的參數

 

ResultSetMetaData rmd =rs.getMetaData();

while(rs.next()){

for(int i=0;i<rmd.getColumnCount();i++){

  System.out.print(rs.getString(i+1)+" ");

}

System.out.println("");

}

rs.close();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章