Oracle物件-包頭,包體返回遊標 多引數值
阿新 • • 發佈:2019-01-25
前言
在編寫儲存過程或儲存函式的過程中,你可能會發現,當需要的返回值過多,就需要更多的變數來接受它。是否可能用一個游標來接受返回值?答案當然是可以的。在Oracle資料庫中,可以定義包頭和包體。包頭相當於宣告,而包體則是邏輯實現。
例項
包頭宣告如下:
CREATE OR REPLACE PACKAGE MYPACKAGE AS type empcursor is ref cursor; procedure queryEmpList(dno in number,empList out empcursor);--empcursor是上一條語句定義的型別。 END MYPACKAGE;
包體宣告如下:
CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS
procedure queryEmpList(dno in number,empList out empcursor) AS--這裡用來宣告包體
BEGIN
open empList for select * from emp where deptno=dno;
END queryEmpList;
END MYPACKAGE;
Java呼叫
@Test public void testCursor(){ String sql = "{call MYPACKAGE.QUERYEMPLIST(?,?)}"; Connection conn = null; CallableStatement call = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); call = conn.prepareCall(sql); //對於in引數,賦值 call.setInt(1, 20); //對於out引數,申明 call.registerOutParameter(2, OracleTypes.CURSOR); //執行 call.execute(); //取出結果 rs = ((OracleCallableStatement)call).getCursor(2); while(rs.next()){ String name = rs.getString("ename"); double sal = rs.getDouble("sal"); String job = rs.getString("job"); System.out.println(name+"\t"+sal+"\t"+job); } } catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtils.release(conn, call, rs); } } }
package demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { private static String driver = "oracle.jdbc.OracleDriver"; private static String url = "jdbc:oracle:thin:@192.168.137.129:1521/orcl"; private static String user = "scott"; private static String password = "tiger"; static{ //註冊驅動 try { Class.forName(driver); //DriverManager.registerDriver(driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection(){ try { return DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } return null; } /* * 執行Java程式: * java -Xms100M -Xmx200M HelloWorld * * 技術方向: * 1. 效能優化 * 2. 故障診斷:死鎖 ThreadDump */ public static void release(Connection conn,Statement st,ResultSet rs){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null;//-----> Java GC } } if(st != null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ st = null; } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } } } }