通过查询的PLSQL循环查找所有记录

时间:2019-12-06 14:06:02

标签: oracle plsql

我遇到存储过程问题,问题是我试图查找临时表中的事务号是否已经在最终表中,如果不是,它将插入记录,如果它在最终表,它将进入log_error表,这是我的SP

BEGIN
DECLARE
    date                temporary_table.transfer_date%TYPE;
    auth                temporary_table.auth_code%TYPE;
    transac_num         temporary_table.transaction_number%TYPE;
    card                temporary_table.card_number%TYPE;
    amount              temporary_table.amount%TYPE; 
    num_trx_search      NUMBER;
    counter             NUMBER;
    sid1                NUMBER;
    sid2                NUMBER;
    loopcounter         NUMBER;


BEGIN
cod_error := 0;
warning := 'execution';

    OPEN vocursor FOR
      SELECT transfer_date,
      auth_code,
      transaction_number,
      card_number,
      amount
      FROM temporary_table order by id;

    prfcursor := vocursor;

    OPEN ntxcursor FOR
    SELECT transaction_number FROM final_table  order by id;

    trxcursor := ntxcursor;


    LOOP

        FETCH prfcursor INTO date, auth, transac_num, card, amount;
        EXIT WHEN prfcursor%NOTFOUND;


        FETCH trxcursor INTO num_trx_search;

        dbms_output.Put_line('NumTrx: ' || num_trx);
        begin
          -- i need to check if the transaction number from the temporary table is already in the 
          --final table
          FOR loopcounter IN (Select id from final_table where transaction_number = transac_num)
          LOOP
          DBMS_OUTPUT.PUT_LINE(loopcounter.sid);

          END LOOP;

          dbms_output.Put_line('num_trx_search: ' || num_trx_search);
          dbms_output.Put_line('counter: ' || counter);

        exception
        WHEN NO_DATA_FOUND THEN
        dbms_output.Put_line('No Data found');
       end;  

        EXIT WHEN trxcursor%NOTFOUND;


          --just for testing and debuging
          counter := 1;
          IF(counter > 0) THEN

            --inserts into log error table
          ELSE

                --inserts into final table
            END IF;



    END LOOP;

    dbms_output.Put_line( 'end loop' );

    CLOSE trxcursor;
    CLOSE prfcursor;
    dbms_output.Put_line( 'end cursor' );
END;

问题是,它正在获取所有结果,对于临时记录中的每条记录,如果事务号匹配,则应该只得到一个。 NumTrx是临时表中的事务编号。

我是plsql的新手,谢谢

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以通过尝试将临时表中的记录插入到最终表中并使用LOG ERRORS INTO子句将那些已经在最终表中的记录推入另一个表中来实现相同的目的。

INSERT INTO final_table final
SELECT transfer_date,
     auth_code,
     transaction_number,
     card_number,
     amount
FROM temporary_table
LOG ERRORS INTO ERR$_final_table 

上面的查询假设final_table和临时表具有相同的结构。如果它们不同,则需要稍微调整查询。通常,您应该尝试在单个SQL中完成尽可能多的操作,而不是编写大量过程代码来实现相同的目的。通常更快,在这种情况下,看起来要简单得多。

对于ERR $表的设置,建议您查看DML ERROR LOGGING下的Oracle文档。

如果您确实希望进行逐行(慢速)更新,那么我建议使用隐式游标进行循环,而不仅仅是为了提高可读性。另外,我认为除了降低代码速度之外,每个游标上的ORDER BY都不会做任何事情。