行オブジェクトを含むオラクル表を扱う場合、各行はオブジェクトであり、その行に対して関数を呼び出したり、任意のコンテキストで関数に渡すことができると予想します。
例として、次のように宣言した場合:
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;
/
代わりに、すべての行でコンストラクターを呼び出す必要があります。
そして最後に、update ステートメントでは機能しますが、merge ステートメントで関数を呼び出すことはできません。例:
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.
したがって、ここには3つのサブ質問があると思います。
1) 行オブジェクトのテーブルを、同じ型のネストされたテーブルを期待するプロシージャに渡す最も簡単な方法は何ですか?
2) 行オブジェクトのテーブルを同じタイプのネストされたテーブルに変換する最も簡単な方法は何ですか?
3) オブジェクトの関数を、merge ステートメントの一部として (ただし update ステートメントでは) 呼び出せないのはなぜですか?
これらはすべて、「行オブジェクトのテーブルからオブジェクトを抽出する方法は?」という問題に帰着します。