Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较oracle sql中不使用硬编码的前后表_Sql_Oracle_Plsql - Fatal编程技术网

比较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')