Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

oracle thực thi ngay lập tức không thực thi mà không có bất kỳ lỗi nào

Lý do tại sao mã của bạn không có gì là sau:

OPEN c1;
 LOOP
  EXIT WHEN c1%NOTFOUND;   
  EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);

Bạn đang kiểm tra c1%ROWCOUNT trước khi bạn thực hiện tìm nạp. Vậy giá trị của nó là 0; Tôi đoán p_SCBCount không phải là 0 tại thời điểm đó (vì bạn đã khởi tạo nó thành một giá trị nào đó trong khối DECLARE) để kiểm tra đánh giá là true và chương trình sẽ thoát.

Ngoài ra, vấn đề là sau:

OPEN c1;
 LOOP
   ...
   FOR i in c1 LOOP

Chúng tôi không thể sử dụng FOR ... IN với một con trỏ rõ ràng. Bạn đã mở con trỏ. Sau đó, FOR cố gắng mở lại nó làm hỏng ORA-06511: PL/SQL: cursor already open . Nếu bạn không thấy lỗi này, bạn phải có một trình xử lý ngoại lệ loại bỏ nó (ví dụ:WHEN others then null; ).

Về cơ bản vòng lặp bên ngoài là hoàn toàn không cần thiết và bạn nên loại bỏ nó.

Điều khiển vòng lặp rõ ràng hiếm khi cần thiết:chỉ cần sử dụng FOR ... IN xây dựng và để Oracle kiểm soát luồng.

Cũng không cần thiết là tất cả SQL động. SQL hoạt động với các biến vì vậy bạn chỉ cần viết SQL tĩnh tham chiếu đến các thuộc tính con trỏ:

 FOR i in (SELECT crs_cust.CUSTOMER_ID AS CUSTOMER_ID
                 , subset.NEW_CUSTOMER_REFERENCE_ID AS CUSTOMER_REF_ID 
           FROM CRS_CUSTOMERS crs_cust 
           INNER JOIN  DAY0_SUBSET subset
           ON crs_cust.CUSTOMER_ID=subset.CURRENT_CUSTOMER_ID )
 LOOP
     UPDATE CRS_CUSTOMERS 
     SET REF_ID = i.CUSTOMER_REF_ID
     WHERE CUSTOMER_ID = i.CUSTOMER_ID; 
     p_TotalUpdatedCRS := p_TotalUpdatedCRS + 1;

     UPDATE CRS_REVIEWS
     SET REF_ID =  i.CUSTOMER_REF_ID
     WHERE CUSTOMER_ID =  i.CUSTOMER_ID; 

     UPDATE CRS_EVENT 
     SET REF_ID = i.CUSTOMER_REF_ID 
     WHERE UNIQUE_ID = i.CUSTOMER_ID;

     UPDATE ALERT_HEADER 
     SET CUSTOMER_SOURCE_REF_ID = i.CUSTOMER_REF_ID 
     WHERE CUSTOMER_ID = i.CUSTOMER_ID; 
END LOOP;
DBMS_OUTPUT.PUT_LINE ('The total updates to CRS table = ' || p_TotalUpdatedCRS); 

Tôi không chắc về mục đích của c1%ROWCOUNT <> p_SCBCount . Linh cảm của tôi là không cần thiết, bởi vì FOR LOOP kiểm soát các lần tìm nạp một cách chính xác. Trên thực tế, tôi nghi ngờ bạn đã thêm nó để tránh tác dụng phụ của các vòng lặp lồng nhau; và tôi nghi ngờ rằng bạn chỉ giới thiệu các vòng lặp lồng nhau vì mã gốc của bạn đã gặp trở ngại PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (chỉ là phỏng đoán hoang đường).

Tuy nhiên, nếu nó thực sự phục vụ cho việc triển khai một số logic kinh doanh chính hãng, bạn có thể thêm nó vào vòng lặp bằng cách nào đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Biểu thức chính quy (RegEx) cho IPv6 Tách biệt với IPv4

  2. xác định sự khác biệt so với NUMBER (5) và NUMBER (8,2) USER_TAB_COLUMNS

  3. Không có ánh xạ phương ngữ cho loại JDBC:-9

  4. Làm thế nào để cấu hình Ruby on Rails với Oracle?

  5. Chế độ xem cụ thể hóa làm mới nhanh với mệnh đề HAVING?