首页 > 解决方案 > 在对表的列执行更新活动后,如何检查数据库中的所有表是否都被修改?

问题描述

我必须用值 DD 更新所有列名如 '%DIV%' 的表,无论它是 MG,我已经为它编写了脚本,但我不知道如何验证所有表的列在执行活动后更新为值 DD。我写了这个查询。

SELECT 'SELECT '||OWNER||'.'||TABLE_NAME||', '||COLUMN_NAME||' FROM '||OWNER||'.'||TABLE_NAME||' WHERE '||COLUMN_NAME||' = ''MG'' ;'
FROM RADHA.CHANGE_TABLE
WHERE VALID_FLAG='Y'

我打算制作一个像这样的表结构

OWNER  TABLE_NAME  PREV_COUNT  

PREV_COUNT 将保存列值为 MG 的行数,并且在执行活动后,我将使用以下查询验证相应的行是否已更新为 DD。

SELECT 'SELECT '||OWNER||'.'||TABLE_NAME||', '||COLUMN_NAME||' FROM '||OWNER||'.'||TABLE_NAME||' WHERE '||COLUMN_NAME||' = ''DD'' ;' FROM RADHA.CHANGE_TABLE WHERE VALID_FLAG='Y'

这个查询的输出将进入表

 OWNER  TABLE_NAME  NEW_COUNT

但是我无法从 Select 查询中获取记录,因为它是写入 select 查询中的字符串,但我想要结果集以便我可以在上面提到的表中插入记录,请指导如何进一步接近

标签: sqloracleplsql

解决方案


我没有你的表,但是 - 基于 Scott 的示例模式,这是一个脚本,它在其所有表中搜索名为JOB(第 8 行)的列,并检查其中有多少具有看起来像(提示:)likeCLERK值它(第 12 行)。

看看它是如何工作的,调整它,让它适合你。

SQL> DECLARE
  2    l_str VARCHAR2(500);
  3    l_cnt NUMBER := 0;
  4  BEGIN
  5    FOR cur_r IN (SELECT u.table_name, u.column_name
  6                  FROM user_tab_columns u, user_tables t
  7                  WHERE u.table_name = t.table_name
  8                    AND u.column_name = 'JOB'
  9                                                              )
 10    LOOP
 11      l_str := 'SELECT COUNT(*) FROM ' || cur_r.table_name ||
 12               ' WHERE ' || cur_r.column_name || ' like (''%CLERK%'')';
 13
 14      EXECUTE IMMEDIATE (l_str) INTO l_cnt;
 15
 16      IF l_cnt > 0 THEN
 17         dbms_output.put_line(l_cnt ||' : ' || cur_r.table_name);
 18      END IF;
 19    END LOOP;
 20  END;
 21  /
4 : EMP        --> there are 4 CLERKs in the EMP table

PL/SQL procedure successfully completed.

SQL>

推荐阅读