无法在Oracle中执行存储过程与不同的数据库用户返回ora-00997错误

时间:2014-04-10 11:16:19

标签: oracle stored-procedures jdbc

我在Oracle数据库中编写了一个存储过程,它将数据作为
返回 TABLE类型对象。我使用java.sql.Array和java.sql.Struct在Java程序中读取这些数据 我在数据库用户A下创建了这个存储过程 此存储过程正常工作并按预期返回数据 java程序与用户A连接到数据库,并且能够读取从存储过程获得的数据 已经为Type对象创建了公共同义词以及存储过程,并且已经为一组数据库用户提供了合适的授予权限。

但是,当我通过以用户B(数据库用户组的另一个有效数据库用户部分)连接到数据库来执行java程序时,我得到以下异常

java.sql.SQLException: ORA-00997: illegal use of LONG datatype
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)  

在成功调用execute()后从callablestatement获取数据时,我收到了上述异常。
我可以通过SQL Plus工具执行存储过程(以用户B身份连接) 任何提示/帮助都会很棒。

类型定义如下

CREATE TYPE gbm_test_type AS OBJECT
(
encounter_id NUMBER(12),
bed_number VARCHAR2(10)
);
/

CREATE TYPE gbm_test_type_tab IS TABLE OF gbm_test_type;
/

程序规范如下

CREATE PACKAGE GBM_TEST_TYPE_PKG as
procedure GBM_TEST_TYPE_SP(v_Str in varchar2,
op_type_tab out gbm_test_type_tab);
end GBM_TEST_TYPE_PKG;
/


CREATE PACKAGE BODY GBM_TEST_TYPE_PKG as
PROCEDURE GBM_TEST_TYPE_SP(v_Str in varchar2,
op_type_tab out gbm_test_type_tab)
IS

op_tab gbm_test_type_tab := gbm_test_type_tab();
op_icon_rec gbm_test_type;

err_msg VARCHAR2(10000):= '';

BEGIN
DBMS_OUTPUT.PUT_LINE('INSIDE PROC '||v_Str);
    BEGIN
        -- initializing to hard coded values        
        op_icon_rec := gbm_test_type(1,'temp');
        op_tab.extend;
        op_tab(1) := op_icon_rec;
    EXCEPTION
        WHEN OTHERS THEN
          err_msg := 'FAILURE WHILE INITIALIZING TEMP O/P RECORD--'|| SUBSTR(SQLERRM, 1 , 100);
    END;

-- finally set the ouput
op_type_tab := op_tab;

-- global exception handling
EXCEPTION 
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('failure message '|| SUBSTR(SQLERRM, 1 , 100));

END GBM_TEST_TYPE_SP;

END GBM_TEST_TYPE_PKG;
/  

Java代码片段如下

String spCallString = "{call GBM_TEST_SPS_PKG.GBM_TEST_SPS(?,?)}";
        spCallString = "{call GBM_TEST_TYPE_PKG.GBM_TEST_TYPE_SP(?,?)}";
        CallableStatement callStmt = null;
        try {
            callStmt = conn.prepareCall(spCallString);  
                        // set data to callable statement
                        callStmt.execute();

                        Object opObj = callStmt.getObject(2);// output is at index 2
                        if (opObj instanceof Array) {
            Array opArr = (Array) opObj;

                        Object val = opArr.getArray(); // this is the line throwing error

                        // further processing
                  } catch (SQLException e) {
                  // handle exception
                  } finally{
                   // handle resource release
                  }

为问题提供更多背景信息:
我有另一组Type对象和一个包(带有存储过程),它可以获取一些其他数据。遵循的风格是一样的。
类型 - >用于存储过程 - >在java代码中执行
如果我使用数据库用户A或用户B,我能够在java代码中执行并从此存储过程获取数据。

谢谢和问候 s.r.guruprasad

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法 这个问题的原因是由于我有类型定义 我有另一个存储过程,它使用扩展的Type定义和this 存储过程工作正常(当我以用户B的身份获得连接时) 类型B(最终)扩展类型A(非最终)是使用的结构 具有此问题的存储过程中使用的类型结构是
C型(非最终)。
如果我将类型结构更改为类型D(最终)扩展类型C(不是最终),
然后存储过程执行正常,当我得到连接时返回数据 作为用户B也是如此 我使用E型(最终版)进行了测试,但仍然无法从存储过程中检索数据 我甚至创建了测试类型来验证这个解决方案 这似乎是Oracle JDBC实现jar的一个问题。

我的一般期望是最终的Type应该在内部正确使用,并且应该返回数据。