文章出處

Oracle中使用java存儲過程。

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

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

e.g. 使用create or replace and compile Java source named “” 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

 

看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170222/105314.html

文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()