qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

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

           其實(shí),這篇短文,我早就應(yīng)該寫了。因?yàn)椋?a target="_self">Java存儲(chǔ)過程今后在各大數(shù)據(jù)庫廠商中越來越流行,功能也越來越強(qiáng)大。這里以Oracle為例,介紹一下java存儲(chǔ)過程的具體用法。

            一、如何創(chuàng)建java存儲(chǔ)過程?

            通常有三種方法來創(chuàng)建java存儲(chǔ)過程。

            1、使用oracle的sql語句來創(chuàng)建:

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

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

          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 已創(chuàng)建。  

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

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

          19. 過程已創(chuàng)建。  

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

          22. 調(diào)用完成。  

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

          24. 調(diào)用完成。  

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

          27. 調(diào)用完成。  

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

            2、使用外部class文件來裝載創(chuàng)建

            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. 授權(quán)成功。  

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

          13. 目錄已創(chuàng)建。  

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

          16. Java 已創(chuàng)建。  

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

          19. 過程已創(chuàng)建。  

          20. SQL> call testjavaproc();  

          21. 調(diào)用完成。  

          22. SQL> execute testjavaproc;  

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

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

          26. 調(diào)用完成。  

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

            3、我推薦的一種方法,直接使用loadjava命令遠(yuǎn)程裝載并創(chuàng)建。

            先創(chuàng)建一個(gè)類, 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命令將其裝載到服務(wù)器端并編譯:

          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

            查詢一下狀態(tài):

          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

            測(cè)試一下存儲(chǔ)過程:

          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. 過程已創(chuàng)建。  
          6.  
          7. SQL> set serveroutput on size 2000  
          8. SQL> call dbms_java.set_output(2000);  
          9.  
          10. 調(diào)用完成。  
          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

            二、如何更新你已經(jīng)編寫的java存儲(chǔ)過程?

            假如要往類OracleJavaProc里添加一個(gè)存儲(chǔ)過程方法,如何開發(fā)?

            正確的步驟應(yīng)該是先dropjava, 改程序,再loadjava。

            e.g.修改OracleJavaProc類內(nèi)容如下:

          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

            后邊的應(yīng)用示例:

          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. 函數(shù)已創(chuàng)建。  
          6.  
          7. SQL> set serveroutput on size 2000  
          8. SQL> call dbms_java.set_output(2000);  
          9.  
          10. 調(diào)用完成。  
          11. SQL> select query_hisal(5) from dual;  
          12.  
          13. QUERY_HISAL(5)  
          14. --------------  
          15.           9999

            全文完!

            用法個(gè)人見解:不要手動(dòng)drop java source,不要手動(dòng)drop procedure。

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

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 乌拉特中旗| 平遥县| 太白县| 湘乡市| 江山市| 库尔勒市| 广河县| 崇义县| 桂平市| 凤阳县| 廊坊市| 兴仁县| 青神县| 广昌县| 乐业县| 日照市| 花垣县| 七台河市| 新蔡县| 华蓥市| 璧山县| 林州市| 安丘市| 越西县| 曲靖市| 南丹县| 永安市| 临汾市| 湟源县| 衡阳县| 博客| 增城市| 雷山县| 收藏| 高密市| 黄梅县| 黄大仙区| 呼玛县| 沛县| 张家界市| 牟定县|