比较oracle sql中不使用硬编码的前后表
在运行批处理作业之前和之后,我对表进行了预映像/后映像 前置表 邮政表格 如何比较和提取修改后的字段,并按如下方式显示它们: 期望输出 到目前为止,我可以使用比较oracle sql中不使用硬编码的前后表,sql,oracle,plsql,Sql,Oracle,Plsql,在运行批处理作业之前和之后,我对表进行了预映像/后映像 前置表 邮政表格 如何比较和提取修改后的字段,并按如下方式显示它们: 期望输出 到目前为止,我可以使用 select * from POST_TABLE minus select * from PRE_TABLE 这让我 id|Name |Phone |Score 1 |John |12345678 |10 2 |Peter |23456789 |22 3 |Sarah |34567890 |33 我正在考虑使用所有的tab列
select * from POST_TABLE
minus select * from PRE_TABLE
这让我
id|Name |Phone |Score
1 |John |12345678 |10
2 |Peter |23456789 |22
3 |Sarah |34567890 |33
我正在考虑使用所有的tab列来迭代表中的字段
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME ='PRE_TABLE';
我已经编写了一个部分pl sql过程,但是当我想要比较列名时,就被卡住了
procedure diff
as
cursor POST_CUR is
(select * from Post_table minus select * from Pre_table);
cursor pre_CUR is
(select * from Pre_table);
cursor COLUMNS_CUR is
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME ='Post_table';
begin
for R in post_CUR LOOP
for p in pre_CUR LOOP
if (R.id=P.id) then
for F in COLUMNS_CUR LOOP
DBMS_OUTPUT.PUT_LINE('id:'||R.ID||'_'||F.COLUMN_NAME);
--compare f.column_name.. STUCK Here!!
--if (R.[f.column_name] <>P.[f.column_name] )
--DBMS_OUTPUT.PUT_LINE('id:'||R.ID||'_'||F.COLUMN_NAME||'_'||R.[f.column_name]||'_'||P.[f.column_name]);
--end if;
end LOOP;
end if;
end LOOP;
end LOOP;
end DIFF;
如何在不硬编码表列名的情况下动态获取表结果?我愿意使用pl sql或任何其他有效的工具。
TIA。我认为您可以使用以下SQL获得所需的结果:
--phone
SELECT A.ID, 'Phone' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.PHONE,'-') <> COALESCE(B.PHONE,'-')
--name
UNION ALL
SELECT A.ID, 'Name' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.Name,'-') <> COALESCE(B.Name,'-')
--score
UNION ALL
SELECT A.ID, 'Score' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.Score,'0') <> COALESCE(B.Score,'0')
我认为您可以使用以下SQL获得所需的结果:
--phone
SELECT A.ID, 'Phone' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.PHONE,'-') <> COALESCE(B.PHONE,'-')
--name
UNION ALL
SELECT A.ID, 'Name' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.Name,'-') <> COALESCE(B.Name,'-')
--score
UNION ALL
SELECT A.ID, 'Score' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.Score,'0') <> COALESCE(B.Score,'0')
是否可以在不硬编码列名的情况下执行此操作?也许可以使用Select COLUMN_NAME从TABLE_NAME='Post_TABLE'所在的所有_选项卡_列中选择列_NAME;要获取列名?是否可以在不硬编码列名的情况下获取列名?也许可以使用Select COLUMN_NAME从TABLE_NAME='Post_TABLE'所在的所有_选项卡_列中选择列_NAME;要获取列名?是否可以在不硬编码列名的情况下获取列名?也许可以使用Select COLUMN_NAME从TABLE_NAME='Post_TABLE'所在的所有_选项卡_列中选择列_NAME;要获取列名?请看我在中编写的脚本。请看我在中编写的脚本。请看我在中编写的脚本。
procedure diff
as
cursor POST_CUR is
(select * from Post_table minus select * from Pre_table);
cursor pre_CUR is
(select * from Pre_table);
cursor COLUMNS_CUR is
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME ='Post_table';
begin
for R in post_CUR LOOP
for p in pre_CUR LOOP
if (R.id=P.id) then
for F in COLUMNS_CUR LOOP
DBMS_OUTPUT.PUT_LINE('id:'||R.ID||'_'||F.COLUMN_NAME);
--compare f.column_name.. STUCK Here!!
--if (R.[f.column_name] <>P.[f.column_name] )
--DBMS_OUTPUT.PUT_LINE('id:'||R.ID||'_'||F.COLUMN_NAME||'_'||R.[f.column_name]||'_'||P.[f.column_name]);
--end if;
end LOOP;
end if;
end LOOP;
end LOOP;
end DIFF;
--phone
SELECT A.ID, 'Phone' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.PHONE,'-') <> COALESCE(B.PHONE,'-')
--name
UNION ALL
SELECT A.ID, 'Name' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.Name,'-') <> COALESCE(B.Name,'-')
--score
UNION ALL
SELECT A.ID, 'Score' As ModifiedColumn,
B.Phone As ModifiedVal,
A.Phone As PrevVal
FROM PRE_TABLE A
INNER JOIN POST_TABLE B ON A.ID = B.ID AND COALESCE(A.Score,'0') <> COALESCE(B.Score,'0')