您的查詢的工作,但它可能是更地道使用連接:
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