2

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

例如:

Procedure A(p_obj_emp t_obj_emp)
Procedure B(p_emp_tab t_emp_tab)

其中 t_obj_emp = Oracle Object 和 t_emp_tab 是 binary_integer 的 PLSQL 表

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

例如:

Procedure C(p_obj_dept t_obj_dept)
Procedure D(p_dept_rec t_dept_rec)

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

请帮忙举个例子。提前致谢

4

1 回答 1

2

以下为我编译并且似乎可以执行您想要的操作:

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

请注意,没有任何“方便”的方法可以从另一个对象/记录创建一个对象/记录,即使它们具有相同的成员(例如上面示例中的 at_obj_deptt_dept_rec)。您必须单独复制所有字段的值。

你说那t_emp_tab是一个“二进制整数的PLSQL表”。我猜你的意思是它是由 索引 的某种类型的 PL/SQL 表,因为索引这些表比在其中存储 sbinary_integer更为常见。对于上面的示例,我假设它是一个s 表。如果不是,则必须将对象映射到表中的任何类型的对象或记录。binary_integerbinary_integert_obj_empt_obj_empt_emp_tab

于 2013-03-09T12:56:03.683 回答