java调用存储过程, 传递数组

myh0305 2009-07-28 11:32:05
create or replace type ArrayList as table of varchar2(64);

create or replace PROCEDURE PROC_TEST
(res IN ArrayList
,rest OUT VARCHAR2)
AS
BEGIN
dbms_output.put_line(res.count);
rest := res(res.count);
END PROC_TEST;


// java 调用
public void Test() throws Exception
{
if (m_con == null)
System.out.println("Connection is error!");
// 类型名必须大写
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("ARRAYLIST", m_con);
String[] actName = { "Get", "Put", "Featch"};
ARRAY arrayAct =new ARRAY(descriptor, m_con, actName);

CallableStatement proc = null;
String sql = "{call PROC(?,?)}";
proc = m_con.prepareCall(sql);
proc.setArray(1, arrayAct);
proc.registerOutParameter(2, Types.VARCHAR);
boolean bFlag = proc.execute();
System.out.println(bFlag);
System.out.println("返回值:");
System.out.println(proc.getString(2));
}

用上面的方法我创建了存储过程, 输入类型是数组
用下面的java代码调用, 但数组内的数据无法传进去, 跟踪结果就是null
大虾们帮我分析分析, 是哪里出错了!
...全文
639 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
myh0305 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 inthirties 的回复:]
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABARRAY", conn);

改为

ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("ArrayList", conn);

试试。
[/Quote]

createDescriptor时类型的名称必须是大写的
myh0305 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 robin_ares 的回复:]
create or replace PROCEDURE PROC_TEST
(res IN ArrayList
,rest OUT VARCHAR2)

pl/sql里有ArrayList类型
[/Quote]

创建ArrayList这个类型是没有问题的
myh0305 2009-07-30
  • 打赏
  • 举报
回复
感谢上面各位的回答.
我自己的感觉好像是数据库的问题, 原先在自己的电脑上通过java代码调用这个存储过程是一切没有问题的
但一直到另一台电脑上的时候就出问题了, java调用不行, 但在sqlplus里直接exec存储过程是没问题的.
今天又重新安装了一个oracle数据库, 新部署调用也没有问题

所以判断为那个数据库上原因.
tibetjungle 2009-07-28
  • 打赏
  • 举报
回复
检查一下是不是驱动问题。一般来说,在生产环境不会在java代码中调参数为数组的存储过程或者函数,因为无论是Oracle的官方驱动class12.zip还是第三方驱动,对数组的支持都不好。

看你写的代码,像是在做练习。我看知道怎么在java代码中调一般的存储过程,如何为存储过程设置参数,取出过程的返回值就可以了。
robin_ares 2009-07-28
  • 打赏
  • 举报
回复
create or replace PROCEDURE PROC_TEST
(res IN ArrayList
,rest OUT VARCHAR2)

pl/sql里有ArrayList类型
myh0305 2009-07-28
  • 打赏
  • 举报
回复
create or replace PROCEDURE PROC_TEST
(res IN ArrayList
,rest OUT VARCHAR2)
AS
BEGIN
dbms_output.put_line(res.count);
rest := res(res.count);
END PROC_TEST;

存储过程上面有点错误, 更正成上面的
inthirties 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 myh0305 的回复:]
试了上面几位的方法, 还是有问题
[/Quote]

还是有什么样的问题?老问题还是新问题。

majy 2009-07-28
  • 打赏
  • 举报
回复
rest := res(res.count);

这个好象应该要改成 rest := res(res.count-1); 吧
myh0305 2009-07-28
  • 打赏
  • 举报
回复
试了上面几位的方法, 还是有问题
xjwy 2009-07-28
  • 打赏
  • 举报
回复
学习
inthirties 2009-07-28
  • 打赏
  • 举报
回复
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABARRAY", conn);

改为

ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("ArrayList", conn);

试试。
majy 2009-07-28
  • 打赏
  • 举报
回复
oracle: Arrays in other languages become VARRAYs in PL/SQL.

所以你的第一句:
create or replace type ArrayList as table of varchar2(64);
改为
create or replace TYPE ArrayList IS VARRAY(10) OF varchar2(64)

这样应该可以了
zhangwonderful 2009-07-28
  • 打赏
  • 举报
回复
可以换一种方式:
在oracle中声明数组类型
create or replace type tabarray is table of varchar2(38) ;

构造存储过程:
procedure PROC_TEST(res in tabarray,rest OUT VARCHAR2) is
begin
dbms_output.put_line(res.count);
rest := res(res.count);
end;
然后在java中构造如下代码:
OracleConnection conn = null;
OracleCallableStatement stmt = null;
String[] param = { "1001", "1002", "1006" };
stmt =conn.prepareCall("{call PROC_TEST (?,?)}");
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABARRAY", conn);
stmt.setARRAY(1, new ARRAY(descriptor,conn,param));
stmt.registerOutParameter(2, OracleTypes.ARRAY, "TABARRAY");
stmt.execute();

不妨试试看
suncrafted 2009-07-28
  • 打赏
  • 举报
回复
帮顶了

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧