【发布时间】:2014-12-19 06:46:23
【问题描述】:
我已经以这种方式声明了包级别类型(使用 Oracle XE 11):
create or replace PACKAGE RM_TYPES
AS
TYPE RECPPART_ARR IS TABLE OF RM_RECEPCIONPARTIDAS%ROWTYPE;
END RM_TYPES;
我有这样的SP:
create or replace PROCEDURE "RM_TRY_B" (partidas OUT RM_TYPES.RECPPART_ARR) as
begin
SELECT * BULK COLLECT INTO partidas FROM rm_recepcionpartidas;
end;
我有这样的java代码:
CallableStatement cstmt = conn.prepareCall("{call RM_TRY_B(?)}");
cstmt.registerOutParameter(1, OracleTypes.ARRAY, "RM_TYPES.RECPPART_ARR");
cstmt.execute();
Array a = cstmt.getArray(1);
这给了我一个例外:
Exception in thread "main" java.sql.SQLException: invalid name pattern: RM_TYPES.RECPPART_ARR
我已经通过向 oracle 发出以下命令向我的用户授予了对包的访问权限:
GRANT EXECUTE ON RM_TYPES TO myuser;
我将此用作参考:https://docs.oracle.com/database/121/JJDBC/apxref.htm#JJDBC28913(名为:使用 %ROWTYPE 属性为每一行创建 Java 级别对象
我哪里做错了?
我也尝试在我的 java 代码中传入这个名称:“RECPPART_ARR”或“MYSCHEMA.RM_TYPES.RECPPART_ARR”,它们都不起作用。
然后我在 stackoverflow 上读到有人这样说:java - passing array in oracle stored procedure:“实际上,问题是在包中创建的任何类型都对 java 不可见。如果我在架构级别创建类型,那么它就可以工作。”
是真的吗?
那么也许我应该在模式级别定义一个别名?
怎么样?我试过“创建同义词”:
CREATE PUBLIC SYNONYM RECPPART_ARRAY FOR RM_TYPES.RECPPART_ARR;
然后(试图修改我的SP):
create or replace PROCEDURE "RM_TRY_B" (partidas OUT RECPPART_ARRAY) as
begin
SELECT * BULK COLLECT INTO partidas FROM rm_recepcionpartidas;
end;
但这一次 SP 无法编译,在我的 SQLDeveloper 中出现以下错误消息:Error(1,36): PLS-00905: object MYSCHEMA.RECPPART_ARRAY is invalid。
然后我尝试使用我的 sp 的先前定义:
create or replace PROCEDURE "RM_TRY_B" (partidas OUT RM_TYPES.RECPPART_ARR) as
begin
SELECT * BULK COLLECT INTO partidas FROM rm_recepcionpartidas;
end;
并修改了我的 Java 代码以使用同义词:
CallableStatement cstmt = conn.prepareCall("{call RM_TRY_B(?)}");
cstmt.registerOutParameter(1, OracleTypes.ARRAY, "RECPPART_ARRAY");
cstmt.execute();
Array a = cstmt.getArray(1);
仍然存在异常,带有消息:无法构造描述符:无法解析类型:“MYSCHEMA.RECPPART_ARRAY”
添加
我刚刚找到的一些其他信息:
有人写道:我有同样的问题。设法通过创建公共同义词并给予资助来解决它。
如你所见,我已经这样做了,但我没有运气。
添加
或者......也许在 oracle 中是这样的(阅读后:http://docs.oracle.com/javadb/10.10.1.2/ref/rrefsqljgrant.html):
create or replace PACKAGE RM_TYPES
AS
TYPE RECPPART_ARR IS TABLE OF RM_RECEPCIONPARTIDAS%ROWTYPE;
END RM_TYPES;
sqlplus (logged in as sys as SYSDBA)> GRANT USAGE ON TYPE RM_TYPES.RECPPART_ARR TO myuser;
CREATE PUBLIC SYNONYM RECPPART_ARRAY FOR RM_TYPES.RECPPART_ARR;
create or replace PROCEDURE "RM_TRY_B" (partidas OUT RM_TYPES.RECPPART_ARR) as
begin
SELECT * BULK COLLECT INTO partidas FROM rm_recepcionpartidas;
end;
....
我试过了...,甚至使用用户“sys”作为 SYSDBA 登录...。发出授权时出现错误:
从第 1 行开始的错误命令 -
将 RM_TYPES.RECP_ARR 上的使用类型授予 myuser
错误报告 -
SQL 错误:ORA-00990:权限缺失或无效
00990. 00000 - “权限缺失或无效”
*原因:
*行动:
我现在想不通了。
【问题讨论】:
标签: java oracle stored-procedures jdbc plsql