oracle - 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的菜鸟,谢谢
解决方案
您可以通过尝试将临时表中的记录插入最终表并使用 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 不会做任何事情,除了减慢代码速度。
推荐阅读
- python - {Class}.query.all() 请求未从表中检索所有数据的 Flask-SQLAlchemy 问题
- debugging - 如何从您的 Web 应用程序连接本地托管的 Azure BOT
- python - 通过 Selenium 在 facebook 上解码类名
- c - Separating JSON array elements as a string in C
- android - 如何将 NavArgs 映射到 NavArgument?
- node.js - 节点红色内存不足问题
- r - 根据其他列中的二进制值创建一个新的条件列?(右)
- javascript - 正则表达式 - 如何匹配同时匹配和不匹配模式的所有字符组?
- php - 如何使用 PHP/HTML 从 xml 中提取数据
- regex - Spyder 编辑器中的正则表达式替换不能像 Notepad++ 一样使用捕获组语法