您的查询的工作,但它可能是更地道使用连接:
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_colname
传递到存储过程的变量,并且c_colno
,和c_typename
是局部变量(如cts
,简称“create table语句”,并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和主键约束以及其他各种各样的事情,但是这会给你提供一些基础知识。
我可以知道如何在存储过程中执行cts语句吗? – huahsin68 2012-04-12 06:22:41
'EXECUTE IMMEDIATE cts;' – 2012-04-12 06:24:15
如果你用'Informix 11.50'执行这个''cts'变量会重写每一列(在每个'foreach'中),这是正常行为吗? – 2014-08-21 15:33:45