Oracle SQL:使用变量表名和固定列名进行更新

时间:2015-04-23 14:52:24

标签: sql sql-server oracle

我是SQL的初学者并遇到问题: 我有一个包含大量表格的数据库。某些表格中有一个名为“lab”的列。 在这个列中我需要更改值。

所以我设法通过

获取表格的名称
SELECT CNAME,TNAME FROM SYSTEM.COL WHERE CNAME = 'LAB';

我知道我的更新命令

update TNAME set LAB='VALUE' WHERE LAB='OLDVALUE' 

但我无法通过变量TNAME或其他东西来管理这两个语句。我尝试使用execute immediate,但这对我没有好处。

2 个答案:

答案 0 :(得分:0)

如果它的Oracle,这样的事情应该这样做:

BEGIN
    FOR cur_tabs_cols IN ( SELECT CNAME,TNAME FROM SYSTEM.COL WHERE CNAME = 'LAB'; )
    LOOP
        EXECUTE IMMEDIATE 'UPDATE ' || cur_tabs_cols.TNAME || ' SET LAB = ''VALUE'' WHERE LAB = ''OLDVALUE''';
    END LOOP;

    COMMIT;
END;

答案 1 :(得分:0)

你需要为此编写pl / sql。

首先,请不要使用SYSTEM.COL。而是使用数据字典视图USER_TAB_COLSUSER_TAB_COLUMNS。 (或ALL_TAB_COLS如果在其他模式中)

EXECUTE IMMEDIATE就是你想要的。

BEGIN
   FOR i IN (SELECT table_name
               FROM user_tab_cols
              WHERE column_name = 'LAB')
   LOOP
      EXECUTE IMMEDIATE
         'UPDATE ' || i.table_name || ' set LAB = :value where LAB = :oldvalue'
         USING 'value', 'oldvalue';
   END LOOP;
END;

您可以(并且应该)对value和oldvalue使用绑定​​变量,而不是表名。