您的查询将起作用,但使用连接可能更惯用:
SELECT *
FROM "informix".systables AS t
JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
WHERE t.tabname = 'table_a';
另外,请注意,table_A
如果您在环境中设置了 DELIMIDENT 并且创建了名称用双引号括起来的表时创建了表,则系统目录将仅包含大小写混合。正常情况下,系统目录中的表名全部小写;对于列名也是如此。
但是,这与您的问题无关。处理所有荣耀的用户定义类型是痛苦的。但是,如果您处理的是普通数据库,当然可以这样工作,尽管使用 DB-Schema ( dbschema
) 生成表的模式,然后捕获它可能更容易。您实际上可以通过使用 SYSTEM 语句的存储过程来做到这一点,但我可能会在存储过程之外进行。这确实取决于您还需要做什么。每个字段的前映像和后映像的成本可能适中。
如果您有 IBM Informix Dynamic Server 11.70,您可以动态创建 CREATE {audit} TABLE 语句,然后执行该语句。因此,您将在存储过程中使用 FOREACH 循环来构建查询以依次添加每一列,然后执行该语句以创建审计表。您也必须解码类型。您也可以/应该为此使用程序。我假设这tabname
是一个传递给存储过程的变量,并且c_colno
, c_colname
, 和c_typename
是局部变量(原样cts
,'create table statement' 的缩写,和pad
):
LET cts = 'CREATE TABLE ' || tabname || '(';
LET pad = '';
FOREACH SELECT c.colno, c.colname, type_name(c.coltype, c.collength)
INTO c_colno, c_colname, c_typename
FROM "informix".systables AS t
JOIN "informix".syscolumns AS c
ON t.tabid = c.tabid
WHERE t.tabname = tabname
ORDER BY c.colno
LET cts = cts || pad || 'pre_' || c_colname || ' ' || c_coltype;
LET cts = cts || ',' || 'post_' || c_colname || ' ' || c_coltype;
LET pad = ',';
END FOREACH;
LET cts = cts || ');';
您可能想要处理 NOT NULL 和主键约束以及各种其他事情,但这为您提供了基础知识。