1. 程式人生 > >寫儲存過程時出的錯誤:PLS-00201: 必須宣告識別符號

寫儲存過程時出的錯誤:PLS-00201: 必須宣告識別符號

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;
}

Oracle沒錯,你java沒用明白

儲存過程在包中需要用包名.儲存過程名,如果是其它使用者還要 使用者名稱.包名.儲存過程名

OracleCallableStatement callStatement = (OracleCallableStatement)con.prepareCall("{call insert_object(?)}");

改成

OracleCallableStatement callStatement = (OracleCallableStatement)con.prepareCall("{call objecttype.insert_object(?)}");

對於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;