TABLE関数でオブジェクトタイプ(オブジェクトのテーブルではない)にアクセスするにはどうすればよいですか?
テーブル関数はオブジェクトのコレクションに対して機能しますが、TABLE 関数を使用して単一の行にアクセスする必要があります。
オブジェクト型のコレクションではなくオブジェクト型で TABLE 関数を使用しようとすると、「ORA-22905: ネストされていないテーブル項目から行にアクセスできません」というエラーが表示されます。
私が使用する回避策は、このオブジェクトにテーブル タイプのコレクションを作成し、行を最初のインデックスに配置してから、関数でテーブル タイプを使用することです。他の簡単な解決策はありますか?
オブジェクトをテーブルの行であるかのようにクエリする必要があります。これは、2 つの異なるユース ケースをサポートするために、アプリケーションに共通のコード ベースを持たせるためです。
共通のコード ベースを使用して、同じ SELECT クエリを使用して、実際のテーブルから、または TABLE 関数を使用して単一行オブジェクトからレコードをクエリできます。動的 SQL の FROM 句のみが変更されます。
CASE 1:
Querying a physical table
v_select := 'SELECT a,b,c,d '
v_from := ' FROM ' || v_actual_table
v_where := '<where_predicate>
EXECUTE IMMEDIATE v_select || v_from || v_where;
CASE 2:
Querying a row object using TABLE function. The row object is coming from Oracle AQ channel in the form of messages.
v_select := 'SELECT a,b,c,d '
v_from := ' FROM TABLE(:1)'
v_where := '<where_predicate>
EXECUTE IMMEDIATE v_select || v_from || v_where USING v_table_type;
これが明確になることを願っています。