背景:iSeries版本的DB2。在每个环境中,都有一个包含有关其他表的位置列信息的表。由于此表中的数据是静态的,并且每次更改表时都必须重新生成数据,因此如果它不合时则会出现问题。
所有位置数据都存在于QSYS2.SYSTABLES
和QSYS2.SYSCOLUMNS
中,因此应该可以创建包含相同信息但保证正确的视图。然后,旧程序应该能够使用此视图。
唯一的问题是视图需要知道当前架构(iSeries中的数据库说话),才能从QSYS2表中检索正确的信息,因为它们包含 所有<的数据/ em> 架构/库。
关于这是否可能的任何想法,如果是这样的话?
编辑:回复:Ryan Guill
实际上,我希望视图使用其条件中的当前库名称在QSYS2.SYSCOLUMNS
中选择行。如果我在多个库中有表T,那么SYSCOLUMNS
将为每个库中的T实例提供数据。
一个不优雅的解决方案是我可以在每个库中存储库/模式名称,并且视图将在选择中使用此值...
答案 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.SYSCOLUMNS
和myschema.SYSTABLES
,或者只是将CURRENT_SCHEMA设置为'myschema'时不合格的SYSTABLES和SYSCOLUMNS。