如何从行对象的oracle表中获取对象

时间:2012-07-19 09:27:58

标签: sql oracle object types

当处理包含行对象的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语句的一部分(但在更新语句中)?

这些都归结为“如何从行对象表中提取对象?”的问题。

1 个答案:

答案 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无效。