将值从Oracle对象类型参数传递到PLSQL表类型参数

将值从Oracle对象类型参数传递到PLSQL表类型参数,oracle,user-defined-types,Oracle,User Defined Types,如何将声明为Oracle对象类型的参数传递给具有PLSQL表类型参数的过程 例如: 其中,t_obj_emp=Oracle对象,t_emp_tab是二进制整数的PLSQL表 如何将声明为Oracle对象类型的参数传递给具有PLSQL记录类型参数的过程 例如: 其中,t_obj_dept=具有2个字段(deptid,deptname)的Oracle对象和t_dept_rec在包规范中声明为具有2个字段(deptid,deptname)的t_dept_rec 请举一些例子。 提前感谢以下内容为我编译

如何将声明为Oracle对象类型的参数传递给具有PLSQL表类型参数的过程

例如:

其中,t_obj_emp=Oracle对象,t_emp_tab是二进制整数的PLSQL表

如何将声明为Oracle对象类型的参数传递给具有PLSQL记录类型参数的过程

例如:

其中,t_obj_dept=具有2个字段(deptid,deptname)的Oracle对象和t_dept_rec在包规范中声明为具有2个字段(deptid,deptname)的t_dept_rec

请举一些例子。
提前感谢

以下内容为我编译,似乎可以满足您的要求:

CREATE OR REPLACE TYPE t_obj_emp AS OBJECT (
  emp_id      INTEGER,
  emp_name    VARCHAR2(100)
);
/

CREATE OR REPLACE TYPE t_obj_dept AS OBJECT (
  dept_id     INTEGER,
  dept_name   VARCHAR2(100)
);
/

CREATE OR REPLACE PACKAGE my_pkg AS

  TYPE t_emp_tab IS TABLE OF t_obj_emp INDEX BY BINARY_INTEGER;

  TYPE t_dept_rec IS RECORD (
    dept_id     INTEGER,
    dept_name   VARCHAR2(100)
  );

  PROCEDURE A(p_obj_emp t_obj_emp);
  PROCEDURE B(p_emp_tab t_emp_tab);
  PROCEDURE C(p_obj_dept t_obj_dept);
  PROCEDURE D(p_dept_rec t_dept_rec);
END;
/

CREATE OR REPLACE PACKAGE BODY my_pkg AS

  PROCEDURE A(p_obj_emp t_obj_emp)
  IS
    v_emp_tab     t_emp_tab;
  BEGIN 
    v_emp_tab(1) := p_obj_emp;
    B(v_emp_tab);
  END;

  PROCEDURE B(p_emp_tab t_emp_tab) IS BEGIN NULL; END;

  PROCEDURE C(p_obj_dept t_obj_dept)
  IS
    v_dept_rec    t_dept_rec;
  BEGIN
    v_dept_rec.dept_id := p_obj_dept.dept_id;
    v_dept_rec.dept_name := p_obj_dept.dept_name;
    D(v_dept_rec);
  END;

  PROCEDURE D(p_dept_rec t_dept_rec) IS BEGIN NULL; END;
END;
/
请注意,没有任何“方便”的方法从另一个对象/记录创建一个对象/记录,即使它们具有相同的成员(如上例中的
t_obj_dept
t_dept_rec
)。必须分别跨所有字段的值进行复制


您说
t\u emp\u tab
是一个“二进制整数的PLSQL表”。我猜你的意思是它是一个PL/SQL表,某种类型的表由
binary\u integer
索引,因为用
binary\u integer
索引这些表比在其中存储
binary\u integer
要常见得多。对于上面的例子,我假设它是一个由
t\u obj\u emp
s组成的表。如果不是,您必须将
t\u obj\u emp
对象映射到任何类型的对象或记录
t\u emp\u选项卡
是一个表。

,假设t_obj_emp=Oracle对象具有一个empID作为字段,t_emp_tab是一个在包规范中声明的二进制整数PLSQL表,因为类型t_empID_tab是t_emp Table的表。emp_ID列按二进制整数索引。如何将值从Oracle对象传递给此对象?如果我理解正确,您只需将过程
A
更改为存储
p_obj_emp.empId
,而不是
p_obj_emp
。PS:请编辑您的问题,以澄清什么是表。
Procedure C(p_obj_dept t_obj_dept)
Procedure D(p_dept_rec t_dept_rec)
CREATE OR REPLACE TYPE t_obj_emp AS OBJECT (
  emp_id      INTEGER,
  emp_name    VARCHAR2(100)
);
/

CREATE OR REPLACE TYPE t_obj_dept AS OBJECT (
  dept_id     INTEGER,
  dept_name   VARCHAR2(100)
);
/

CREATE OR REPLACE PACKAGE my_pkg AS

  TYPE t_emp_tab IS TABLE OF t_obj_emp INDEX BY BINARY_INTEGER;

  TYPE t_dept_rec IS RECORD (
    dept_id     INTEGER,
    dept_name   VARCHAR2(100)
  );

  PROCEDURE A(p_obj_emp t_obj_emp);
  PROCEDURE B(p_emp_tab t_emp_tab);
  PROCEDURE C(p_obj_dept t_obj_dept);
  PROCEDURE D(p_dept_rec t_dept_rec);
END;
/

CREATE OR REPLACE PACKAGE BODY my_pkg AS

  PROCEDURE A(p_obj_emp t_obj_emp)
  IS
    v_emp_tab     t_emp_tab;
  BEGIN 
    v_emp_tab(1) := p_obj_emp;
    B(v_emp_tab);
  END;

  PROCEDURE B(p_emp_tab t_emp_tab) IS BEGIN NULL; END;

  PROCEDURE C(p_obj_dept t_obj_dept)
  IS
    v_dept_rec    t_dept_rec;
  BEGIN
    v_dept_rec.dept_id := p_obj_dept.dept_id;
    v_dept_rec.dept_name := p_obj_dept.dept_name;
    D(v_dept_rec);
  END;

  PROCEDURE D(p_dept_rec t_dept_rec) IS BEGIN NULL; END;
END;
/