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