首页 > 解决方案 > PLSQL Loop through query 查找所有记录

问题描述

我遇到了存储过程的问题,问题是我正在尝试查找临时表中的事务号是否已经在最终表中,如果没有,它将插入记录,如果它在最终表中,它将进入 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的菜鸟,谢谢

在此处输入图像描述

标签: oracleplsql

解决方案


您可以通过尝试将临时表中的记录插入最终表并使用 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 和temporary_table 具有相同的结构。如果它们不同,您将需要稍微调整查询。通常,您应该尝试在单个 SQL 中尽可能多地完成您想要做的事情,而不是编写大量程序代码来实现同样的事情。它通常更快,在这种情况下似乎更简单。

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

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


推荐阅读