create table gpscoordinate(
id int primary key,
longitude VARCHAR(32),
latitude VARCHAR(32)
name VARCHAR(32),
time VARCHAR(32)
);
CREATE TYPE department_type AS OBJECT (
longitude VARCHAR(32),
latitude VARCHAR(32)
name VARCHAR(32),
time VARCHAR(32)
);
CREATE TYPE dept_array AS TABLE OF department_type;
create or replace package objecttype
as
procedure insert_object(d dept_array);
end objecttype;
create or replace package body objecttype
as
procedure insert_object(d dept_array)
as
begin
for i in d.first .. d.last
loop
insert into gpscoordinate(longitude,latitude,name,time) values(d(i).longitude,d(i).latitude,d(i).name,d(i).time);
end loop;
end insert_object;
end objecttype;//JAVA代码
{
Connection con=Util.getConnection();
con.setAutoCommit(false);
try{     StructDescriptor  st = new StructDescriptor ("DEPARTMENT_TYPE",con);

STRUCT[] deptArray = new STRUCT[name.length];
for(int i=0;i<name.length;i++){
Object[] so={longitude[i],latitude[i],name[i],time};
deptArray[i]=new STRUCT(st,con,so);

}
 
        
        ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("DEPT_ARRAY", con);
        ARRAY deptArrayObject = new ARRAY(arrayDept, con, deptArray); 
        OracleCallableStatement callStatement = (OracleCallableStatement)con.prepareCall("{call insert_object(?)}");
        callStatement.setArray(1, deptArrayObject);
        callStatement.execute(); 
        con.commit();
        
        Util.close(con, callStatement, null);
        int k=this.getCount();
System.out.println("现有记录条数:"+k);
}catch(Exception e){
con.rollback();
e.printStackTrace();
flag=false;
}
return flag;
}

解决方案 »

  1.   

    -- 不显示删除回复显示所有回复显示星级回复显示得分回复 写存储过程时出的错误:PLS-00201: 必须声明标识符 'INSERT_OBJECT'
    --你没有申明此过程create or replace package objecttype
    as
    procedure insert_object(d dept_array);
    end objecttype;

    --先执行下创建包头就申明了此过程
    create or replace package body objecttype
    as
    procedure insert_object(d dept_array)
    as
    begin
    for i in d.first .. d.last
    loop
    insert into gpscoordinate(longitude,latitude,name,time) values(d(i).longitude,d(i).latitude,d(i).name,d(i).time);
    end loop;
    end insert_object;
    end objecttype;
      

  2.   

    create or replace package objecttype
    as
    procedure insert_object(d dept_array);
    end objecttype;
    create or replace package body objecttype
    as
    procedure insert_object(d dept_array)
    as
    begin
    for i in d.first .. d.last
    loop
    insert into gpscoordinate(longitude,latitude,name,time) values(d(i).longitude,d(i).latitude,d(i).name,d(i).time);
    end loop;
    end insert_object;改为END;
    end objecttype;
      

  3.   

    end insert_object;改为END;
    这个无关吧
      

  4.   

    貌似是权限不够的问题,你用的是SCOTT用户登录的么?
    我开始用SCOTT用户登录,然后在Java代码里调用存储过程,也是报这个错,后来在这里http://hi.baidu.com/yodu/blog/item/9a5bab137bbfabd3f6039e37.html看了说是权限不足的问题,
    然后用SYS以DBA的身份登录后就可以运行了
    Properties文件配置如下:
    jdbc.driver=oracle.jdbc.driver.OracleDriver
    jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oratest
    jdbc.user=SYS AS SYSDBA
    jdbc.password=root
    不知能否帮到你!
      

  5.   

    Oracle没错,你java没用明白存储过程在包中需要用包名.存储过程名,如果是其它用户还要 用户名.包名.存储过程名OracleCallableStatement callStatement = (OracleCallableStatement)con.prepareCall("{call insert_object(?)}");改成OracleCallableStatement callStatement = (OracleCallableStatement)con.prepareCall("{call objecttype.insert_object(?)}");
      

  6.   

    +1,对于package里面的procedure调用,不管是JAVA还是oracle,都是包名.过程名这样调用..
    create or replace package testpkg is  procedure test1(arg1 in date);end testpkg;create or replace package body testpkg is  procedure test1(arg1 in date) is
        v date;
      begin
        v:=arg1;  end;end testpkg;--调用包的过程
    create or replace procedure testprg is
    begin
      testpkg.test1(sysdate);
    end testprg;
      

  7.   

    楼上正解啊,今天发现用DBA的身份去登录,调SCOTT新写的存储过程还是抛异常,后来试了用[SCOTT.存储过程名]调用发现可以了,然后才知道得这样用