3

背景: DB2 の iSeries バージョン。どの環境にも、他のテーブルに関する位置列情報を含むテーブルがあります。このテーブルのデータは静的であり、テーブルが変更されるたびに再生成する必要があるため、同期がずれていると問題が発生する可能性があります。

すべての位置データはQSYS2.SYSTABLESQSYS2.SYSCOLUMNSに存在するため、同じ情報を含むが正確であることが保証されたビューを作成できるはずです。その後、古いプログラムはこのビューを使用できるようになります。

唯一の問題は、QSYS2 テーブルにはすべてのスキーマ/ライブラリーのデータが含まれているため、QSYS2 テーブルから適切な情報を取得するために、ビューが現在のスキーマ (iSeries で言えばデータ ライブラリー) を認識している必要があることです。

これが可能かどうかについてのアイデアはありますか?

編集: Re: ライアン・ギル

事実QSYS2.SYSCOLUMNS上、現在のライブラリ名を基準に使用して行を選択するビューが必要です。複数のライブラリにテーブル T がSYSCOLUMNSある場合、各ライブラリに T のインスタンスのデータがあります。

洗練されていない解決策は、ライブラリ/スキーマ名を各ライブラリに保存でき、ビューがこの値を選択で使用することです...

4

4 に答える 4

4

特殊レジスターを使用してみましたCURRENT_SCHEMAか?

元:Select CURRENT_SCHEMA From QSQPTABL

(注:遊び用のダミーテーブルQSQPTABLと同じです)SysIBM/SysDummy1

Select * From SysViews
Where System_View_Schema = CURRENT_SCHEMA

*SYS 命名ではなく *SQL 命名を使用している場合にのみ機能するコースですが、それは別の話です :)

于 2009-03-20T20:25:04.493 に答える
3

スキーマとテーブル名をテーブルに保存するという考えはうまくいくと思います。ビューは、そのスキーマとテーブルの syscolumns への内部結合を使用してビューを作成することにより、そのスキーマに作成されます。

必要に応じて、SQL の代わりに DDS を使用して、各ライブラリの syscolumns に対する論理ファイル (ビュー) を作成することを検討してください。扱っているライブラリの数はわかりませんが、数が少ない場合は実行できる可能性があります。

選択で DDS を使用するには:

SYSCOLUMNS は既にビューであるため、Select/Omit 用の DDS LF を作成するには、基になる QADBIFLD 物理ファイルに対して作成する必要があります (QADBXSFLD も関係しますが、このアプリケーションにはそのファイルのフィールドは必要ないと思います)。

 A          R QDBIFLD                   PFILE(QADBIFLD)                      
 A          S DBILB2                    COMP(EQ 'SCHEMANAME')                
 A          S DBILFI                    COMP(EQ 'TABLENAME')   

スキーマでテーブル名が 10 以下の場合は、DBILIB と DBIFIL を使用できます。SYSCOLUMN 名が必要な場合は、フィールドの名前を変更する必要があります。

ライアン、あなたは SQL ビューでもこれを行うことができるので、私は間違っています:

    CREATE VIEW MYSCHEMA/MYSYSCOLUMN AS
     SELECT *
       FROM SYSCOLUMNS
      WHERE SYSCOLUMNS.DBNAME = 'SCHEMANAME'
        AND SYSCOLUMNS.TBNAME = 'TABLENAME'

結合を使用するには:

CREATE TABLE MYSCHEMA/MYTABLESELECT
           ( MYSCHEMA VARCHAR (128),
             MYTABLE VARCHAR (128) );
INSERT INTO MYTABLESELECT VALUES( 'SCHEMANAME', 'TABLENAME' );
CREATE VIEW MYSCHEMA/MYSYSCOLUMN AS
     SELECT SYSCOLUMNS.*
       FROM SYSCOLUMNS, MYTABLESELECT
      WHERE SYSCOLUMNS.DBNAME = MYTABLESELECT.MYSCHEMA
        AND SYSCOLUMNS.TBNAME = MYTABLESELECT.MYTABLE;

DDS とビューのどちらでも順序付けは行われません。

于 2009-03-19T17:13:11.560 に答える
2

ビューを作成し、ライブラリのコンテンツのみを表示するライブラリに貼り付けたいと言っていますか? 特定のライブラリを指定せずに、ライブラリ リストを使用してこのようなものにアクセスしていると思いますか?

ライブラリリストを使用するときに、ビューにsqlを使用して現在のライブラリであることを知ることはできないと思います。ライブラリ リストを使用していない場合は、既知のライブラリを使用してクエリを実行できるはずです。

それとも私は誤解していますか?

アップデート

それがどのスキーマにあるかを動的に認識し、それをSQLステートメントの一部として使用するビューが必要な場合、それは不可能だと思います。現在のライブラリに where schema = 'myLib' を指定するようにビューのクエリをハードコーディングすると、機能する可能性がありますが、すべてのライブラリに配置する別のバージョンを作成する必要があります。そして、それが間違っていたのか、切り替えられたのかなどは明らかではありません.

于 2009-03-19T15:12:02.547 に答える
1

ライブラリをスキーマとして作成する場合 (つまり、 ではなく を使用CREATE SCHEMAする場合CRTLIB、必要な情報はすべてスキーマに含まれています。つまり、 and をクエリできるため、 and をクエリする必要はありませんQSYS2.SYSTABLES。CURRENT_SCHEMA は「myschema」に設定されています。QSYS2.SYSCOLUMNSmyschema.SYSTABLESmyschema.SYSCOLUMNS

于 2014-03-23T09:51:31.643 に答える