web-dev-qa-db-ja.com

DB2 syscat.routinesとsysibm.routinesの比較

DB2 luwからすべてのルーチン名を選択する必要があります。次のカタログテーブルを見ました。

  • sysibm.routines
  • syscat.routines

次のクエリを実行すると、

select count(*) from sysibm.routines;
select count(*) from syscat.routines;

結果には大きな違いがあります。これらのビューの違いは何ですか?また、すべてのルーチン名を選択するタスクにどのビューを使用する必要があるかを誰かが教えてもらえますか?

2
zuckermanori

SYSIBM.ROUTINESとSYSCAT.ROUTINESはどちらも、実際には「実際の」カタログ表SYSIBM.SYSROUTINESに対するビューです。次のように、各ビューのSQL定義を取得できます。

SELECT TEXT
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = 'SYSIBM' AND VIEWNAME = 'ROUTINES';

SELECT TEXT
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = 'SYSCAT' AND VIEWNAME = 'ROUTINES';

IBMが独占的であると考えているかどうかわからないため、結果をここに掲載することはしません(結局、DB2自体からの技術的なソースです)。とにかく、ビューのソースを見ると(最初にいくつかの SQL lint -like tool!

  • SYSIBM.ROUTINESは、タイプが「T」および「R」の関数を除外します(つまり、テーブルおよび行の関数なので、スカラー関数、集約、およびプロシージャーのみが含まれます)。これはおそらく違いの多くを説明しています。
  • SYSIBM.ROUTINESは、スキーマSYSFUN内のルーチンを除外します。 SYSFUNには100以上のルーチンがあるため、これはおそらく違いの残りの部分を説明しています。
  • SYSCAT.ROUTINESは、ルーチンをSYSIBMINTERNALスキーマからのみ除外します(これらのルーチンはほんの少ししかありません-上記の制限を前提として、SYSIBM.ROUTINESにall/some/noneが表示されるかどうかは不明です)。
  • 各ビューには大量の結合がありますが、それらはすべて1対1であり、SYSIBM.SYSROUTINESによって指示される結果のカーディナリティには影響しません(これらの結合のほとんどは、物事を取り込むためのものです)結果タイプや照合の詳細など)。

背景:

  • SYSIBMスキーマのSYSで始まるテーブルは、すべてが基づいているrealカタログテーブルです。これらは文書化されていないため、通常はこれらを気にしません。また、作業するのが少し面倒です(ただし、DB2 for z/OSのように、前回SYSCATを使用していなかったため、SYSCATを使用しなかったため、これらのテーブルしか使用できません。持っている)。
  • SYSIBMスキーマのSYSで始まるビューではないの構造は 標準のINFORMATION_SCHEMA と非常に似ています。おそらく何かがそれらをそのまま使用している可能性があります(JDBCメソッド、またはさまざまなドライバーのカタログ関数など)。ただし、それらが文書化されていないため、ビューの定義を見ないで(上記のトリックを使用して)何が含まれている/含まれていないのかを正確に知ることは困難です。 。
  • SYSCATスキーマのビューは非常に便利です。それらは 十分に文書化されています であり、一般的に操作が非常に簡単です(残念ながら、これらはLUW固有のDB2でもあります)。

言い換えれば、私は通常、SYSCATの結果を「ゴスペル」として扱いますが、何が表示されているかを正確に理解したい場合は、ソースに飛び込む必要があります。

2
Dave Jones