0

JDBC経由でデータベースを操作するクラスがあります。データベースへの接続は通常どおり確立されます。

    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 ストアド関数を作成する必要があります。DB を操作する別の方法はありますか (コンテキストを使用して接続を確立するなど)? 私には、同じDBに保存されている関数内からURLで接続を確立するのは少しばかげているようです=)

UPD : jar でコンパイルする 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/password@localhost: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 を使用してその jar を DB にアップロードします。

loadjava -resolve -v -user user/password@localhost: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();
4

2 に答える 2

1

私が覚えている限り、あなたが取得しているエラーは、許可を与えていないためです

exec dbms_java.grant_permission( 'user', 'SYS:java.net.SocketPermission',
'localhost:1521', 'connect,resolve' );
于 2013-09-26T09:02:52.190 に答える