Oracle中存儲過程帶參分為:輸入參數(in)和輸出參數(out)
例如:
1 create or replace procedure out_test(v_user in emp.user_name%type, 2 v_salary out emp.salary%type, 3 v_deptno out emp.emp_deptno%type) as 4 begin 5 select salary, emp_deptno 6 into v_salary, v_deptno 7 from emp 8 where user_name = v_user; 9 exception 10 when NO_DATA_FOUND then 11 dbms_output.put_line('No data found'); 12 when TOO_MANY_ROWS then 13 dbms_output.put_line('Too many rows found'); 14 end out_test;
在命令行中調用該存儲過程,利用綁定變量
1 SQL> var v_user varchar2(20); 2 SQL> var v_salary number; 3 SQL> var v_deptno number; 4 SQL> exec :v_user := 'Lisi'; 5 6 PL/SQL procedure successfully completed 7 v_user 8 --------- 9 Lisi 10 11 SQL> exec out_test(:v_user, :v_salary, :v_deptno); 12 13 PL/SQL procedure successfully completed 14 v_user 15 --------- 16 Lisi 17 v_salary 18 --------- 19 v_deptno 20 ---------
在plsql developer中執行帶的存儲過程,無參可以直接執行,帶in類型的參數要輸入變量值,帶out類型的不用輸入,會在plsql下面輸出結果
在hibernate的 EJB()調用存儲過程 中執行存儲過程
EJB調用存儲過程
要調用存儲過程,我們可以通過EntityManager 對象的createNativeQuery()方法執行SQL 語句(注意:這里說的是SQL 語句,不是EJB3 QL), 調用存儲過程的SQL 格式如下:
{call 存儲過程名稱(參數1, 參數2, … )}
在EJB3 中你可以調用的存儲過程有兩種
1.無返回值的存儲過程。
2.返回值為ResultSet(以select 形式返回的值)的存儲過程,EJB3 不能調用以OUT 參數返回值的存儲過程
1.調用無返回值的存儲過程
//調用無返回參數的存儲過程
Query query = em.createNativeQuery("{call Procedure()}");
query.executeUpdate();
2.調用返回單值的存儲過程
//調用返回單個值的存儲過程
Query query = em.createNativeQuery("{call GetPersonName(?)}");
query.setParameter(1, new Integer(1));
String result = query.getSingleResult().toString();
3.調用返回表全部列的存儲過程
在調用存儲過程時,可以讓EJB3 Persistence 運行環境將列值直接填充入一個Entity 的實例(本例填充進Person 對象),並將實例作為結果返回
//調用返回Person 全部列的存儲過程
Query query = em.createNativeQuery("{call GetPersonList()}", Person.class);
List result = query.getResultList();
存儲過程GetPersonList:
CREATE PROCEDURE `GetPersonList`()
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select * from person;
END;
4.調用返回部分列的存儲過程
創建存儲過程:
CREATE PROCEDURE `GetPersonPartProperties`()
NOT DETERMINISTICSQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT personid, personname from person;
END;
//調用返回部分列的存儲過程
Query query = em.createNativeQuery("{call GetPersonPartProperties()}");
List result = query.getResultList();