gpt4 book ai didi

java - Oracle JDBC/PL SQL/类型/包级别/无效名称模式

转载 作者:行者123 更新时间:2023-11-30 08:18:31 25 4
gpt4 key购买 nike

我已经通过这种方式声明了包级类型(使用 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):

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”


添加

我刚刚找到的一些其他信息:

http://oracle.developer-works.com/article/5227493/%22invalid+name+pattern%22++when+trying+to+user+packaged+TYPE

有人写道:我遇到了同样的问题。通过创建公共(public)同义词和提供资助设法解决了这个问题。

如你所见,我已经这样做了,但我运气不好。


添加

或者...也许在 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 上的使用类型授予我的用户错误报告 -SQL 错误:ORA-00990:权限缺失或无效00990. 00000 - “特权缺失或无效”*原因:
*行动:

我现在没主意了。

最佳答案

JDBC Support for PL/SQL Data Types as Parameters是 Oracle 12c 的新特性。

PL/SQL 类型看起来和行为都像常规类型;它们可以在 SQL 和其他上下文中使用,它们具有 TYPE_OID 和 TYPECODE,并且它们具有数据字典 View (DBA_PLSQL_TYPES)。一个奇怪的区别是 PL/SQL 类型不会出现在 DBA_OBJECTS 中。

在旧版本中,您必须创建一个 TYPE 作为独立对象,以便在 PL/SQL 之外使用它。像这样的代码可以创建对象:

CREATE OR REPLACE TYPE RECPPART_REC IS OBJECT
(
--list RM_RECEPCIONPARTIDAS columns here. %ROWTYPE is not available in SQL.
);

CREATE OR REPLACE RECPPART_ARR IS TABLE OF RECPPART_REC;

关于java - Oracle JDBC/PL SQL/类型/包级别/无效名称模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27560969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com