create or replace type tu_object as object(
 id varchar2(100),
 uname varchar2(100),
 age varchar2(100),
 sex varchar2(100),
 del varchar2(100),
 udate varchar2(100)
)create or replace type tu_table as table of tu_object;create or replace procedure p_ins_gu(intu in tu_table,outtu out varchar2)
as
tid varchar2(100);
ttuo tu_object;
begin    for i in 1..intu.count loop     ttuo := intu(i);    insert into gp_usernew values 
    ( 
     tu_object.id, 
     tu_object.uname, 
     tu_object.age,
     tu_object.sex,
     tu_object.del,
     tu_object.udate 
    );   
  
    tid := intu(i).id;  end loop;   exception
      outtu = tid;end p_ins_gu;
--------------------------------------------------------------------------------------------------------------package com.demo.dao;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;import org.junit.Test;import com.demo.util.JDBCUtils;public class testCursor { @Test
public void testCursor(){
Object[][] objs = {{"gu0000","25","N","男","大山1","2015-11-24"},{"gu0001","24","N","男","大山2","2012-03-04"}};

ArrayList<Object[]> alist = new ArrayList<Object[]>();
alist.add(0, objs[0]);
alist.add(1, objs[1]);

String sql = "{call p_ins_gu(?,?)}";

Connection conn = null;
CallableStatement call = null;
ResultSet rs = null;

try {
conn = JDBCUtils.getConnection();

if(conn != null && !conn.isClosed()){
ARRAY aArray = getArray(conn,"TU_OBJECT","TU_TABLE",alist);

call = conn.prepareCall(sql);

call.setArray(1, aArray);

call.registerOutParameter(2, OracleTypes.VARCHAR);

call.execute();

// String str = call.getString(2);
//
// System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.release(conn, call, rs);
}
} private static ARRAY getArray(Connection con, String OracleObj,String OracleTable, ArrayList<Object[]> objlist) throws Exception {    ARRAY list = null;    if (objlist != null && objlist.size() > 0) {     StructDescriptor structdesc = new StructDescriptor(OracleObj, con);    

STRUCT[] structs = new STRUCT[objlist.size()];    

Object[] result = new Object[objlist.size()];    

for (int i = 0; i < objlist.size(); i++) {     

result = (Object[]) objlist.get(i);

structs[i] = new STRUCT(structdesc, con, result);    
}  

ArrayDescriptor desc = ArrayDescriptor.createDescriptor(OracleTable, con);     

list = new ARRAY(desc, con, structs);    
}
return list;  
}
}
--------------------------------------------------------------------------------------------------------------
java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列: 
PLS-00905: 对象 SCOTT.P_INS_GU 无效
ORA-06550: 第 1 行, 第 7 列: 
PL/SQL: Statement ignored at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:212)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:951)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3390)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4223)
at com.demo.dao.testCursor.testCursor(testCursor.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

解决方案 »

  1.   

    insert into gp_usernew values 
        ( 
         tu_object.id, 
         tu_object.uname, 
         tu_object.age,
         tu_object.sex,
         tu_object.del,
         tu_object.udate 
        );  
    这里tu_object.id用得不对,应该是intu(i).id
    还有Insert into 表名后面最好跟上字段名类型和存储过程应该在命令行中创建,有错误show err
      

  2.   

    一般使用java代码调用存储过程的时候,不会调用带集合类型的,可以考虑添加中间表,将你的集合数据插入到中间表里,调用存储过程时参数为中间表的主键,在存储过程里根据主键查询中间表,获取数据。