qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          如何在Oracle中使用Java存儲過程(詳解)

           其實,這篇短文,我早就應該寫了。因為,Java存儲過程今后在各大數據庫廠商中越來越流行,功能也越來越強大。這里以Oracle為例,介紹一下java存儲過程的具體用法。

            一、如何創建java存儲過程?

            通常有三種方法來創建java存儲過程。

            1、使用oracle的sql語句來創建:

            e.g. 使用create or replace and compile java source named "<name>" as

            后邊跟上java源程序。要求類的方法必須是public static的,才能用于存儲過程。

          1. SQL> create or replace and compile java source named "javademo1" 
          2.   2  as 
          3.   3  import java.sql.*;  
          4.   4  public class JavaDemo1  
          5.   5  {  
          6.   6  public static void main(String[] argv)  
          7.   7  {  
          8.   8  System.out.println("hello, java demo1");  
          9.   9  }  
          10.  10  }  
          11.  11  /  

          12. Java 已創建。  

          13. SQL> show errors java source "javademo1" 
          14. 沒有錯誤。  

          15. SQL> create or replace procedure javademo1  
          16.   2  as 
          17.   3  language java name 'JavaDemo1.main(java.lang.String[])';  
          18.   4  /  

          19. 過程已創建。  

          20. SQL> set serveroutput on 
          21. SQL> call javademo1();  

          22. 調用完成。  

          23. SQL> call dbms_java.set_output(5000);  

          24. 調用完成。  

          25. SQL> call javademo1();  
          26. hello, java demo1  

          27. 調用完成。  

          28. SQL> call javademo1();  
          29. hello, java demo1  
          30. 調用完成。

            2、使用外部class文件來裝載創建

            e.g. 這里既然用到了外部文件,必然要將class文件放到oracle Server的某一目錄下邊。

          1. public class OracleJavaProc  
          2. {  
          3.     public static void main(String[] argv)  
          4.     {  
          5.         System.out.println("It's a Java Oracle procedure.");  
          6.     }  
          7. }  


          8. SQL> grant create any directory to scott;  

          9. 授權成功。  

          10. SQL> conn scott/tiger@iihero.oracledb  
          11. 已連接。  
          12. SQL> create or   replace   directory   test_dir   as  'd:/oracle';  

          13. 目錄已創建。  

          14. SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.CLASS')  
          15.   2  /  

          16. Java 已創建。  

          17. SQL> create or replace procedure testjavaproc as language java name 'OracleJavaProc.main(java.lang.String[])';  
          18.   2  /  

          19. 過程已創建。  

          20. SQL> call testjavaproc();  

          21. 調用完成。  

          22. SQL> execute testjavaproc;  

          23. PL/SQL 過程已成功完成。  

          24. SQL> set serveroutput on size 5000  
          25. SQL> call dbms_java.set_output(5000);  

          26. 調用完成。  

          27. SQL> execute testjavaproc;  
          28. It's a Java Oracle procedure.

            3、我推薦的一種方法,直接使用loadjava命令遠程裝載并創建。

            先創建一個類, e.g.

          1. import java.sql.*;  
          2. import oracle.jdbc.*;  
          3.  
          4. public class OracleJavaProc {  
          5.  
          6.    //Add a salgrade to the database.  
          7.    public static void addSalGrade(int grade, int losal, int hisal) {  
          8.  
          9.       System.out.println("Creating new salgrade for EMPLOYEE...");  
          10.  
          11.       try {  
          12.          Connection conn =  
          13.             DriverManager.getConnection("jdbc:default:connection:");  
          14.  
          15.          String sql =  
          16.             "INSERT INTO salgrade " +  
          17.             "(GRADE,LOSAL,HISAL) " +  
          18.             "VALUES(?,?,?)";  
          19.          PreparedStatement pstmt = conn.prepareStatement(sql);  
          20.          pstmt.setInt(1,grade);  
          21.          pstmt.setInt(2,losal);  
          22.          pstmt.setInt(3,hisal);  
          23.          pstmt.executeUpdate();  
          24.          pstmt.close();  
          25.          }  
          26.       catch(SQLException e) {  
          27.          System.err.println("ERROR! Adding Salgrade: "   
          28.            + e.getMessage());  
          29.          }  
          30.    }  
          31. }

            使用loadjava命令將其裝載到服務器端并編譯:

          1. D:eclipse3.1workspacedbtest>loadjava -u scott/tiger@iihero.oracledb -v -resolve Or  
          2. acleJavaProc.java  
          3. arguments: '-u' 'scott/tiger@iihero.oracledb '-v' '-resolve' 'OracleJavaProc.java'  
          4. creating : source OracleJavaProc  
          5. loading  : source OracleJavaProc  
          6. resolving: source OracleJavaProc

            查詢一下狀態:

          1. 連接到:  
          2. Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production  
          3. With the Partitioning, OLAP and Oracle Data Mining options  
          4. JServer Release 9.2.0.1.0 - Production  
          5.  
          6. SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%';  
          7.  
          8. OBJECT_NAME  
          9. --------------------------------------------------------------------------------  
          10.  
          11. OBJECT_TYPE                          STATUS  
          12. ------------------------------------ --------------  
          13. OracleJavaProc  
          14. JAVA CLASS                           VALID  
          15.  
          16. OracleJavaProc  
          17. JAVA SOURCE                          VALID

            測試一下存儲過程:

          1. SQL> create or replace procedure add_salgrade(id number, losal number, hisal num  
          2. ber) as language java name 'OracleJavaProc.addSalGrade(int, int, int)';  
          3.   2  /  
          4.  
          5. 過程已創建。  
          6.  
          7. SQL> set serveroutput on size 2000  
          8. SQL> call dbms_java.set_output(2000);  
          9.  
          10. 調用完成。  
          11.  
          12. SQL> execute add_salgrade(6, 10000, 15000);  
          13. Creating new salgrade for EMPLOYEE...  
          14.  
          15. PL/SQL 過程已成功完成。  
          16.  
          17. SQL> select * from salgrade where grade=6;  
          18.  
          19.      GRADE      LOSAL      HISAL  
          20. ---------- ---------- ----------  
          21.          6      10000      15000

            二、如何更新你已經編寫的java存儲過程?

            假如要往類OracleJavaProc里添加一個存儲過程方法,如何開發?

            正確的步驟應該是先dropjava, 改程序,再loadjava。

            e.g.修改OracleJavaProc類內容如下:

          1. import java.sql.*;  
          2. import oracle.jdbc.*;  
          3.  
          4. public class OracleJavaProc {  
          5.  
          6.    // Add a salgrade to the database.  
          7.    public static void addSalGrade(int grade, int losal, int hisal) {  
          8.  
          9.       System.out.println("Creating new salgrade for EMPLOYEE...");  
          10.  
          11.       try {  
          12.          Connection conn =  
          13.             DriverManager.getConnection("jdbc:default:connection:");  
          14.  
          15.          String sql =  
          16.             "INSERT INTO salgrade " +  
          17.             "(GRADE,LOSAL,HISAL) " +  
          18.             "VALUES(?,?,?)";  
          19.          PreparedStatement pstmt = conn.prepareStatement(sql);  
          20.          pstmt.setInt(1,grade);  
          21.          pstmt.setInt(2,losal);  
          22.          pstmt.setInt(3,hisal);  
          23.          pstmt.executeUpdate();  
          24.          pstmt.close();  
          25.          }  
          26.       catch(SQLException e) {  
          27.          System.err.println("ERROR! Adding Salgrade: "   
          28.            + e.getMessage());  
          29.          }  
          30.    }  
          31.      
          32.    public static int getHiSal(int grade)  
          33.    {  
          34.     try {  
          35.         Connection conn =  
          36.           DriverManager.getConnection("jdbc:default:connection:");  
          37.         String sql = "SELECT hisal FROM salgrade WHERE grade = ?";  
          38.         PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);  
          39.         ResultSet rset = pstmt.executeQuery();  
          40.         int res = 0;  
          41.         if (rset.next())  
          42.         {  
          43.             res = rset.getInt(1);  
          44.         }  
          45.         rset.close();  
          46.         return res;  
          47.        }  
          48.     catch (SQLException e)   
          49.     {  
          50.         System.err.println("ERROR! Querying Salgrade: "   
          51.            + e.getMessage());  
          52.           return -1;  
          53.     }      
          54.    }  
          55.         
          56. }

            如何更新呢?

          1. D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc  
          2.  
          3. D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or 
          4. acleJavaProc/tiger@iihero.oracledb.java  
          5. arguments: '-u' 'scott/tiger@iihero.oracledb' '-v' '-resolve' 'OracleJavaProc.java' 
          6. creating : source OracleJavaProc  
          7. loading  : source OracleJavaProc  
          8. resolving: source OracleJavaProc

            后邊的應用示例:

          1. SQL> create or replace function query_hisal(grade number) return number as langu  
          2. age java name 'OracleJavaProc.getHiSal(int) return int';  
          3.   2  /  
          4.  
          5. 函數已創建。  
          6.  
          7. SQL> set serveroutput on size 2000  
          8. SQL> call dbms_java.set_output(2000);  
          9.  
          10. 調用完成。  
          11. SQL> select query_hisal(5) from dual;  
          12.  
          13. QUERY_HISAL(5)  
          14. --------------  
          15.           9999

            全文完!

            用法個人見解:不要手動drop java source,不要手動drop procedure。

          posted on 2012-04-19 10:00 順其自然EVO 閱讀(198) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 无极县| 宣汉县| 定日县| 闵行区| 涞水县| 自治县| 射阳县| 隆昌县| 措勤县| 大庆市| 五台县| 吉林市| 定远县| 通辽市| 肃北| 米泉市| 石屏县| 罗定市| 兴国县| 湟源县| 新龙县| 桐城市| 黎平县| 璧山县| 永丰县| 嘉义县| 德安县| 拉孜县| 克什克腾旗| 叶城县| 新野县| 竹北市| 莱西市| 揭阳市| 阿拉尔市| 西青区| 东至县| 含山县| 唐河县| 古田县| 方城县|