Oracleデータリネージ:PL/SQLストアドプロシージャとパッケージの分析

Oracle データ系統 これは、Oracle環境内でデータがどのように移動するかを示す列レベルのマップです。どのソーステーブルと列が各ターゲットテーブル、ビュー、またはマテリアライズドビューにデータを提供し、どのPL/SQLパッケージ、プロシージャ、関数、およびトリガーがデータの移動を実行するかを示します。ほとんどのOracle環境では、変換ロジックはスタンドアロンクエリではなくPL/SQLに存在するため、正確なデータリネージには、Oracle SQLだけでなく、PL/SQLをプロシージャ言語として解析するツールが必要です。 Gudu SQLFlow 専用の PL/SQL パーサーが付属しており、動的 SQL も含まれています。 即時実行.

自分のコードでテストしてみてください。 Oracleパッケージ本体を貼り付ける 無料のSQLFlow系統可視化ツールOracleの方言を選択すると、生成される列レベルの系統図とプロシージャ呼び出しグラフが表示されます。

OracleのデータリネージがSELECT文の解析よりも難しい理由

Oracle データベースは、良い意味で古くなっています。多くの本番環境では、20 年以上蓄積されたビジネス ロジックが使用されており、その大部分は PL/SQL です。夜間のロード、マートの更新、調整ジョブ、監査証跡は、パッケージがプロシージャを呼び出し、関数を呼び出し、その過程でトリガーが起動するという形で実装されています。 選択, 入れる、 と ビューの作成 そうした不動産の表面的な部分だけを見て、その根底にある論理のほとんどを見落としてしまう。

技術的な理由は、PL/SQLはSQLではないからです。PL/SQLは、宣言、制御フロー、カーソル、例外ハンドラ、パッケージ仕様、本体といった独自の文法を持つブロック構造の手続き型言語です。SQL文はその構造の中に埋め込まれており、その入力と出力は変数、パラメータ、カーソルループを通して流れます。PL/SQLからリネージを抽出するには、手続き型レイヤーを解析し、その中の値を追跡し、埋め込まれたSQL文同士を接続する必要があります。SQLのみの文法ではこれができないため、汎用的なリネージ抽出ツールは通常、手続き本体を完全にスキップするか、最初の段階で失敗します。 始める ブロック。

拡張機能付きのSQLパーサーではなく、専用のPL/SQLパーサー。

SQLFlowは、 汎用SQLパーサーこれは、2000年代半ばから開発され、方言ごとに約13,600のテストフィクスチャで検証された商用SQLコンパイラのフロントエンドです。Oracle向けには、クエリ、DDL、ビュー用のOracle SQLパーサーと、PL/SQL用の独立した手続き型パーサーの2つを提供します。PL/SQLパーサーは、Oracleの変換ロジックが実際に存在するオブジェクト型を処理します。

  • パッケージ: パッケージに含まれるすべての手順と関数を網羅的に分析し、パッケージ境界を越えた呼び出しグラフも作成する。
  • 手順と機能: プロシージャパラメータと一時テーブルを通して履歴が追跡されるため、引数として入力されテーブルに格納される値は、端から端まで接続されます。
  • トリガー: 行レベルのロジックでデータをコピーまたは変換します 入れる, アップデート、 また 消去 目に見えない副作用として残るのではなく、系統図に現れる。
  • 動的SQL: 実行時に組み立てられ、実行されるステートメント 即時実行 スキップされるのではなく、解決され分析される。

オブジェクトごとの分析に加えて、SQLFlow はインタラクティブな コールグラフパッケージ境界を越えて、どのプロシージャがどのプロシージャを呼び出すか。コードベースでは etl_driver.run_nightly 関数が12個のパッケージプロシージャに分岐する場合、呼び出しグラフによって、実際に目的のテーブルを書き込むプロシージャを見つけることができます。

例:パッケージ手順による系統追跡

以下は簡略化された、しかし代表的なパターンです。ステージング環境から日次収益マートをロードするパッケージプロシージャです。

CREATE OR REPLACE PACKAGE BODY sales_etl AS PROCEDURE load_revenue_mart(p_load_date IN DATE) IS BEGIN DELETE FROM mart.revenue_daily WHERE day_id = TO_CHAR(p_load_date, 'YYYYMMDD'); INSERT INTO mart.revenue_daily (day_id, region_name, total_amount) SELECT TO_CHAR(o.order_date, 'YYYYMMDD'), r.region_name, SUM(o.amount) FROM staging.orders o JOIN dim.region r ON r.region_id = o.region_id WHERE o.status = 'SHIPPED' AND TRUNC(o.order_date) = TRUNC(p_load_date) GROUP BY TO_CHAR(o.order_date, 'YYYYMMDD'), r.region_name; END load_revenue_mart; END sales_etl;

SQLFlowはパッケージ本体を読み込み、出力列ごとに以下の内容を報告します。 mart.revenue_daily.total_amount 供給源は ステージング注文数 を通して ; 地域名 から来る dim.region.region_name 参加を通じて リージョンID; 日ID から派生する ステージング注文注文日 を通して TO_CHARまた、以下のことも記録されています。 o.ステータス, o.注文日、そしてパラメータ p_load_date 結果を形作る どこ 条項、そしてその手順は セールス_etl 呼び出しグラフ内のパッケージ。これを不動産内の数百もの手順に掛け合わせると、手動のドキュメントでは決して最新の状態に保たれない依存関係マップが得られます。

動的SQL:EXECUTE IMMEDIATEの盲点

Oracleチームは、パーティション名付きテーブルのロード、プロシージャからのDDLの適用、構成行をターゲットとするステートメントの構築など、動的SQLを頻繁に利用しています。このようなコードが、ほとんどのデータリネージ抽出を諦める原因となっています。

v_sql := 'INSERT INTO mart.revenue_archive (day_id, region_name, total_amount) SELECT day_id, region_name, total_amount FROM mart.revenue_daily WHERE day_id = :d'; EXECUTE IMMEDIATE v_sql USING v_day_id;

SQLFlow はプロシージャ内の動的 SQL を解決し、組み立てられたステートメントを分析するため、 mart.revenue_daily の中へ mart.revenue_archive 静かに捨てられるのではなく、捕獲されます。 即時実行 非常に重要なことですが、これはどの系統追跡ツールを信頼する前に検証すべき唯一の機能です。独自の動的SQLプロシージャをツールに通して、対象のテーブルがグラフに表示されるかどうかを確認してください。

Oracleコードにおける直接的および間接的な系統

SQLFlowは区別します 直系の血統 (ソース列の値がターゲット列に格納される) 間接的な系統 (列は結果を どこ 述語、 参加する 状態、 グループ分け(または出力に表示されずに集計される)。上記の例では、 注文状況 決して市場には到達しないが、その値を変更すると、市場内のすべての数値が変わる。この図では、2 つの関係タイプを個別に切り替えることができるため、影響分析では、フィルタのみの依存関係を意図的に含めたり除外したりできる。競合するほとんどのツールはこの区別をモデル化していないため、影響分析が狭すぎる(フィルタ列が欠落している)か、ノイズが多すぎる(すべてがすべてに接続されている)かのどちらかになる。

OracleコードをSQLFlowに取り込む

入力方法いつ使うべきか
SQLまたはPL/SQLを貼り付けてくださいブラウザ上で単一のパッケージ、プロシージャ、またはスクリプトをすばやくチェックする
ファイルをアップロードするエクスポートされたDDLとPL/SQLソースを一括分析する
ライブJDBC接続スキーマメタデータ、ビュー定義、および保存済みコードをデータベースから直接取得する
Grabitメタデータ抽出Grabitコンパニオンツールを使用してメタデータを抽出し、それをSQLFlowに渡す

どちらのルートを選択しても、SQLFlow は SQL と PL/SQL テキストおよびスキーマ メタデータの静的解析を実行します。テーブルの行を読み取ることはありません。銀行やその他の規制対象の Oracle ショップの場合、 オンプレミス版 お客様のネットワーク内でDockerまたはKubernetesとして動作し、完全なエアギャップ環境も実現するため、ソースコード自体がお客様のインフラストラクチャから外部に出ることはありません。エンタープライズ規模では、100以上のデータベースと100万以上の列からなる環境をバッチスキャンし、増分スキャンやDataHub、Microsoft Purview、OpenMetadata用のエクスポートアダプタも備えています。

Oracle移行と混合環境

データリネージは、Oracle環境が直面するまさにその瞬間、つまり移行時に最も価値を発揮します。ワークロードをSnowflake、BigQuery、またはDatabricksに移行する前に、リネージグラフによって、実際にビジネスで使用されるレポートにデータを提供しているパッケージ、使用されていないテーブル、およびオブジェクトを移行する必要がある順序がわかります。移行後、新しいプラットフォームで分析を再実行することで、孤立したオブジェクトが残っていないことを確認できます。SQLFlowは、方言固有の文法を使用して39の方言を解析するため、同じツールで移行の両端をカバーできます。

Oracleのみを使用している大規模なシステムはほとんどありません。同じ手続き型解析深度が利用可能です。 SQL Server T-SQLの系譜倉庫プラットフォームなど テラデータ それぞれ独自の方言固有の構文解析器を持っています。1つの系統リポジトリに全系統を格納できます。

オープンソースのパーサーが適合する場所

オープンソースプロジェクト SQL Lineagesqlglot 個々のクエリの解析には非常に優れており、スタンドアロンの SELECT および INSERT ステートメントからテーブルレベルのリネージを抽出するには、それだけで十分かもしれません。Oracle 作業のギャップは、パッケージ本体、パラメータフロー、トリガー、および 即時実行 これらはまさに汎用SQLパーサーが想定していない構造であり、Oracle環境では変換ロジックの大部分がそこに集中しています。正直な評価は経験的に行うしかありません。最大のパッケージ本体を候補となるツールで実行し、それぞれのツールが対象テーブルをいくつ検出できるかを数えてみてください。

よくある質問

SQLFlowはOracleのストアドプロシージャとパッケージの履歴を追跡できますか?

はい。SQLFlowには、Oracle SQLパーサーとは別に、パッケージ、プロシージャ、関数、トリガーを解析する専用のPL/SQLパーサーが搭載されています。プロシージャパラメータと一時テーブルを通してデータの流れを追跡し、対話型の呼び出しグラフでパッケージ間のプロシージャ呼び出しを表示します。

SQLFlowはEXECUTE IMMEDIATE動的SQLを処理できますか?

はい。PL/SQLプロシージャ内で組み立てられた動的SQLはスキップされるのではなく解決され分析されるため、 即時実行 ソースからターゲットへのフローをリネージグラフに追加する。

SQLFlowは私のOracleデータにアクセスする必要がありますか?

いいえ。SQLFlowはSQLおよびPL/SQLコードの静的解析を実行し、必要に応じてJDBC経由でスキーマメタデータを読み取ります。テーブルの行データを読み取ることはありません。オンプレミス版では、SQLテキストもネットワーク内に留まります。

Oracleの無料版でも、列レベルの系統追跡機能は利用できますか?

はい。 SQLFlow クラウド 無料ティアがあります:ブラウザにOracle SQLまたはPL/SQLを貼り付けると、列レベルの系統図を取得できます。プレミアムは月額$49.99、オンプレミスは月額$500、または選択したデータベースタイプごとに1回限りの$4,800です。参照 価格設定 詳細は

Oracleの系統情報をデータカタログにエクスポートできますか?

はい。Lineage は JSON、CSV、または PNG 形式でエクスポートされ、REST API を介してクエリを実行できます。また、エンタープライズ展開では、DataHub、Microsoft Purview、および OpenMetadata 用のエクスポートアダプタが含まれているため、SQLFlow は、既に実行しているカタログの背後にある PL/SQL 対応のLineage エンジンとして機能します。

PL/SQLに隠された系譜をご覧ください

無料のビジュアライザーにパッケージ本体を貼り付けるか、オンプレミスのOracle環境全体をスキャンすることについてご相談ください。