oracle存儲函數和存儲過程及java調用


存儲過程

/*
      存儲過程: 
              實際上將一段已經編譯好了的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();
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM