-----------------無返回值示例------------------------
存儲過程:
·添加學生,如果班級不存在,則先添加班級信息,再添加學生。
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();