sql - 在对表的列执行更新活动后,如何检查数据库中的所有表是否都被修改?
问题描述
我必须用值 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 查询中的字符串,但我想要结果集以便我可以在上面提到的表中插入记录,请指导如何进一步接近
解决方案
我没有你的表,但是 - 基于 Scott 的示例模式,这是一个脚本,它在其所有表中搜索名为JOB
(第 8 行)的列,并检查其中有多少具有看起来像(提示:)like
的CLERK
值它(第 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>