Oracle 查询以查找列中的增量
我想写一个查询,它将从两个表1中读取相同的列。大师2。从审计表中。例如,如果值发生变化,则返回列名及其新旧值Oracle 查询以查找列中的增量,oracle,oracle11g,Oracle,Oracle11g,我想写一个查询,它将从两个表1中读取相同的列。大师2。从审计表中。例如,如果值发生变化,则返回列名及其新旧值 主查询:从凭证id=x的凭证中选择出库日期、出库价格、出库主体 审核查询:选择凭证审核中的出库日期、出库价格、出库主体,其中版本=2,凭证id=x 注意:凭证和凭证审计都具有相同的表结构,只是审计表中的版本号是额外的 那么结果应该是 column_name old_value new_value issue_price 36 38 issue_date 01/03
主查询:
从凭证id=x的凭证中选择出库日期、出库价格、出库主体代码>
审核查询:选择凭证审核中的出库日期、出库价格、出库主体,其中版本=2,凭证id=x代码>
注意:凭证和凭证审计都具有相同的表结构,只是审计表中的版本号是额外的
那么结果应该是
column_name old_value new_value
issue_price 36 38
issue_date 01/03/14 02/03/14
您应该得到两个表中名称相同的所有列。然后,您应该使用动态SQL获取每个列的值
DECLARE
input_voucher_id VARCHAR2(100) := '&voucher_id';
input_version VARCHAR2(100):='&version';
CURSOR c_common_column IS
SELECT u.COLUMN_NAME
FROM user_tab_cols u
WHERE u.TABLE_NAME = 'VOUCHER'
AND EXISTS
(SELECT 1
FROM user_tab_cols u1
WHERE u1.TABLE_NAME = 'VOUCHER_AUDIT'
AND u1.COLUMN_NAME = u.COLUMN_NAME);
v_first_sql VARCHAR2(1000):='' ;
v_second_sql VARCHAR2(1000) :='';
first_table_value VARCHAR2(100) := '';
second_table_value VARCHAR2(100) := '';
BEGIN
dbms_output.put_line('Column Name,old_value,new_value');
FOR x IN c_common_column LOOP
v_first_sql:='SELECT '||x.COLUMN_NAME|| ' from voucher where voucher_id=:voucher_id';
v_second_sql :='SELECT '||x.COLUMN_NAME|| ' from voucher_audit where voucher_id=:voucher_id and version = :version';
EXECUTE IMMEDIATE v_first_sql
INTO first_table_value
USING input_voucher_id;
EXECUTE IMMEDIATE v_second_sql
INTO second_table_value
USING input_voucher_id, input_version;
if first_table_value != second_table_value then
dbms_output.put_line(x.COLUMN_NAME ||','|| first_table_value || ',' ||
second_table_value);
end if;
END LOOP;
END;
如果不知道master的唯一密钥,就无法重新加入审核。如果不知道审计表的结构以及它如何处理对同一主记录的多个更改,我想不出该怎么做。关于基于列获取结果,需要使用动态SQL并使用系统表all_tab_Cols查找表中的所有列值,然后动态生成SQL,然后执行仅显示差异的比较。太多的未知数无法有效回答。我已经用pkey更新了查询,现在我们可以识别两个表中的记录了。太好了,明天我将尝试这个,再次问一个问题,我们是否可以用游标返回输出,以便我在ireport中使用该游标,就像我们在简单选择查询中一样,我需要比较10个以上的查询,这个解决方案也可以吗?或者如果我们可以使用视图的功能来获得上述pl sql的输出。。。。非常感谢您可以创建一个管道函数来返回一个类型的集合。然后可以在select语句中使用该函数(请参阅)。