2014-03-26 45 views
0

我想編寫一個查詢,它將從兩個表1中讀取同一列。並且例如,如果值發生變化,則返回列名以及其新值和舊值。
查詢以找出列中的增量

主查詢:select issue_date,issue_price,issue_entity from voucher where voucher_id=x;
審計查詢:select issue_date,issue_price,issue_entity from voucher_audit where version=2 and voucher_id=x;

注意兩個憑證和voucher_audit具有除了版本號相同的表結構是在審計表外。

那麼結果應該是

column_name old_value new_value 
issue_price 36  38 
issue_date 01/03/14 02/03/14 
+0

不知道主人獨特的鑰匙,沒有辦法回到審計。在不知道審計表結構以及它如何處理同一主記錄的多重變化的情況下,我想不出如何做到這一點。關於根據列獲取結果,它需要使用動態SQL並使用系統表all_tab_Cols來查找表中的所有列值,然後動態生成SQL,然後執行比較,只顯示差異。太多未知數能夠有效回答。 – xQbert

+0

我已經用pkey更新了查詢,現在我們可以在表 – user3441877

回答

0

你應該有兩個表中相同名稱的所有列。然後,您應該使用動態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; 
+0

中確定這個記錄,那很棒,我將在明天再次嘗試這個問題,我們可以在光標中返回輸出,以便我將在ireport中使用該遊標作爲我們也在簡單的選擇查詢中,我有要求比較10個以上的查詢,這個解決方案也能夠正常工作嗎? – user3441877

+0

或者如果我們可以使用視圖的功能來獲得上面的pl sql的輸出....非常感謝 – user3441877

+0

您可以創建一個管道函數來返回一個類型的集合。然後,您可以在select語句中使用該函數(請參閱http://www.oracle-base.com/articles/misc/pipelined-table-functions.php)。 – fdavid