我尝试使用DB2 EXPORT实用程序从100多个表的同一个特定表分区中选择所有数据,分区名在所有分区表中是不变的,这使得这种方法比使用其他方法更有优势。我无法分离分区,因为它们处于生产环境中。为了编写半自动化脚本,我需要能够运行查询:
SELECT * FROM MYTABLE WHERE PARTITION_NAME = MYPARTITION;
SELECT * FROM MYTABLE
WHERE PARTITION_NAME = MYPARTITION;
在传递给EXPORT实用程序的SELECT语句中,我找不到使用这种类型逻辑的正确语法。
nbewdwxp1#
您可以通过首先查找分区 number 来执行类似的操作:
SELECT SEQNO FROM SYSCAT.DATAPARTITIONSWHERE TABNAME = 'YOURTABLE' AND DATAPARTITIONNAME = 'WHATEVER'
SELECT SEQNO
FROM SYSCAT.DATAPARTITIONS
WHERE TABNAME = 'YOURTABLE' AND DATAPARTITIONNAME = 'WHATEVER'
然后在查询中使用SEQNO值:
SEQNO
SELECT * FROM MYTABLE WHERE DATAPARTITIONNUM(anycolumn) = <SEQNO value>
WHERE DATAPARTITIONNUM(anycolumn) = <SEQNO value>
编辑:
由于在DATAPARTITIONNUM()中引用哪个列并不重要,而且每个表都保证至少有一列,因此可以通过联接SYSCAT.DATAPARTITIONS和SYSCAT.COLUMNS来自动生成查询:
DATAPARTITIONNUM()
SYSCAT.DATAPARTITIONS
SYSCAT.COLUMNS
select 'select * from', p.tabname, 'where datapartitionnum(', colname, ') = ', seqno from syscat.datapartitions p inner join syscat.columns c on p.tabschema = c.tabschema and p.tabname = c.tabnamewhere colno = 1 and datapartitionname = '<your partition name>' and p.tabname in (<your table list>)
select
'select * from', p.tabname,
'where datapartitionnum(', colname, ') = ', seqno
from syscat.datapartitions p
inner join syscat.columns c
on p.tabschema = c.tabschema and p.tabname = c.tabname
where colno = 1
and datapartitionname = '<your partition name>'
and p.tabname in (<your table list>)
但是,在我看来,将对数据库元数据的依赖性构建到应用程序中并不十分可靠。您可以简单地指定适当的分区键范围来提取数据,这将同样有效。
1条答案
按热度按时间nbewdwxp1#
您可以通过首先查找分区 number 来执行类似的操作:
然后在查询中使用
SEQNO
值:编辑:
由于在
DATAPARTITIONNUM()
中引用哪个列并不重要,而且每个表都保证至少有一列,因此可以通过联接SYSCAT.DATAPARTITIONS
和SYSCAT.COLUMNS
来自动生成查询:但是,在我看来,将对数据库元数据的依赖性构建到应用程序中并不十分可靠。您可以简单地指定适当的分区键范围来提取数据,这将同样有效。