如何将声明为Oracle Object类型的参数传递给具有PLSQL表类型参数的Procedure?
例如:
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 Object类型的参数传递给具有PLSQL记录类型参数的Procedure?
例如:
Procedure C(p_obj_dept t_obj_dept)
Procedure D(p_dept_rec t_dept_rec)
其中t_obj_dept =具有2个字段的Oracle对象(deptid,deptname)和t_dept_rec在包规范中声明为t_dept_rec,包含2个字段(deptid,deptname)。
请帮助一些例子。 提前致谢
答案 0 :(得分: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;
/
请注意,没有任何“方便”的方法可以创建另一个对象/记录,即使它们具有相同的成员(例如上面的示例中为t_obj_dept
和t_dept_rec
)。您必须单独复制所有字段的值。
你说t_emp_tab
是“binary_integer的PLSQL表”。我猜你的意思是它是一个由 binary_integer
索引的某种类型的的PL / SQL表,因为通过binary_integer
索引这些表比通常更常见将binary_integer
存储在其中。对于上面的例子,我假设它是t_obj_emp
的表。如果不是,则必须将t_obj_emp
对象映射到任何类型的对象或记录t_emp_tab
是一个表。