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

LOOP SQL động

Vấn đề là bạn không lặp lại thông qua con trỏ - không có câu lệnh tìm nạp hoặc điều gì đó tương tự, vì vậy, về cơ bản, bạn có một vòng lặp vô hạn. Để tránh điều này, bạn cần phải làm như sau:

CREATE OR REPLACE PROCEDURE how_many_rows
   (p_in_table VARCHAR2) IS
   TYPE cur_cur IS REF CURSOR;
   v_cur_cur cur_cur;
   v_rowcount NUMBER(28);
   v_cur_txt VARCHAR2(299);
   v_row SOME_TABLE%ROWTYPE; --add row variable
BEGIN
   v_cur_txt := 'SELECT * FROM '|| p_in_table;

OPEN v_cur_cur FOR v_cur_txt;
   LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      FETCH v_cur_cur INTO v_row; --fetch a row in it
         EXIT WHEN v_cur_cur%NOTFOUND;
   END LOOP;
CLOSE v_cur_cur;

DBMS_OUTPUT.PUT_LINE(v_rowcount);
END;

Tuy nhiên, như bạn có thể thấy, để làm được điều này, bạn cần biết bạn đang xác định bảng nào, vì vậy đây không phải là giải pháp chung. Có thể có một giải pháp cho việc này, nhưng tôi khuyên bạn nên sử dụng cách tiếp cận đơn giản và hiệu quả hơn, chẳng hạn với EXECUTE NGAY LẬP TỨC:

CREATE OR REPLACE PROCEDURE HOW_MANY_ROWS(p_in_table VARCHAR2)
       IS
v_tmp NUMBER;
BEGIN

EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM ' || p_in_table INTO v_tmp;
DBMS_OUTPUT.PUT_LINE(v_tmp);

END;

Được rồi, tôi đã suy nghĩ về cách đạt được điều này theo cách của bạn và đây là những gì tôi đã kết thúc - chỉ cần tìm nạp ROWNUM từ bảng của bạn, mọi bảng đều có và bạn biết đó là loại - NUMBER. Vì vậy, thủ tục này sẽ hoạt động trong trường hợp chung:

CREATE OR REPLACE PROCEDURE how_many_rows
   (p_in_table VARCHAR2) IS
   TYPE cur_cur IS REF CURSOR;
   v_cur_cur cur_cur;
   v_rowcount NUMBER(28);
   v_cur_txt VARCHAR2(299);
   v_row NUMBER; --add rownum variable
BEGIN
   v_cur_txt := 'SELECT ROWNUM FROM '|| p_in_table; --select only rownum from target table

OPEN v_cur_cur FOR v_cur_txt;
   LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      FETCH v_cur_cur INTO v_row; --fetch rownum in it
         EXIT WHEN v_cur_cur%NOTFOUND;
   END LOOP;
CLOSE v_cur_cur;

DBMS_OUTPUT.PUT_LINE(v_rowcount);
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển và trả về đối tượng mảng tùy chỉnh trong ibatis và oracle trong java

  2. Làm thế nào để tải tập lệnh bảng trong Oracle SQL Developer?

  3. Làm thế nào để bạn biết một chỉ số tốt là gì?

  4. Làm thế nào để lấy ngày hiện tại trong PL / SQL?

  5. Giải quyết lỗi PLS-00323 trong Oracle