小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
          前提是數據庫上需要安裝java虛擬機(JVM),使用下面的語句查看
          select * from dba_registry where comp_id = 'JAVAVM'  
          為空,則未安裝,請執行 $ORACLE_HOME/javavm/install/initjvm.sql安裝.

          一、如何創建java存儲過程?
          通常有三種方法來創建java存儲過程。

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

          e.g. 使用create or replace and compile java source named "<name>" as
                 后邊跟上java源程序。要求類的方法必須是public static的,才能用于存儲過程。

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

          Java 已創建。

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

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

          過程已創建。

          SQL> set serveroutput on
          SQL> call javademo1();

          調用完成。

          SQL> call dbms_java.set_output(5000);

          調用完成。

          SQL> call javademo1();
          hello, java demo1

          調用完成。

          SQL> call javademo1();
          hello, java demo1
          調用完成。
          2. 使用外部class文件來裝載創建
          e.g. 這里既然用到了外部文件,必然要將class文件放到oracle Server的某一目錄下邊。


          public class OracleJavaProc
          {
              public static void main(String[] argv)
              {
                  System.out.println("It''s a Java Oracle procedure.");
              }
          }


          SQL> grant create any directory to scott;

          授權成功。

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

          目錄已創建。

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

          Java 已創建。

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

          過程已創建。

          SQL> call testjavaproc();

          調用完成。

          SQL> execute testjavaproc;

          PL/SQL 過程已成功完成。

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

          調用完成。

          SQL> execute testjavaproc;
          It''s a Java Oracle procedure.
          3. 我推薦的一種方法,直接使用loadjava命令遠程裝載并創建。
              先創建一個類, e.g.


          import java.sql.*;
          import oracle.jdbc.*;

          public class OracleJavaProc ...{

             //Add a salgrade to the database.
             public static void addSalGrade(int grade, int losal, int hisal) ...{

                System.out.println("Creating new salgrade for EMPLOYEE...");

                try ...{
                   Connection conn =
                      DriverManager.getConnection("jdbc:default:connection:");

                   String sql =
                      "INSERT INTO salgrade " +
                      "(GRADE,LOSAL,HISAL) " +
                      "VALUES(?,?,?)";
                   PreparedStatement pstmt = conn.prepareStatement(sql);
                   pstmt.setInt(1,grade);
                   pstmt.setInt(2,losal);
                   pstmt.setInt(3,hisal);
                   pstmt.executeUpdate();
                   pstmt.close();
                   }
                catch(SQLException e) ...{
                   System.err.println("ERROR! Adding Salgrade: "
                     + e.getMessage());
                   }
             }
          }
          使用loadjava命令將其裝載到服務器端并編譯:


          D:eclipse3.1workspacedbtest>loadjava -u scott/tiger@iihero.oracledb -v -resolve Or
          acleJavaProc.java
          arguments: ''-u'' ''scott/tiger@iihero.oracledb ''-v'' ''-resolve'' ''OracleJavaProc.java''
          creating : source OracleJavaProc
          loading  : source OracleJavaProc
          resolving: source OracleJavaProc
          查詢一下狀態:


          連接到:
          Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
          With the Partitioning, OLAP and Oracle Data Mining options
          JServer Release 9.2.0.1.0 - Production

          SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE ''JAVA%'';

          OBJECT_NAME
          --------------------------------------------------------------------------------

          OBJECT_TYPE                          STATUS
          ------------------------------------ --------------
          OracleJavaProc
          JAVA CLASS                           VALID

          OracleJavaProc
          JAVA SOURCE                          VALID
          測試一下存儲過程:


          SQL> create or replace procedure add_salgrade(id number, losal number, hisal num
          ber) as language java name ''OracleJavaProc.addSalGrade(int, int, int)'';
            2  /

          過程已創建。

          SQL> set serveroutput on size 2000
          SQL> call dbms_java.set_output(2000);

          調用完成。

          SQL> execute add_salgrade(6, 10000, 15000);
          Creating new salgrade for EMPLOYEE...

          PL/SQL 過程已成功完成。

          SQL> select * from salgrade where grade=6;

               GRADE      LOSAL      HISAL
          ---------- ---------- ----------
                   6      10000      15000
           

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

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

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


          import java.sql.*;
          import oracle.jdbc.*;

          public class OracleJavaProc ...{

             // Add a salgrade to the database.
             public static void addSalGrade(int grade, int losal, int hisal) ...{

                System.out.println("Creating new salgrade for EMPLOYEE...");

                try ...{
                   Connection conn =
                      DriverManager.getConnection("jdbc:default:connection:");

                   String sql =
                      "INSERT INTO salgrade " +
                      "(GRADE,LOSAL,HISAL) " +
                      "VALUES(?,?,?)";
                   PreparedStatement pstmt = conn.prepareStatement(sql);
                   pstmt.setInt(1,grade);
                   pstmt.setInt(2,losal);
                   pstmt.setInt(3,hisal);
                   pstmt.executeUpdate();
                   pstmt.close();
                   }
                catch(SQLException e) ...{
                   System.err.println("ERROR! Adding Salgrade: "
                     + e.getMessage());
                   }
             }
            
             public static int getHiSal(int grade)
             ...{
              try ...{
                  Connection conn =
                    DriverManager.getConnection("jdbc:default:connection:");
                  String sql = "SELECT hisal FROM salgrade WHERE grade = ?";
                  PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);
                  ResultSet rset = pstmt.executeQuery();
                  int res = 0;
                  if (rset.next())
                  ...{
                      res = rset.getInt(1);
                  }
                  rset.close();
                  return res;
                 }
              catch (SQLException e)
              ...{
                  System.err.println("ERROR! Querying Salgrade: "
                     + e.getMessage());
                    return -1;
              }   
             }
               
          }

          如何更新呢?


          D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc

          D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or
          acleJavaProc/tiger@iihero.oracledb.java
          arguments: ''-u'' ''scott/tiger@iihero.oracledb'' ''-v'' ''-resolve'' ''OracleJavaProc.java''
          creating : source OracleJavaProc
          loading  : source OracleJavaProc
          resolving: source OracleJavaProc
          后邊的應用示例:


          SQL> create or replace function query_hisal(grade number) return number as langu
          age java name ''OracleJavaProc.getHiSal(int) return int'';
            2  /

          函數已創建。

          SQL> set serveroutput on size 2000
          SQL> call dbms_java.set_output(2000);

          調用完成。
          SQL> select query_hisal(5) from dual;

          QUERY_HISAL(5)
          --------------
                    9999
          全文完!

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/thinker28754/archive/2009/03/07/3962989.aspx


          posted on 2010-02-04 12:36 小菜毛毛 閱讀(9207) 評論(1)  編輯  收藏 所屬分類: 數據庫

          Feedback

          # 啊啊[未登錄] 2014-05-19 18:14 啊啊
          啊啊  回復  更多評論
            

          主站蜘蛛池模板: 南漳县| 喜德县| 兰坪| 如皋市| 山西省| 尉犁县| 鱼台县| 乐至县| 河间市| 宜都市| 威远县| 江川县| 宁蒗| 弋阳县| 克东县| 呼伦贝尔市| 阿拉善左旗| 延吉市| 宿松县| 盈江县| 田林县| 万宁市| 江西省| 新和县| 扶风县| 丘北县| 桐庐县| 阳曲县| 桓台县| 德钦县| 建平县| 邹平县| 疏勒县| 昌图县| 永福县| 富源县| 小金县| 海丰县| 沙坪坝区| 河间市| 临城县|