
創建有參存儲函數findEmpNameAndSal(編號),查詢7902號員工的的姓名和月薪,【返回多個值,演示out的用法】
當返回2個或多個值,必須使用out符號
當返回1個值,就無需out符號
create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return number
as
psal emp.sal%type;
begin
select ename,sal into pename,psal from emp where empno=pempno;
--返回月薪
return psal;
end;
/
---------------------------------------相互轉值
以下為測試調用
declare
psal emp.sal%type;
pename emp.ename%type;
begin
psal := findEmpNameAndSal(7902,pename);
dbms_output.put_line('7902號員工的姓名'||pename||',薪水是'||psal);
end;
/
存儲過程
創建有參存儲過程findEmpNameAndSalAndJob(編號),查詢7902號員工的的姓名,職位,月薪【演示out的用法】
create or replace procedure
findEmpNameAndSalAndJob(pempno in number,pename out varchar2,pjob out varchar2,psal out number)
as
begin
select ename,job,sal into pename,pjob,psal from emp where empno=pempno;
end;
/
以下測試調用
declare
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
findEmpNameAndSalAndJob(7902,pename,pjob,psal);
dbms_output.put_line('7902號員工的姓名是'||pename||':'||pjob||':'||psal);
end;
/
JDBC連接oracle
JdbcUtil.java
1 package cn.itcast.web.oracle.util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 public class JdbcUtil { 9 private static String driver = "oracle.jdbc.driver.OracleDriver"; 10 //1521是主端口,也可能是其它端口去連接oracle數據庫 11 private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; 12 private static String username = "scott"; 13 private static String password = "friends"; 14 private static Connection conn; 15 private static Statement stmt; 16 private static ResultSet rs; 17 //注冊數據庫驅動 18 static{ 19 try { 20 Class.forName(driver); 21 } catch (Exception e) { 22 e.printStackTrace(); 23 throw new RuntimeException("oracle驅動注冊失敗"); 24 } 25 } 26 //獲取數據庫連接 27 public static Connection getConnection(){ 28 Connection conn = null; 29 try { 30 conn = DriverManager.getConnection(url,username,password); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 throw new RuntimeException("oracle連接獲取失敗"); 34 } 35 return conn; 36 } 37 //關閉連接對象 38 public static void close(Connection conn){ 39 if(conn!=null){ 40 try { 41 conn.close(); 42 } catch (Exception e) { 43 e.printStackTrace(); 44 throw new RuntimeException("oracle連接關閉失敗"); 45 } 46 } 47 } 48 public static void close(Statement stmt){ 49 if(stmt!=null){ 50 try { 51 stmt.close(); 52 } catch (Exception e) { 53 e.printStackTrace(); 54 throw new RuntimeException("oracle連接關閉失敗"); 55 } 56 } 57 } 58 public static void close(ResultSet rs){ 59 if(rs!=null){ 60 try { 61 rs.close(); 62 } catch (Exception e) { 63 e.printStackTrace(); 64 throw new RuntimeException("oracle連接關閉失敗"); 65 } 66 } 67 } 68 }
測試
1 @Test 2 public void testConnection() 3 { 4 Connection conn=JdbcUtil.getConnection(); 5 System.out.println(conn==null?"no":"yes"); 6 } 7
測試存儲過程
1 //Java調用存儲過程和函數 2 public class OracleDao { 3 //調用存儲過程 4 @Test 5 public void callProcedure() throws Exception{ 6 Connection conn = JdbcUtil.getConnection(); 7 //第一參數:in 編號 7902 8 //第二參數:out 姓名 9 //第三參數:out 工作 10 //第四參數:out 薪水 11 String sql = "call findEmpNameAndSalAndJob(?,?,?,?)"; 12 //創建專用於調用過程或函數的對象 13 CallableStatement cstmt = conn.prepareCall(sql); 14 //為?占位符設置in、out值 15 //hibernate從0開始,jdbc從1開始 16 cstmt.setInt(1,7902);//in值 17 cstmt.registerOutParameter(2,Types.VARCHAR);//out值 18 cstmt.registerOutParameter(3,Types.VARCHAR);//out值 19 cstmt.registerOutParameter(4,Types.INTEGER);//out值 20 cstmt.execute();//拋行調用存儲過程 21 //依次接收3個返回值 22 String ename = cstmt.getString(2); 23 String job = cstmt.getString(3); 24 Integer sal = cstmt.getInt(4); 25 //顯示 26 System.out.println(ename+"的工作是:" + job + ",它是薪水是" + sal); 27 //關閉連接對象 28 JdbcUtil.close(cstmt); 29 JdbcUtil.close(conn); 30 } 31 //調用存儲函數 32 @Test 33 public void callFunction() throws Exception{ 34 Connection conn = JdbcUtil.getConnection(); 35 //參數一:in 編號 數值型 36 //參數二:out 姓名 字符串型 37 //返回值:out 薪水 數值型 38 String sql = "{? = call findEmpNameAndSal(?,?)}"; 39 CallableStatement cstmt = conn.prepareCall(sql); 40 cstmt.setInt(2,7788);//in 41 cstmt.registerOutParameter(3,Types.VARCHAR);//out 42 cstmt.registerOutParameter(1,Types.INTEGER);//返回值 43 cstmt.execute();//執行調用存儲函數 44 String ename = cstmt.getString(3); 45 Integer sal = cstmt.getInt(1); 46 System.out.println(ename+"的薪水是"+sal); 47 //關閉連接對象 48 JdbcUtil.close(cstmt); 49 JdbcUtil.close(conn); 50 } 51 }
