17.10 PARSEファンクション

このファンクションを使用すると、XML、XLSX、CSVまたはJSONファイルを解析して、次の構造の汎用表を返すことができます。

LINE_NUMBER COL001 COL002 COL003 COL004 ... COL300

通常、値はVARCHAR2形式で返されます。返される表の行は、最大で300個の列を持つことができます。VARCHAR2表列の最大長は4000バイトです。最大行長は指定されていません。サポートされている300列のうち20列はCLOBとして処理できます。

このファンクションを呼び出すと、ファイルの解析がすぐに実行されます。データはコレクションにも一時表にも書き込まれません。

ファイル・プロファイルの解析について

p_file_profileパラメータを渡さない場合、このファンクションは解析中に列情報を使用してファイル・プロファイルを計算します。

p_detect_data_typesY (デフォルト)として渡した場合、このファンクションは解析中に列データ型も検出します。ファンクションが終了した後、GET_FILE_PROFILEを使用して、計算されたファイル・プロファイルを取得します。

  1. PARSEの呼出し: この表ファンクションを使用して、ファイルを解析し、データ・プレビューを表示するための行と列を取得します。
  2. GET_FILE_PROFILEの呼出し - ファイル・プロファイル情報をJSON形式で取得します。
  3. データの処理 - カスタム処理を実行するためのデータ・プロファイルに基づいてSQL問合せを生成します。

ノート:

XLSXの解析は、次のフェーズで行われます。
  1. まず、APEX_ZIPが、XLSXアーカイブから個々のXMLファイルを抽出します。
  2. 次に、XMLTABLE SQLファンクションが実際のXLSXを解析します。

CLOBサポートについて

APEXリリース19.2以降、このパッケージでは、4,000バイトを超える文字列値がサポートされています。サポートされている300列のうち20列をCLOBとして処理できます。CLOBサポートのレベルは、解析されるファイル・タイプによって異なります。

CSVおよびXLSX

  • CLOB値は32Kまでサポートされています。
  • CLOB列は検出中に検出できます
  • データ・プロファイルが検出された場合、4000バイト未満の値は、通常はCOLNNNとして返されます。CLOB値はCLOBNN列で返され、最初の1000文字はCOLNNNとして返されます。データ・プロファイルが渡され、それにCLOB列が定義されている場合は、すべての値がCLOBNN列のみで戻されます。

XML

  • 32Kを超えるCLOB値がサポートされています。
  • CLOB列は検出中に検出できます
  • データ・プロファイルが検出された場合、4000バイト未満の値は、通常はCOLNNNとして返されます。CLOB値はCLOBNN列で返され、最初の1000文字はCOLNNNとして返されます。データ・プロファイルが渡され、それにCLOB列が定義されている場合は、すべての値がCLOBNN列のみで戻されます。

JSON

  • 32Kを超えるCLOB値がサポートされています。
  • CLOB列は、検出中に検出されませんCLOBサポートがアクティブになるのは、CLOB列を含むファイル・プロファイルがp_file_profileパラメータとして渡される場合のみです。
  • 12cデータベースではJSON_TABLEでCLOBがサポートされていないため、CLOB列を含むファイル・プロファイルが渡された場合は、パーサーではXMLTYPEベースの処理が使用されます。処理は著しく遅くなります。

大規模CSVファイルについて

APEX_DATA_PARSER.PARSEに渡されるBLOBが50 MB未満の場合、Oracle APEXにより、BLOBは内部のキャッシュされた一時LOBにコピーされます。したがって、すべてのCSV解析はメモリー内で実行されます。より大規模なBLOBの場合、APEXでは元のBLOBロケータに対してCSV解析が実行されます。表から選択した場合、CSV解析はディスクに対して実行できますが、著しく遅くなる可能性があります。解析されたCSVファイルが50 MBを超えると、パフォーマンスが低下する可能性があります。

ただし、開発者は、大規模ファイルの場合でも、キャッシュされた一時LOBを明示的に作成するためにDBMS_LOB.CREATETEMPORARY (CACHE => TRUEを渡す)およびDBMS_LOB.COPYプロシージャを使用することもできます。元のBLOBのかわりに、キャッシュされた一時LOBをAPEX_DATA_PARSER.PARSEに渡すことができます。この方法では、50 MBを超えるファイルのインメモリー解析も可能になります。

参照:

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスCREATETEMPORARYプロシージャおよびCOPYプロシージャ

構文

FUNCTION PARSE(
    p_content                      IN BLOB,
    p_file_name                    IN VARCHAR2     DEFAULT NULL,
    p_file_type                    IN t_file_type  DEFAULT NULL,
    p_file_profile                 IN CLOB         DEFAULT NULL,
    p_detect_data_types            IN VARCHAR2     DEFAULT 'Y',
    p_decimal_char                 IN VARCHAR2     DEFAULT NULL,
    p_xlsx_sheet_name              IN VARCHAR2     DEFAULT NULL,
    p_row_selector                 IN VARCHAR2     DEFAULT NULL,
    p_csv_row_delimiter            IN VARCHAR2     DEFAULT LF,
    p_csv_col_delimiter            IN VARCHAR2     DEFAULT NULL,
    p_csv_enclosed                 IN VARCHAR2     DEFAULT '"',
    p_skip_rows                    IN PLS_INTEGER  DEFAULT 0,
    p_add_headers_row              IN VARCHAR2     DEFAULT 'N',
    p_file_charset                 IN VARCHAR2     DEFAULT 'AL32UTF8',
    p_max_rows                     IN NUMBER       DEFAULT NULL,
    p_return_rows                  IN NUMBER       DEFAULT NULL,
    p_store_profile_to_collection  IN VARCHAR2     DEFAULT NULL 
    p_fix_excel_precision          IN VARCHAR2     DEFAULT 'N'  )
    RETURN apex_t_parser_table pipelined;

パラメータ

表17-7 PARSEファンクションのパラメータ

パラメータ 説明
p_content BLOBとして解析されるファイル・コンテンツ
p_file_name ファイル・タイプの導出にのみ使用されるファイルの名前。P_FILE_NAMEP_FILE_TYPEまたはP_FILE_PROFILEのいずれかを渡す必要があります。
p_file_type 解析するファイルのタイプ。ファイル・タイプを明示的に渡す場合に使用します。P_FILE_NAMEP_FILE_TYPEまたはP_FILE_PROFILEのいずれかを渡す必要があります。
p_file_profile 解析に使用されるファイル・プロファイル。ファイル・プロファイルは、以前のPARSE()の呼出しで計算されている可能性があります。再度渡した場合、このファンクションは、パフォーマンスを改善するために、一部のプロファイル検出ロジックをスキップして、渡されたプロファイルを使用します。
p_detect_data_types 解析中にデータ型(NUMBER、DATE、TIMESTAMP)を検出するかどうか。'Y'に設定すると、このファンクションはファイル・プロファイルを計算し、そのプロファイルにデータ型情報を追加します。'N'に設定すると、データ型は検出されず、すべての列がVARCHAR2になります。デフォルトは'Y'です。
p_decimal_char NUMBERデータ型を検出する場合は、この小数点文字を使用します。指定しない場合、プロシージャで小数点文字が自動検出されます。
p_xlsx_sheet_name XLSXワークブックの場合。解析するワークシートの名前。省略した場合、このファンクションは最初に検出されたワークシートを使用します。
p_row_selector

JSONおよびXMLファイルの場合。JSONまたはXMLファイル内の行の配列/リストへのポインタ。省略した場合、このファンクションは次のように処理します。

  • XMLファイルの場合: "/*/*" (ルート・タグの下の最初のタグ)を行セレクタとして使用します。
  • JSONファイルの場合: JSON配列を探し、最初に見つかった配列を使用します。
p_csv_row_delimiter CSV解析のデフォルトの行デリミタをオーバーライドします。1文字に制限され、デフォルトでラインフィード(LF)に設定されます。ラインフィード行デリミタ文字は、キャリッジ・リターン/ラインフィード (CRLF)も処理することに注意してください。
p_csv_col_delimiter 特定のCSV列デリミタを使用します。省略した場合、ファンクションは最初の行の内容に基づいて列デリミタを検出します。
p_csv_enclosed CSV解析のデフォルトの囲み文字をオーバーライドします。
p_skip_rows 解析時に最初のN行をスキップします。
p_add_headers_row XML、JSONの場合。列ヘッダー(タグ、属性名)を最初の行として表示します。
p_file_charset ファイル・エンコーディング(UTF-8 (AL32UTF8)以外の場合)。
p_max_rows P_MAX_ROWSが返された後、解析を停止します。
p_return_rows 返される行数。これはパーサーが返す予定の行数よりも多くの行が解析されそうな(データ型検出のため)場合に役立ちます。指定された行数が出力されると、このファンクションは、P_MAX_ROWSに達するまで、またはSQL問合せのROWNUM < x句に到達して実行が停止されるまで、解析(および検出されたデータ型の調整)を続行します。
p_store_profile_to_collection 解析時に計算されたファイル・プロファイルをコレクションに格納します。コレクションが存在する場合は、クリアされます。計算されたプロファイルにのみ使用できます。
p_fix_excel_precision

XLSXファイルの数値を15桁の有効桁数に丸めるかどうか。これは、Microsoft Excelで生成されたXLSXファイルに役立ちます。Excelでは、最大15桁の有効桁数の浮動小数点数として数値を格納します。計算結果に関して、端数処理の問題が発生する可能性がありますが、このパラメータを使用すれば修正できます。

関連項目: https://docs.microsoft.com/en-us/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result

戻り値

APEX_T_PARSER_ROW型の行を返します。

LINE_NUMBER COL001 COL002 COL003 COL004 ... COL300

select line_number, col001,col002,col003,col004,col005,col006,col007,col008
   from table( 
              apex_data_parser.parse(
                  p_content         => {BLOB containing XLSX spreadsheet},
                  p_file_name       => 'test.xlsx',
                  p_xlsx_sheet_name => 'sheet1.xml') ) ;

LINE_NUMBER COL001   COL002       COL003       COL004   COL005          COL006   COL007       COL008 
----------- -------- ------------ ------------ -------- --------------- -------- ------------ --------
          1 0        First Name   Last Name    Gender   Country         Age      Date         Id
          2 1        Dulce        Abril        Female   United States   32       15/10/2017   1562
          3 2        Mara         Hashimoto    Female   Great Britain   25       16/08/2016   1582
          4 3        Philip       Gent         Male     France          36       21/05/2015   2587
          5 4        Kathleen     Hanner       Female   United States   25       15/10/2017   3549
          6 5        Nereida      Magwood      Female   United States   58       16/08/2016   2468
          7 6        Gaston       Brumm        Male     United States   24       21/05/2015   2554
          8 7        Etta         Hurn         Female   Great Britain   56       15/10/2017   3598
          9 8        Earlean      Melgar       Female   United States   27       16/08/2016   2456
         10 9        Vincenza     Weiland      Female   United States   40       21/05/2015   6548
          : :        :            :            :        :               :        :            :

select line_number, col001,col002,col003,col004,col005,col006,col007,col008
   from table( 
              apex_data_parser.parse(
                  p_content         => {BLOB containing JSON file},
                  p_file_name       => 'test.json') ) ;

LINE_NUMBER COL001    COL002   COL003                                COL004          COL005
----------- --------- ---------------------------------------------- --------------- --------------
          1 Feature   1.5      41km E of Cape Yakataga, Alaska       1536513727239   1536514117117
          2 Feature   0.21     11km ENE of Aguanga, CA               1536513299520   1536513521231
          3 Feature   1.84     5km SSW of Pahala, Hawaii             1536513262940   1536513459610
          4 Feature   2.55     9km W of Volcano, Hawaii              1536513100890   1536513446680
          5 Feature   1.3      62km ESE of Cape Yakataga, Alaska     1536512917361   1536513322236
          6 Feature   1.79     7km SW of Tiptonville, Tennessee      1536512379690   1536512668010
          7 Feature   1.9      126km NNW of Arctic Village, Alaska   1536512346186   1536512846567
          8 Feature   1.4      105km NW of Arctic Village, Alaska    1536512140162   1536512846334