JDBC調用存儲過程

JDBC調用存儲過程一般有3種:

1.無返回值

2.有一個返回值

3.返回一個數據集,就是遊標!

關鍵字:call 語法格式{call 存儲過程名(參數列表)}

廢話不說,見代碼!

業務實例:

1.添加員工,如果指定部門不存在,則先添加部門信息,再添加員工(無返回值)

--創建存儲過程如下


CREATE OR REPLACE PROCEDURE sp_add_emp1(
v_empno emp.empno%TYPE,
v_ename emp.ename%TYPE,
v_deptno dept.deptno%TYPE,
v_dname dept.dname%TYPE
)AS
num1 NUMBER;
num2 NUMBER;
BEGIN
SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;
IF(num1=0) THEN
INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);
END IF;
SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;
IF(num2=0)THEN
INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);
ELSE
raise_application_error(-202021,'員工id 重複!!!');
END IF;
commit;

END;




Java中調用代碼1:


Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
conn.setAutoCommit(false);

conn=DBConnection.getDBConnection().getConnection();
String spName="{call sp_add_emp1(?,?,?,?)}";
CallableStatement cstmt=conn.prepareCall(spName);
cstmt.setInt(1, 2);
cstmt.setString(2, "wwww");
cstmt.setInt(3, 1);
cstmt.setString(4, "qwqwq");
cstmt.executeUpdate();

conn.close();





2.需求同上, 只是返回該部門的員工總數。(有一個返回值)

--創建存儲過程如下


CREATE OR REPLACE PROCEDURE sp_add_emp2(
v_empno emp.empno%TYPE,
v_ename emp.ename%TYPE,
v_deptno dept.deptno%TYPE,
v_dname dept.dname%TYPE,

num out number
)AS
num1 NUMBER;
num2 NUMBER;
BEGIN
SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;
IF(num1=0) THEN
INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);
END IF;
SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;
IF(num2=0)THEN
INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);
ELSE
raise_application_error(-202021,'員工id 重複!!!');
END IF;

num:=num1;
commit;

END;





Java中調用代碼2:


Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
conn.setAutoCommit(false);

conn=DBConnection.getDBConnection().getConnection();

String spName="{call sp_add_emp2(?,?,?,?,?)}";
CallableStatement cstmt=conn.prepareCall(spName);
cstmt.setInt(1,1111);
cstmt.setString(2, "qqqq");
cstmt.setInt(3, 50);
cstmt.setString(4, "pppp");
cstmt.registerOutParameter(5, java.sql.Types.INTEGER);
cstmt.executeUpdate();
int i = cstmt.getInt(5);
System.out.println(i);
cstmt.close();
conn.close();




3.需求同上, 並返回該部門的員工信息(工號和姓名)。(返回一個遊標)

--創建存儲過程如下


--1.建包

CREATE OR REPLACE PACKAGE my_pak AS
TYPE my_cus IS REF CURSOR ;
END my_pak;

--2.寫存儲返回過程

CREATE OR REPLACE PROCEDURE sp_add_emp3(
v_empno emp.empno%TYPE,
v_ename emp.ename%TYPE,
v_deptno dept.deptno%TYPE,
v_dname dept.dname%TYPE,

p_cus OUT my_pak.my_cus
)AS
num1 NUMBER;
num2 NUMBER;
BEGIN

OPEN p_cus FOR select empno,ename into v_empno,v_ename from emp where deptno =v_deptno
SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;
IF(num1=0) THEN
INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);
END IF;
SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;
IF(num2=0)THEN
INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);
ELSE
raise_application_error(-202021,'員工id 重複!!!');
END IF;
commit;

END;




Java中調用代碼3:


Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
conn.setAutoCommit(false);

conn=DBConnection.getDBConnection().getConnection();

String spName="{call sp_add_emp2(?,?,?,?,?)}";
CallableStatement cstmt=conn.prepareCall(spName);
cstmt.setInt(1,1111);
cstmt.setString(2, "qqqq");
cstmt.setInt(3, 50);
cstmt.setString(4, "pppp");
cstmt.registerOutParameter(5, java.sql.Types.ORACLETYPE);
cstmt.executeUpdate();
int i = cstmt.getInt(5);
System.out.println(i);
cstmt.close();
conn.close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章