JDBC呼び出しメモリプロセス


JDBC呼び出しメモリプロセスは通常3種類あります。  1.戻り値なし  2.戻り値がある  3.1つのデータセットを返してください。つまり、遊覧標識です。キーワード:call文法フォーマット{call格納プロセス名(パラメータリスト)}は、コードを参照してください。業務例:1.従業員を追加し、指定部門が存在しない場合は、先に部門情報を追加し、従業員を追加する(戻り値なし)。記憶プロセスを作成するには以下の通りである。
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();