0

行オブジェクトを含むオラクル表を扱う場合、各行はオブジェクトであり、その行に対して関数を呼び出したり、任意のコンテキストで関数に渡すことができると予想します。

例として、次のように宣言した場合:

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 ステートメントでは) 呼び出せないのはなぜですか?

これらはすべて、「行オブジェクトのテーブルからオブジェクトを抽出する方法は?」という問題に帰着します。

4

1 に答える 1

1

PL/SQL 型に関するドキュメントを読み直す必要があると思わずにはいられません。

あなたは一括収集コードに近かった. 以下の軽微な変更:

declare
  plsql_table scd_type_table;
begin
  select VALUE(t) bulk collect into plsql_table from scd_table t;
  -- do stuff
end;
/

merge認めますが、失敗する理由はわかりませんが、うまくいきますupdate

于 2012-07-20T05:03:42.320 に答える