• <ul id="mayc0"></ul>
    <ul id="mayc0"><center id="mayc0"></center></ul>
    <strike id="mayc0"><input id="mayc0"></input></strike>
    <ul id="mayc0"></ul>
  • 始創(chuàng)于2000年 股票代碼:831685
    咨詢熱線:0371-60135900 注冊有禮 登錄
    • 掛牌上市企業(yè)
    • 60秒人工響應
    • 99.99%連通率
    • 7*24h人工
    • 故障100倍補償
    全部產(chǎn)品
    您的位置: 網(wǎng)站首頁 > 幫助中心>文章內(nèi)容

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

    發(fā)布時間:  2012/5/28 11:57:22

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

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

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

    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 已創(chuàng)建。
    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. 過程已創(chuàng)建。
    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文件來裝載創(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. 授權成功。
    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. 調用完成。
    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命令遠程裝載并創(chuàng)建。
    先創(chuàng)建一個類, e.g.

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

    使用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

    查詢一下狀態(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. SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%';
    6. OBJECT_NAME
    7. --------------------------------------------------------------------------------
    8. OBJECT_TYPE STATUS
    9. ------------------------------------ --------------
    10. OracleJavaProc
    11. JAVA CLASS VALID
    12. OracleJavaProc
    13. 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. 過程已創(chuàng)建。
    5. SQL> set serveroutput on size 2000
    6. SQL> call dbms_java.set_output(2000);
    7. 調用完成。
    8. SQL> execute add_salgrade(6, 10000, 15000);
    9. Creating new salgrade for EMPLOYEE...
    10. PL/SQL 過程已成功完成。
    11. SQL> select * from salgrade where grade=6;
    12. GRADE LOSAL HISAL
    13. ---------- ---------- ----------
    14. 6 10000 15000

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

    假如要往類OracleJavaProc里添加一個存儲過程方法,如何開發(fā)?
    正確的步驟應該是先dropjava, 改程序,再loadjava。

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

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

    如何更新呢?

    1. D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc
    2. D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or
    3. acleJavaProc/tiger@iihero.oracledb.java
    4. arguments: '-u' 'scott/tiger@iihero.oracledb' '-v' '-resolve' 'OracleJavaProc.java'
    5. creating : source OracleJavaProc
    6. loading : source OracleJavaProc
    7. 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. 函數(shù)已創(chuàng)建。
    5. SQL> set serveroutput on size 2000
    6. SQL> call dbms_java.set_output(2000);
    7. 調用完成。
    8. SQL> select query_hisal(5) from dual;
    9. QUERY_HISAL(5)
    10. --------------
    11. 9999

    本文出自:億恩科技【www.vbseamall.com】

    服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營性ICP/ISP證:贛B2-20080012
  • 服務器/云主機 24小時售后服務電話:0371-60135900
  • 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
  • 專注服務器托管17年
    掃掃關注-微信公眾號
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區(qū)翠竹街1號總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號
      0
     
     
     
     

    0371-60135900
    7*24小時客服服務熱線