存儲過程
/* 存儲過程: 實際上將一段已經編譯好了的PLSQL代碼片斷,封裝在Oracle數據庫 1.提高業務邏輯執行效率 2.將復雜的業務邏輯就相當於是封裝成了一個過程 語法: create [or replace] procedure 過程的名稱(參數1 in|out 參數類型,參數2 in|out 參數類型) is|as -- 聲明的部分 begin -- 業務邏輯 end; in : 代表的是輸入參數 out : 代表的輸出參數 u = new User() function test(int i,User u){ u.setUsername("zs"); 輸出參數是需要重新賦值的,輸入參數可以不必 syso(i) } */ -- 給指定員工漲薪,並打印漲薪前和漲薪后的工資 /* 員工編號? 漲多少 ? */ create or replace procedure proc_updatesal(eno in number,scount in number) is vsal number; begin -- 查詢漲薪前的工資 select sal into vsal from emp where empno = eno; -- 打印漲薪前的工資 dbms_output.put_line('漲薪前:'||vsal); -- 更新工資 update emp set sal = vsal+scount where empno = eno; -- 打印漲薪后的工資 dbms_output.put_line('漲薪后:'||(vsal+scount)); commit; end; //在下面調用執行過程 方式1:call proc_updatessal(7369,10)//給7368漲薪10元 方式2: declare begin proc_updatetesal end;
存儲函數
/* 存儲函數: 實際上將一段已經編譯好了的PLSQL代碼片斷,封裝在Oracle數據庫 1.提高業務邏輯執行效率 2.將復雜的業務邏輯就相當於是封裝成了一個函數 語法: create [or replace] function 函數名(參數1 in|out 參數類型) return 返回值類型 is|as begin end; 過程和函數的區別: 1. 函數一定要有返回值,過程可以沒有 2. 函數可以直接在sql語句中使用,過程不行 3. 過程能夠的實現的功能,函數能夠實現 4. 函數能實現的功能,過程也能夠實現 5. 函數存在意義是給過程調用,在工作中通常調用的是過程 6. 函數和過程本質上木有區別 輸入類型 in 默認可以不寫 */ -- 查詢指定員工的年薪//存儲函數///////////////////////////////////////////////////////////// -- 員工編號 ? -- 返回 : 年薪 create or replace function func_getyearsal(eno number) return number is -- 聲明一個變量,接收年薪 vyearsal number; begin select sal*12 + nvl(comm,0) into vyearsal from emp where empno = eno; -- 返回結果 return vyearsal; end; //調用函數 declare vsum number; begin vsum := func_getyearsal(7369); dbms_output.put_line('年薪:'||vsum); //輸出編號是7369的年薪 end; -- 調用統計年薪的--//存儲過程///////////////////////////////////////////////////////////////////////// -- 輸入: 員工編號 -- 輸出: 年薪 create or replace procedure proc_getyearsal(eno in number,vyearsal out number) is begin -- 查詢員工年薪 select sal*12 + nvl(comm,0) into vyearsal from emp where empno = eno; end; // 調用有輸出參數的存儲過程 declare vsum number; begin proc_getyearsal(7369,vsum); dbms_output.put_line('年薪:'||vsum); end;
java代碼的調用
//接上邊的存儲過程和存儲函數 public class TestProcedure { /* * create or replace procedure proc_getyearsal(eno in number,vyearsal out number) is begin -- 查詢員工年薪 select sal*12 + nvl(comm,0) into vyearsal from emp where empno = eno; end; * */ @Test public void test1() throws Exception{ // 1.注冊驅動 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2.創建連接 String url ="jdbc:oracle:thin:@192.168.80.100:1521:orcl"; Connection conn = DriverManager.getConnection(url, "xidada", "root"); // 3.獲取執行SQL的對象 String sql ="{call pro_updatesal(?,?)}"; CallableStatement call = conn.prepareCall(sql); // 封裝參數 call.setInt(1, 7369); // 注冊輸出類型的參數 call.registerOutParameter(2, OracleTypes.NUMBER); // 4.執行SQL call.execute(); // 如果執行的是查詢操作就返回true , 增刪改的操作就是false // 5.處理結果 int sum = call.getInt(2); System.out.println("年薪:"+sum); // 6.釋放資源 call.close(); conn.close(); } @Test /* * create or replace procedure proc_getemp(dno in number,vrows out sys_refcursor) is begin open vrows for select * from emp where deptno = dno; end; * */ public void test2() throws Exception{ // 1.注冊驅動 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2.創建連接 String url ="jdbc:oracle:thin:@192.168.42.100:1521:orcl"; Connection conn = DriverManager.getConnection(url, "xidada", "root"); // 3.獲取執行SQL的對象 String sql ="{call proc_getemp(?,?)}"; CallableStatement call = conn.prepareCall(sql); // 4.封裝輸入類型的參數 call.setInt(1, 10); // 5.注冊輸出類型的參數 call.registerOutParameter(2, OracleTypes.CURSOR); // 6.執行SQL call.execute(); // 7.處理結果 System.out.println(call.getClass().getName()); OracleCallableStatement call2 = (OracleCallableStatement)call; ResultSet rs = call2.getCursor(2); while(rs.next()){ System.out.println(rs.getObject("empno")); System.out.println(rs.getObject("ename")); System.out.println(rs.getObject("job")); System.out.println(rs.getObject("sal")); System.out.println("=================================="); } // 8.釋放資源 rs.close(); call2.close(); conn.close(); } }