2013-09-26 107 views
0

我有一個類,它通過JDBC與數據庫一起工作。連接到數據庫像往常一樣建立:Oracle:Java存儲函數:使用數據庫

Connection conn = null; 
    try { 
     DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
     conn = DriverManager.getConnection(DS_URL); 
    } catch (SQLException ex) { 
     logger.debug("Cannot register driver for Oracle DB", ex); 
    } 

現在我必須使Oracle存儲函數,與數據庫的工作。是否有任何不同的方式來處理數據庫(例如,通過使用某種上下文建立連接)?對我來說,建立從功能內的URL,這是存儲在同一個DB =)

UPD似乎有點愚蠢:我有maven項目編譯在罐子裏。我的班級:

package testjavatooracleproject; 

import java.sql.*; 

public class App 
{ 
    public static void main(String[] args) throws SQLException{ 
     System.out.println(selectJavaObjectById(400094)); 
    } 

    public static String selectJavaObjectById(long id) throws SQLException 
    {   
     DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
     Connection conn = DriverManager.getConnection("jdbc:oracle:thin:user/[email protected]:1521:ae"); 
     PreparedStatement ps = conn.prepareStatement("select * from user_objects where object_id = ?"); 
     ps.setLong(1, id); 
     ResultSet rs = ps.executeQuery(); 
     int columnCount = rs.getMetaData().getColumnCount(); 
     StringBuilder sb = new StringBuilder(); 
     if (rs.next()){ 
      for(int i = 1; i <= columnCount; i++){ 
       sb.append(rs.getObject(i)); 
      } 
     } 
     conn.close(); 
     return sb.toString(); 
    } 
} 

接下來,使用loadjava上傳在DB是罐子IM:

loadjava -resolve -v -user user/[email protected]:1521/ae C:\Exchange\TestJavaToOracleProject.jar 

然後我試圖創建PL/SQL包裝:

create or replace 
function getUserObjectInfoById(obj_id IN NUMBER) return VARCHAR2 
as language java 
name 'testjavatooracleproject.App.selectJavaObjectById(long) return java.lang.String'; 

然後我試圖撥打我的功能:

select getUserObjectInfoById(400094) from dual; 

但我發現了錯誤:

ORA-29532: Java call terminated by uncaught Java exception: java.security.AccessControlException: the Permission (java.net.SocketPermission localhost:1521 connect,resolve) has not been granted to user. The PL/SQL to grant this is dbms_java.grant_permission('user', 'SYS:java.net.SocketPermission', 'localhost:1521', 'connect,resolve') 
29532. 00000 - "Java call terminated by uncaught Java exception: %s" 
*Cause: A Java exception or error was signaled and could not be 
      resolved by the Java code. 
*Action: Modify Java code, if this behavior is not intended. 

UPD:問題就解決了。解決方法對我來說:使用下面的代碼創建連接:

OracleDriver ora = new OracleDriver(); 
Conenction conn = ora.defaultConenction(); 
+0

你的問題是什麼? –

+0

@a_horse_with_no_name,我的問題是「如何使用數據庫從Java函數,存儲在相同的數據庫?」。 –

+0

你是什麼意思「從數據庫從Java函數」?您是否需要關於如何通過JDBC使用語句來處理數據庫的教程?一個Oracle存儲函數已經「在使用數據庫」,它使用的是PL/SQL。 –

回答

1

基本上有三種方式做了登記和驅動程序的加載

1. Class.forName(oracle.jdbc.driver.OracleDriver()); 
    Connection con = DriverManager.getConnection(DS_URL); 

2.System.setProperty("jdbc.drivers","sun.jdbc.odbc.JdbcOdbcDriver"); 

3. as mention by you 
1

據我記得你所得到的錯誤是因爲你將不會獲得許可

exec dbms_java.grant_permission('user', 'SYS:java.net.SocketPermission', 
'localhost:1521', 'connect,resolve'); 
相關問題