<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

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

    一、如何創(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的,才能用于存儲過程。

    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"
    沒有錯誤。

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

    過程已創(chuàng)建。

    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文件來裝載創(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;

    授權成功。

    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  /

    過程已創(chuàng)建。

    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命令遠程裝載并創(chuàng)建。
        先創(chuàng)建一個類, 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
    查詢一下狀態(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
    測試一下存儲過程:


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

    過程已創(chuàng)建。

    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里添加一個存儲過程方法,如何開發(fā)?
    正確的步驟應該是先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  /

    函數已創(chuàng)建。

    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 小菜毛毛 閱讀(9206) 評論(1)  編輯  收藏 所屬分類: 數據庫

    Feedback

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

    主站蜘蛛池模板: 亚洲欧洲日韩国产一区二区三区| 免费国产va在线观看| 免费无码成人AV片在线在线播放| 日本精品久久久久久久久免费 | 成年人免费视频观看| 乱人伦中文视频在线观看免费| 亚洲av永久无码精品漫画 | 亚洲av无码专区国产乱码在线观看| 在人线av无码免费高潮喷水| xvideos永久免费入口| 亚洲最大在线观看| 亚洲一区二区视频在线观看| 57pao国产成永久免费视频| 国产成人不卡亚洲精品91| 亚洲美女视频一区二区三区| 免费看国产一级片| 无码国产精品一区二区免费式直播 | 亚洲美女免费视频| 一本岛v免费不卡一二三区| 亚洲另类春色国产精品| 亚洲精品制服丝袜四区| 尤物永久免费AV无码网站| 俄罗斯极品美女毛片免费播放| 亚洲丶国产丶欧美一区二区三区| 亚洲国产精品SSS在线观看AV| 日韩精品免费一区二区三区| 69av免费观看| 久久国产乱子伦精品免费午夜| 日韩亚洲国产高清免费视频| 亚洲ⅴ国产v天堂a无码二区| AV在线亚洲男人的天堂| 日韩免费视频网站| 久久久久免费看黄A片APP| 无码A级毛片免费视频内谢| 特色特黄a毛片高清免费观看| 亚洲中文无码mv| 亚洲免费观看网站| 亚洲人成网址在线观看| 国产亚洲美女精品久久久久狼| 亚洲高清免费视频| 国产免费黄色大片|