![](/img/trans.png)
[英]BULK COLLECT/FORALL statements with dynamic query and table name- Oracle PL/SQL
[英]SQL%ROWCOUNT is not providing desired outcome with dynamic SQL Having BULK COLLECT and FORALL in Oracle PL/SQL
SQL%ROWCOUNT 返回運行時考慮的計數 (10),而不是更新記錄的確切數量。 期望 SQL%ROWCOUNT 應該提供更新的實際記錄數。 請建議我如何完成任務。
觸發動態的代碼 SQL
FORALL indx IN 1 .. l_account_data.COUNT --assume 10 as count
SAVE EXCEPTIONS
EXECUTE IMMEDIATE dynamic_sql_query USING l_account_data (indx);
DBMS_OUTPUT.put_line ('Successful UPDATE of '|| TO_CHAR (SQL%ROWCOUNT) || ' record');
COMMIT;
BEGIN
SELECT clmn_x, clmn_y
BULK COLLECT INTO l_subscr_data
FROM table_x e, table_y c
WHERE c.ref_id = :account_no AND e.account_no = c.account_no;
FORALL indx IN 1 .. l_subscr_data.COUNT
UPDATE table_z ciem --this update will update multiple records for each account
SET ciem.ext_id = ciem.sub_no || ROWID
WHERE ciem.sub_no = l_subscr_data (indx).clmn_x
AND ciem.subscr_no_resets = l_subscr_data (indx).clmn_y
AND ciem.status IN (1,2);
END;
您的外部execute immediate
調用不知道動態 SQL 內部發生了什么; 它不知道自己在做什么,也不知道它可能影響或不影響多少行。
要獲得准確的計數,您需要修改動態語句以添加如下內容:
FOR indx IN 1 .. l_subscr_data.COUNT LOOP
:total_count := :total_count + coalesce(SQL%BULK_ROWCOUNT(indx), 0);
END LOOP;
並將您的外部調用更改為 (a) 傳遞一個額外的 IN OUT 綁定變量來跟蹤總計數,以及 (b) 使用 FOR 循環而不是 FORALL,因為這似乎只在第一次動態調用后保留值(不確定如果有記錄,或者是錯誤)。 所以像:
...
l_total_count number := 0;
...
FOR indx IN 1 .. l_account_data.COUNT LOOP
EXECUTE IMMEDIATE dynamic_sql_query
USING l_account_data (indx), in out l_total_count;
END LOOP;
DBMS_OUTPUT.put_line ('Successful UPDATE of '|| TO_CHAR (l_total_count) || ' record');
db<>fiddle 演示與虛構的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.