2016-02-10 48 views
2

我想用syscolumns中的'collength'值創建表('campo_sys')來更新表('n_tamanho')的列。用syscolumns列更新列值的存儲過程

對於我用這個過程:

CREATE PROCEDURE test() 

DEFINE testecol smallint; 

FOREACH cur1 WITH HOLD FOR 

SELECT collength 
INTO testecol 
FROM syscolumns 

update campo_sys 
set campo_sys.n_tamanho = testecol; 

END FOREACH 

END PROCEDURE; 

當比較collength和n_tamanho的值,這些值是不相同的。什麼可能是錯的?

+0

給出一個列定義的具體例子和兩個不同的值可能會有所幫助。 – christutty

+0

執行該過程後,我獲得了不同的值長度和n_tamanho。例如,n_tamanho = 20和collength = 2048,對於相同的記錄 –

+0

,聽起來您已經獲得了varchar字段的潛在最大長度和當前最長值之間的差異,儘管我對Informix不夠熟悉待確認 – christutty

回答

1

當您發出聲明:

update campo_sys 
    set campo_sys.n_tamanho = testecol; 

您在campo_sys更新所有行。據推測,syscolumns的不同行具有不同的長度。但是,只有最後一個將被記錄 - 作爲所有行的值。

0

正如@ gordon-linoff所說,對於syscolumns上的每條記錄,您都會更新campo_sys上的所有記錄。

您需要告訴我們是否有辦法在表中唯一標識每條記錄。

如果您存儲原始tabid有我在以前後建議和colno你可以簡單地這樣做:

UPDATE campo_sys col1 
SET col1.n_tamanho = (
    SELECT col2.collength 
    FROM syscolumns col2 
    WHERE col2.tabid = col1.ns_tabela 
      AND col2.colno = col1.ns_campo 
); 

如果你保持你自己的ID爲tabidcolno,你可以這樣做:

UPDATE campo_sys col1 
SET col1.n_tamanho = (
    SELECT col2.collength 
    FROM syscolumns col2, tabela_sys tab1, systables tab2 
    WHERE col1.ns_tabela = tab1.ns_tabela 
      tab1.nome = tab2.tabname 
      AND col2.tabid = tab2.tabid 
      AND col2.colname = col1.nome 
); 

同樣你ñ不告訴整個圖片,只需使用視圖即可輕鬆完成。

請記住,我們在這裏提供幫助,我們花時間這樣做,不要編輯您的帖子,就像您在另一個帖子上完成的一樣。

未來其他人可能正在尋找你已經提出的問題並且找不到答案,請記住,給出的答案可能並不適合你,但可以幫助其他人。我會恢復你的編輯。

如果這個或其他答案不符合您要查找的內容,請發佈表格模式和完整要求。