35.16 GET_DATA2ファンクションのシグネチャ1

このファンクションは、(オプションで検索文字列を指定して制限できる)指定済のSQL問合せを実行し、各列の値を返します。すべての列値は、元のデータ型に従って戻されます。検索列は、p_search_column_noパラメータに列番号を指定することによって識別されます。このファンクションでは、アプリケーションに定義されている「文字の値の比較」グローバリゼーション属性が考慮されます。

構文

APEX_PLUGIN_UTIL.GET_DATA2 (
    p_sql_statement     IN VARCHAR2,
    p_min_columns       IN NUMBER,
    p_max_columns       IN NUMBER,
    p_data_type_list    IN wwv_global.vc_arr2   DEFAULT c_empty_data_type_list,
    p_component_name    IN VARCHAR2,
    p_search_type       IN VARCHAR2 DEFAULT 2,
    p_search_column_no  IN VARCHAR2 DEFAULT 2,
    p_search_string     IN VARCHAR2 DEFAULT NULL,
    p_first_row         IN NUMBER   DEFAULT NULL,
    p_max_rows          IN NUMBER   DEFAULT NULL)
RETURN t_column_value_list2;

パラメータ

表35-19 GET_DATA2のパラメータ

パラメータ 説明
p_sql_statement 参照に使用されるSQL文。
p_min_columns 戻り列の最小数。
p_max_columns 戻り列の最大数。
p_data_type_list

指定する場合は、各列のデータ型が配列内の指定されたデータ型と一致することを確認します。使用可能なデータ型の定数c_data_type_*を使用します。

p_component_name エラーが戻される場合、エラー・メッセージが表示される際のページ・アイテムまたはレポート列の名前として、この値が使用されます。
p_search_type 次のいずれかのc_search_*定数である必要があります。
  • c_search_contains_case
  • c_search_contains_ignore
  • c_search_exact_case
  • c_search_exact_ignore
p_search_column_no SQL文を制限するために使用する列の数。p_min_columnsからp_max_columnsの範囲内である必要があります。
p_search_string 問合せを制限するために使用する値。
p_first_row 指定した行から問合せを開始します。指定した行より前の行はすべてスキップされます。
p_max_rows 可能な戻り行の最大数。

戻り値

表35-20 GET_DATA2の戻り値

戻り値 説明
t_column_value_list2 列番号で索引付けされたt_column_valuesの表

例1

次の例では、簡単なアイテム・タイプのプラグインのレンダリング・ファンクションが、ページ・アイテムに定義されたLOVを実行し、ページ・アイテムの現在の値を使用して大/小文字が区別されるLIKEフィルタ処理を実行しています。その後、結果をHTMLリストとして生成します。ここでは、LOV SQL文の最初の列がVARCHAR2で、2番目の列がNUMBERであるかが確認されます。

function render_list (
    p_item                in apex_plugin.t_page_item,
    p_value               in varchar2,
    p_is_readonly         in boolean,
    p_is_printer_friendly in boolean )
    return apex_plugin.t_page_item_render_result
IS
    l_data_type_list    apex_application_global.vc_arr2;
    l_column_value_list apex_plugin_util.t_column_value_list2;
BEGIN
    -- The first LOV column has to be a string and the second a number
    l_data_type_list(1) := apex_plugin_util.c_data_type_varchar2;
    l_data_type_list(2) := apex_plugin_util.c_data_type_number;
    --
    l_column_value_list :=
        apex_plugin_util.get_data2 (
            p_sql_statement    => p_item.lov_definition,
            p_min_columns      => 2,
            p_max_columns      => 2,
            p_data_type_list   => l_data_type_list,
            p_component_name   => p_item.name,
            p_search_type      => apex_plugin_util.c_search_contains_case,
            p_search_column_no => 1,
            p_search_string    => p_value );
    --
    sys.htp.p('<ul>');
    FOR i in 1 .. l_column_value_list.count
    LOOP
        sys.htp.p(
            '<li>'||
            sys.htf.escape_sc(l_column_value_list(1).value_list(i).varchar2_value)|| -- display column
            '-'||
            sys.htf.escape_sc(l_column_value_list(2).value_list(i).number_value)|| -- return column
            '</li>');
    END LOOP;
    sys.htp.p('</ul>');
END render_list;

例2

次の例では、単純なリージョン・タイプ・プラグインのレンダリング・ファンクションが、そのリージョンに定義されているSQL問合せを実行します。結果はHTMLリストとして生成されます。この例では、SDO_GEOMETRYなどのオブジェクト・タイプ列の高度な処理を示します。

function render (
    p_region in apex_plugin.t_region,
    p_plugin in apex_plugin.t_plugin,
    p_is_printer_friendly in boolean )
    return apex_plugin.t_region_render_result
IS
    l_column_value_list apex_plugin_util.t_column_value_list2;
    l_geometry sdo_geometry;
    l_value varchar2(32767);
    l_dummy pls_integer;
BEGIN
    l_column_value_list :=
        apex_plugin_util.get_data2 (
            p_sql_statement => p_region.source,
            p_min_columns => 1,
            p_max_columns => null,
            p_component_name => p_region.name );
   --
   sys.htp.p('<ul>');
   FOR row in 1 .. l_column_value_list(1).value_list.count LOOP

       sys.htp.p('<li>');
       
       FOR col in 1 .. l_column_value_list.count LOOP
            IF l_column_value_list(col).data_type = 'SDO_GEOMETRY' THEN

               -- Object Type columns are always returned using ANYDATA and we have to
               -- use GETOBJECT to transform them back into the original object type
               l_dummy := l_column_value_list(col).value_list(row).anydata_value.getobject(
l_geometry );
               l_value := '( type=' || l_geometry.sdo_gtype || ' srid=' || l_geometry.sdo_srid ||
                          case when l_geometry.sdo_point is not null THEN
                               ',x=' || l_geometry.sdo_point.x ||
                               ',y=' || l_geometry.sdo_point.y ||
                               ',z=' || l_geometry.sdo_point.z
                          END ||
                          ' )';
               ELSE
                          l_value := apex_plugin_util.get_value_as_varchar2(
                                  p_data_type => l_column_value_list(col).data_type,
                                  p_value => l_column_value_list(col).value_list(row) );
               END IF;

               sys.htp.p( case when col > 1 then ' - ' END || l_value );
          END LOOP;
          
          sys.htp.p('<li>');
      END LOOP;
      sys.htp.p('<ul>');

      RETURN null;
END;