PLS-00306: 从 ADF 调用过程 UDT 时参数的数量或类型错误

PLS-00306: wrong number or types of arguments in call to procedure UDT from ADF

我需要在dummy_emptable中插入数据。

 dummy_table contains:
 emp_id number;
 emp_name varchar2(50);

 create table dummy_emp(empid number,empname varchar2(50));

 I have created Object type for dummy_emp table:

 CREATE OR REPLACE TYPE EMP_OBJ AS OBJECT (empid number,empname varchar2(50));

 I have created table for object type EMP_OBJ as EMP_OBJ_ARR

 create or replace type EMP_OBJ_ARR as table of EMP_OBJ;

 CREATE OR REPLACE PROCEDURE TEST_EMP_OBJ_ARRAY_PROC ( p_obj_array in EMP_OBJ_ARR ) AS
 begin
   for i in 1..p_obj_array.count loop
     insert into dummy_emp (empid, empname)
           values(p_obj_array(i).empid, p_obj_array(i).empname);
   end loop;
 end;
 /
I need to call TEST_EMP_OBJ_ARRAY_PROC from ADF AppModuleImpl.java class by passing parameter for EMP_OBJ_ARR.

为此,

我创建了实现 sqlData 的 java class (EmployeeData.java)。

package view;

import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

 public class EmployeeData implements SQLData {
 private String sql_type="EMP_OBJ";
 public int empNo;
 public String empName;

public EmployeeData() {
    super();
}

public EmployeeData (String sql_type, int empNo, String empName)
{
this.sql_type = sql_type;
this.empNo = empNo;
this.empName = empName;

}
@Override
public String getSQLTypeName() throws SQLException {
    // TODO Implement this method
    return sql_type;
}

@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
    // TODO Implement this method
        sql_type = typeName;
        empName = stream.readString();
        empNo = stream.readInt();
}

@Override
public void writeSQL(SQLOutput stream) throws SQLException {
    // TODO Implement this method
        stream.writeInt(empNo);
       stream.writeString(empName);
}

}

AppModuleImpl.java

中的代码
public void insert()
{
    DBTransaction dbTransaction = this.getDBTransaction();
    String query = "{call TEST_EMP_OBJ_ARRAY_PROC (?)}";
    CallableStatement cs = dbTransaction.createCallableStatement(query,0);
    try {
        //EmployeeData has sql_type as EMP_OBJ which I have defined in pl/sql.
        EmployeeData e=new EmployeeData("EMP_OBJ",1,"xyz");            
        cs.setObject(1,(Object) e);

        cs.executeUpdate();
        dbTransaction.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

这里它应该将对象 e 映射到 TEST_EMP_OBJ_ARRAY_PROC(p_obj_array in EMP_OBJ_ARR)。 但是我得到

的例外
 java.sql.SQLException: ORA-06550: line 1, column 7:
 PLS-00306: wrong number or types of arguments in call to       'TEST_EMP_OBJ_ARRAY_PROC'
 ORA-06550: line 1, column 7:
 PL/SQL: Statement ignored

如何在可调用语句中传递对象以映射 Pl/sql 中的用户定义类型?

您需要调用如下:

call TEST_EMP_OBJ_ARRAY_PROC(EMP_OBJ_ARR(EMP_OBJ(?,?)));

查看演示:

SQL>  CREATE OR REPLACE PROCEDURE TEST_EMP_OBJ_ARRAY_PROC ( p_obj_array in EMP_OBJ_ARR ) AS
  2   begin
  3     for i in 1..p_obj_array.count loop
  4       insert into dummy_emp (empid, empname)
  5             values(p_obj_array(i).empid, p_obj_array(i).empname);
  6     end loop;
  7     commit;
  8   end;
  9   /

Procedure created.

SQL> show error
No errors.
SQL> select * from dummy_emp;

no rows selected

SQL> exec TEST_EMP_OBJ_ARRAY_PROC(EMP_OBJ_ARR(EMP_OBJ(1,'XXX')));

PL/SQL procedure successfully completed.

SQL> select * from dummy_emp;

     EMPID EMPNAME
---------- --------------------------------------------------
         1 XXX