3

背景:iSeries 版本的 DB2。在每个环境中,都有一个包含有关其他表的位置列信息的表。由于此表中的数据是静态的,并且每次更改表时都必须重新生成,因此如果不同步就会出现问题。

所有位置数据都存在于QSYS2.SYSTABLES和中QSYS2.SYSCOLUMNS,因此应该可以创建一个包含相同信息但保证正确的视图。旧程序应该能够使用此视图。

唯一的问题是视图需要知道当前模式(iSeries 中的数据库),才能从 QSYS2 表中检索正确的信息,因为它们包含所有模式/库的数据。

关于这是否可行以及如果可行怎么办的任何想法?

编辑:回复:瑞安吉尔

实际上,我希望视图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

'当然只有当你使用 *SQL 命名而不是 *SYS 命名时才有效,但那是另一回事 :)

于 2009-03-20T20:25:04.493 回答
3

I think you're idea of storing the schema & table names in a table will work. Your view gets created in that schema by using an inner join of that schema & table to syscolumns to create the view.

Optionally you might want to consider using DDS instead of SQL to create a logical file (view) over syscolumns for each library. Not sure how many libraries you are dealing with but if they are just a few this might be workable.

To use DDS with Selection:

SYSCOLUMNS is already a view so to create a DDS LF for Select/Omit you have to create it over the underlying QADBIFLD physical file (QADBXSFLD is also involved but I don't think you need any fields from that file for this application):

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

You could use DBILIB & DBIFIL if you're schema and table names are 10 or under. If you need the SYSCOLUMN names you have to do some field renaming.

Ryan, I'm wrong as you could also do this with a SQL view:

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

To use a join:

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;

No ordering is being done on either the DDS or the View.

于 2009-03-19T17:13:11.560 回答
2

您是说要创建一个视图并将其粘贴在仅显示其库内容的库中?我猜您正在使用库列表访问这些东西,而不是指定特定的库?

我认为在使用库列表时,视图不可能使用 sql 来知道它是当前库。如果您没有使用库列表,那么您应该能够使用您知道的库来运行查询。

还是我误会了?

更新

如果您想要一个动态知道它所在的模式并将其用作 sql 语句的一部分的视图,我认为这是不可能的。如果您对视图的查询进行硬编码,以将其中 schema = 'myLib' 说明为当前库,那么它可以工作,但您必须制作不同的版本才能放入每个库中。如果它是错误的或者它是否被切换等等,也不会很明显。

于 2009-03-19T15:12:02.547 回答
1

如果您将库创建为模式(即,使用CREATE SCHEMA而不是CRTLIB,那么所有需要的信息都已经在模式中。也就是说,您不需要查询QSYS2.SYSTABLES并且QSYS2.SYSCOLUMNS因为您可以查询myschema.SYSTABLESand myschema.SYSCOLUMNS,或者只是不合格的 SYSTABLES 和 SYSCOLUMNS 如果您的 CURRENT_SCHEMA 设置为“myschema”。

于 2014-03-23T09:51:31.643 回答