Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle:Java存储函数:使用数据库_Java_Oracle_Jdbc_Stored Functions - Fatal编程技术网

Oracle:Java存储函数:使用数据库

Oracle:Java存储函数:使用数据库,java,oracle,jdbc,stored-functions,Java,Oracle,Jdbc,Stored Functions,我有一个类,它通过JDBC与数据库一起工作。与数据库的连接正常建立: Connection conn = null; try { DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); conn = DriverManager.getConnection(DS_URL); } catch (SQLException ex) { logger.debug("C

我有一个类,它通过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是否有不同的方法(例如,通过使用某些上下文建立连接)?在我看来,从函数中通过URL建立连接似乎有点愚蠢,因为它存储在同一个DB=)

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();  
    }
}
然后我尝试创建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();

基本上有三种方法来登记和装载驾驶员

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 

据我所知,你所犯的错误是因为你没有得到许可

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

你的问题是什么?@a_horse_,没有名字,我的问题是“如何使用存储在同一数据库中的java函数中的db?”。你所说的“使用java函数中的db”是什么意思?您需要一个关于如何通过JDBC使用语句处理数据库的教程吗?一个Oracle存储函数已经在“使用DB”,它正在使用PL/SQL来实现这一点。
exec dbms_java.grant_permission( 'user', 'SYS:java.net.SocketPermission',
'localhost:1521', 'connect,resolve' );