使用syscolumns列更新列值的存储过程

时间:2016-02-10 00:55:30

标签: sql stored-procedures informix

我想用syscolumns中的'collength'值更新我创建的表('campo_sys')的列('n_tamanho')。

为此,我使用了这个程序:

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的值时,值不相同。可能有什么不对?

2 个答案:

答案 0 :(得分:1)

发出声明时:

update campo_sys 
    set campo_sys.n_tamanho = testecol;

您正在campo_sys更新所有行。据推测,syscolumns的不同行具有不同的长度。但是,只记录最后一个 - 作为所有行的值。

答案 1 :(得分: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
);

如果您为 tabid colno 保留了自己的ID,则可以执行以下操作:

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
);

同样,你不是在讲述全貌,只需使用视图即可轻松完成。

请记住,我们在这里提供帮助,我们花时间这样做,不要像在另一个上那样编辑你的帖子。

将来,其他人可能正在寻找你所问的内容而且找不到答案,请记住,给出的答案可能不适合你,但可以帮助别人。我会恢复你的编辑。

如果这个或另一个答案不适合您要找的表格的模式和完整的要求。