簡體   English   中英

SQL%ROWCOUNT 未通過動態 SQL 提供所需的結果 在 Oracle PL/SQL 中具有 BULK COLLECT 和 FORALL

[英]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;

動態_sql_查詢

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM