是否可以创建一个知道当前模式/库名称的视图?

时间:2009-03-19 15:08:29

标签: sql database db2 ibm-midrange

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

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

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

关于这是否可能的任何想法,如果是这样的话?

编辑:回复:Ryan Guill

实际上,我希望视图使用其条件中的当前库名称在QSYS2.SYSCOLUMNS中选择行。如果我在多个库中有表T,那么SYSCOLUMNS将为每个库中的T实例提供数据。

一个不优雅的解决方案是我可以在每个库中存储库/模式名称,并且视图将在选择中使用此值...

4 个答案:

答案 0 :(得分:4)

您是否尝试过使用特殊注册表CURRENT_SCHEMA

ex:Select CURRENT_SCHEMA From QSQPTABL

(注意:QSQPTABL与用于游戏的SysIBM/SysDummy1虚拟表相同)

Select * From SysViews
Where System_View_Schema = CURRENT_SCHEMA

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

答案 1 :(得分:3)

我认为你想要存储架构&amp;表中的表名将起作用。通过使用该模式的内部联接,可以在该模式中创建视图。 table to syscolumns创建视图。

您可以考虑使用DDS而不是SQL来为每个库在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')   

您可以使用DBILIB&amp; DBIFIL,如果您的架构和表名称是10或以下。如果您需要SYSCOLUMN名称,则必须进行一些字段重命名。

Ryan,我错了,你也可以用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或View上都没有排序。

答案 2 :(得分:2)

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

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

还是我误解了?

<强>更新

如果你想拥有一个动态知道它所在的模式并将其作为sql语句的一部分使用的视图,我认为这是不可能的。如果您对视图的查询进行硬编码以将schema ='myLib'指向当前库,那么它可以工作,但您必须在每个库中创建不同的版本。如果它出错或是否被切换等,那就不明显了。

答案 3 :(得分:1)

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