小菜毛毛技術(shù)分享

          與大家共同成長(zhǎng)

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

          一、如何創(chuàng)建java存儲(chǔ)過(guò)程?
          通常有三種方法來(lái)創(chuàng)建java存儲(chǔ)過(guò)程。

          1. 使用oracle的sql語(yǔ)句來(lái)創(chuàng)建:

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

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

          SQL> show errors java source "javademo1"
          沒(méi)有錯(cuò)誤。

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

          過(guò)程已創(chuàng)建。

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

          調(diào)用完成。

          SQL> call dbms_java.set_output(5000);

          調(diào)用完成。

          SQL> call javademo1();
          hello, java demo1

          調(diào)用完成。

          SQL> call javademo1();
          hello, java demo1
          調(diào)用完成。
          2. 使用外部class文件來(lái)裝載創(chuàng)建
          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;

          授權(quán)成功。

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

          目錄已創(chuàng)建。

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

          Java 已創(chuàng)建。

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

          過(guò)程已創(chuàng)建。

          SQL> call testjavaproc();

          調(diào)用完成。

          SQL> execute testjavaproc;

          PL/SQL 過(guò)程已成功完成。

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

          調(diào)用完成。

          SQL> execute testjavaproc;
          It''s a Java Oracle procedure.
          3. 我推薦的一種方法,直接使用loadjava命令遠(yuǎn)程裝載并創(chuàng)建。
              先創(chuàng)建一個(gè)類, 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命令將其裝載到服務(wù)器端并編譯:


          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
          查詢一下狀態(tài):


          連接到:
          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
          測(cè)試一下存儲(chǔ)過(guò)程:


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

          過(guò)程已創(chuàng)建。

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

          調(diào)用完成。

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

          PL/SQL 過(guò)程已成功完成。

          SQL> select * from salgrade where grade=6;

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

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

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

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


          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
          后邊的應(yīng)用示例:


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

          函數(shù)已創(chuàng)建。

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

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

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

           

          本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/thinker28754/archive/2009/03/07/3962989.aspx


          posted on 2010-02-04 12:36 小菜毛毛 閱讀(9208) 評(píng)論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          Feedback

          # 啊啊[未登錄](méi) 2014-05-19 18:14 啊啊
          啊啊  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 保靖县| 玉溪市| 水富县| 牡丹江市| 三都| 丹寨县| 霞浦县| 马关县| 衡南县| 牟定县| 叙永县| 哈巴河县| 铜陵市| 商城县| 清镇市| 贵德县| 镇康县| 新蔡县| 霍山县| 长岭县| 开原市| 西城区| 马山县| 卫辉市| 安泽县| 湄潭县| 无为县| 礼泉县| 靖宇县| 三台县| 垣曲县| 休宁县| 荔波县| 密云县| 乐安县| 武汉市| 高州市| 林口县| 栖霞市| 西华县| 寻乌县|