当处理包含行对象的oracle表时,我希望每行都是一个对象,我可以在其上调用函数或将其传递给任何上下文中的函数。
作为示例,如果我声明以下内容:
create type scd_type as object
(
valid_from date,
valid_to date,
member function get_new_valid_to return date
);
create type scd_type_table as table of scd_type;
create table scd_table of scd_type;
create procedure scd_proc (in_table in scd_type_table)
as
begin
... do stuff ...
end;
/
现在我尝试用表格调用我的proc
begin
scd_proc (scd_table);
end;
/
我收到错误。即使将行读入嵌套表也不是直截了当的。我希望它能像这样工作:
declare
temp_table scd_type_table;
begin
select * bulk collect into temp_table from scd_table;
... do stuff ...
end;
/
但我必须为每一行调用构造函数。
最后我无法在merge语句中调用函数,即使它在update语句中有效。例如:
update scd_table st
set st.valid_to = st.get_new_valid_to(); <--- Works.
merge into scd_table st
using (select sysdate as dateCol from dual) M
on (st.valid_from = M.dateCol)
when matched then update set st.valid_to = st.get_new_valid_to(); <--- Does not work.
所以我猜这里有三个子问题:
1)将行对象表传递给期望相同类型嵌套表的过程的最简单方法是什么?
2)将行对象表转换为相同类型的嵌套表的最简单方法是什么?
3)为什么我不能在对象上调用函数作为merge语句的一部分(但在更新语句中)?
这些都归结为“如何从行对象表中提取对象?”的问题。
答案 0 :(得分:1)
我不禁想到你需要重新阅读documentation on PL/SQL types。
您接近批量收集代码。下面给出的小改动:
declare
plsql_table scd_type_table;
begin
select VALUE(t) bulk collect into plsql_table from scd_table t;
-- do stuff
end;
/
我承认,我不知道为什么merge
失败但update
无效。