0

我在 oracle 中创建了一个用户类型

create or replace type my_array_list 
is
table of 
varchar2(100);

现在我编写了一个具有如下输出参数的程序:

   type my_list_rec IS record
   (
      best_friends my_array_list,
      good_friends my_array_list
   );


   type my_list_array is table of my_list_rec;

  procedure friends_diff_prc(my_name in varchar2,
                                     my_friend_list_o   out my_list_array ,
                                     rc_o                  out number); 

现在我通过我正在扩展的 JAVA 类调用这个过程StoredProcedure

// Declare output parameter
 declareParameter(new SqlOutParameter(
                PropertiesReader
                        .getPropertyValue(FRIENDSConstants.GET_FRIEND_LIST_OUT),
                OracleTypes.ARRAY,"MYDB.MY_ARRAY_LIST"));

但是当我调用 proc 时,我得到了

org.springframework.jdbc.BadSqlGrammarException:

我是否正确声明了 OUT 参数?以及如何解析该输出参数的内容?

提前致谢。

4

1 回答 1

1

你的例子非常令人困惑。您有目的地命名了两种非常不同但名称非常相似的类型:

  • my_array_list是一种SQL类型:VARCHAR2 的嵌套表
  • my_list_array是一个PL/SQL类型:一个记录表my_array_list

PL/SQL 和 SQL 类型在物理上非常不同。例如,PL/SQL 类型不能直接通过jdbc.

此外,这两种类型在逻辑上非常不同:我无法想象将第一种类型映射到第二种类型。第二种类型是第一种类型的对象的集合,你永远无法交换这两种类型。

我建议如下:

  1. 不要命名与令人困惑的相似名称非常不同的类型。
  2. 使用围绕 PL/SQL 过程的 SQL 对象创建一个包装过程,以便能够从 jdbc 调用它。
  3. 有关使用 SQL 表作为 OUT 参数调用过程的示例,请参见此 SO:使用 JDBC 从存储过程中获取 Oracle 表类型
于 2012-09-20T09:56:40.797 回答