<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'  
    為空,則未安裝,請執行 $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 小菜毛毛 閱讀(9206) 評論(1)  編輯  收藏 所屬分類: 數據庫

    Feedback

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

    主站蜘蛛池模板: 中文字幕永久免费视频| 91成年人免费视频| 亚洲av永久无码天堂网| 国产人成免费视频| 18禁在线无遮挡免费观看网站| 亚洲国产精品成人综合色在线婷婷| 宅男666在线永久免费观看| 国产色无码精品视频免费| 亚洲乱码一区二区三区国产精品| 亚洲国产免费综合| 我们的2018在线观看免费高清| 无套内谢孕妇毛片免费看看| 久久亚洲精品成人无码网站 | 国产成人免费手机在线观看视频 | 久久久久亚洲Av片无码v| 国产va免费精品观看精品| 色欲aⅴ亚洲情无码AV| 亚洲最大福利视频网站| 国产又长又粗又爽免费视频| 日本免费大黄在线观看| 成年网站免费入口在线观看| 亚洲精品网站在线观看你懂的| 免费又黄又爽又猛的毛片 | 亚洲免费在线视频观看| 一边摸一边桶一边脱免费视频| 亚洲视屏在线观看| 久久影视综合亚洲| jizz免费观看| 久久国产亚洲精品| 18gay台湾男同亚洲男同| 亚洲日本在线观看视频| 国内一级一级毛片a免费| 8888四色奇米在线观看免费看| 好猛好深好爽好硬免费视频| 亚洲国产综合AV在线观看| 亚洲国产精品人久久电影| 亚洲AV无码久久精品成人| 国产亚洲人成网站在线观看| 国产青草视频免费观看97| 色窝窝免费一区二区三区| 久久99国产乱子伦精品免费|