给定模式的所有表名的DB2查询

53

我只是想要一个简单的查询语句来选择给定schema下的所有表名。

例如,我们的数据库有100多个表,我需要找到包含子字符串"CUR"的任何表。一旦我得到所有表的名称,我可以使用like命令。

14个回答

86
--for DB2/z
    select * from sysibm.systables
    where owner = 'SCHEMA'
    and name like '%CUR%'
    and type = 'T';

--for DB2/LUW
    select * from sysibm.systables
    where CREATOR = 'SCHEMA'
    and name like '%CUR%'
    and type = 'T';

这将为您提供在SCHEMA模式中所有包含CUR的表。此处有关于SYSIBM.SYSTABLES表的更多详细信息。如果您查看左侧的导航窗格,可以获得各种精彩的DB2元数据。
请注意,此链接适用于主机DB2/z。 DB2/LUW(Linux / UNIX / Windows)具有略微不同的列,如上面的第二个查询所示。
如果您未使用其中任何一种,请查阅适用于您特定变体的IBM文档。

3
在此上下文中使用"OWNER"无效。 SQL0206N,SQLSTATE = 42703。 - Marius Butuc
8
@Marius,你的DB2变体可能有不同的模式 - 这是特定于DB2/z的,我们喜欢称之为“真正的”DB2 :-) 例如,在DB2/LUW中,您将使用CREATOR。这不会改变根本答案,即使用systables - paxdiablo
1
我的错:我确实在使用 DB2/LUW - Marius Butuc
1
只有IBM才会将产品移植到不同的操作系统,并使其与原始版本不兼容... - Frans
DB2的4个平台(LUW、z/OS、i和VSE/VM)并非彼此的移植版本,它们有独立的代码库,并且大多数情况下是独立开发的。Db2 for i甚至不是一个单独的产品,而是iSeries操作系统的一个组成部分。请注意,Liunx(包括zLinux)、Unix和Windows版本是相同的代码库,也是同一产品。 - Paul Vernon
对于那些使用IBM i的用户,你们的查询将是以下内容:SELECT * FROM qsys2.systables - Anthony Rolfe

31
DB2 LIST TABLES FOR SCHEMA <schema_name>

1
此选项的好处是不区分大小写。 - Brannon

27
在我的iSeries上,我需要从iNavigator运行此命令:
select *
from QSYS2.SYSTABLES
where TABLE_SCHEMA
like 'SCHEMA_NAME'
and TYPE = 'T';

需要使用 QSYS2.SYSTABLES 在 IBM iSeries 上列出 JD Edwards 9.2 表。 - jla

18

你应该尝试这个:

select TABNAME from syscat.tables where tabschema = 'yourschemaname'";

8

4
如果你不知道你要查找的架构,或者想将所有表格的列表导出到一个文件中,这个方法非常有用。db2 "list tables for all" > tables.txt - bonh
那就是我想要的!谢谢! - Rabia Naz khan

7
对于Linux、Unix和Windows上的Db2(即Db2 LUW)或Db2 Warehouse,请使用SYSCAT.TABLES目录视图。例如:
SELECT TABSCHEMA, TABNAME FROM SYSCAT.TABLES WHERE TABSCHEMA LIKE '%CUR%' AND TYPE = 'T'

这是一个 SQL 语句,将返回包含子字符串“CUR”的所有模式中的所有标准表。从 Db2 命令行,您也可以使用 CLP 命令,例如 db2 list tables for all | grep CUR 达到类似的效果。
页面 描述了 SYSCAT.TABLES 中的列,包括 TYPE 列的不同值。
A = Alias
G = Created temporary table
H = Hierarchy table
L = Detached table
N = Nickname
S = Materialized query table
T = Table (untyped)
U = Typed table
V = View (untyped)
W = Typed view

其他常用的目录视图包括:
SYSCAT.COLUMNS      Lists the columns in each table, view and nickname
SYSCAT.VIEWS        Full SQL text for view and materialized query tables
SYSCAT.KEYCOLUSE    Column that are in PK, FK or Unique constraints

在Db2 LUW中,使用SYSIBM目录表被认为是一种不良的做法(SYSCAT目录视图从中选择数据)。它们的列名不够一致,不太容易使用,没有文档说明,并且在版本之间更可能发生变化。
此页面列出了所有目录视图目录视图路线图
另外,对于针对Db2目录(和系统函数)的一般查询,您可以查看IBM示例库中的db-library部分,其中包括用于生成(近似)DDL以及许多其他操作的视图。
对于 Db2 for z/OS,使用描述在 这里SYSIBM.TABLES。例如:
SELECT CREATOR, NAME FROM SYSIBM.SYSTABLES WHERE OWNER LIKE '%CUR%' AND TYPE = 'T'

对于Db2 for i(即iSeries,又称AS/400),请使用QSYS2.SYSTABLES,该表在此处有描述。
SELECT TABLE_OWNER, TABLE_NAME FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA LIKE '%CUR%' AND TABLE_TYPE = 'T'

对于 DB2 Server for VSE and VM,请使用在这里描述的 SYSTEM.SYSCATALOG DB2 Server for VSE and VM SQL 参考
SELECT CREATOR, TNAME FROM SYSTEM.SYSCATALOG WHERE TABLETYPE = 'R'

1
在目录查询中使用未提交读取(例如通过在查询末尾添加“WITH UR”)通常是一个好主意,以避免等待具有未提交目录更改的其他应用程序。 - Paul Vernon
这个答案对我追踪自定义数据库项的任务非常有帮助。感谢您详细解释! - gritts

4
db2 connect to MY_INSTACE_DB with myuser -- connect to db2    
db2 "select TABNAME from syscat.tables where tabschema = 'mySchema' with ur"
db2 terminate -- end connection

2
select name from sysibm.systables 
where name like '%ISP%' 
and type = 'T'

0

这是我的工作方案:

select tabname as table_name
from syscat.tables
where tabschema = 'schema_name' -- put schema name here
      and type = 'T'
order by tabname

0

你也可以通过在DB2中键入LIST TABLES来简单地获取表名


2
这不是真的。对我来说,“LIST TABLES”结果为0个表。而“LIST TABLES SCHEMAX”则显示该模式下的796个表。因此,“LIST TABLES”并不一定显示所有表。 - schneiti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接