Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 查询以查找列中的增量_Oracle_Oracle11g - Fatal编程技术网

Oracle 查询以查找列中的增量

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

我想写一个查询,它将从两个表1中读取相同的列。大师2。从审计表中。例如,如果值发生变化,则返回列名及其新旧值

主查询:
从凭证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语句中使用该函数(请参阅)。