您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Oracle中怎么調用Java存儲過程,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、如何創建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
上述就是小編為大家分享的Oracle中怎么調用Java存儲過程了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。