我遇到存储过程问题,问题是我试图查找临时表中的事务号是否已经在最终表中,如果不是,它将插入记录,如果它在最终表,它将进入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的新手,谢谢
答案 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都不会做任何事情。