Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQL LOOP Dinamis

Masalahnya adalah Anda tidak mengulangi kursor - tidak ada pernyataan pengambilan atau semacamnya, jadi, pada dasarnya, Anda memiliki loop tak terbatas. Untuk menghindari ini, Anda perlu melakukan sesuatu seperti ini:

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;

Tapi, seperti yang Anda lihat, untuk melakukan ini, Anda perlu tahu, tabel apa yang Anda tanyakan, jadi ini bukan solusi umum. Mungkin ada solusi untuk ini, tetapi saya sarankan, Anda menggunakan pendekatan yang lebih sederhana dan efisien, misalnya dengan EXECUTE IMMEDIATE:

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;

Oke, saya memikirkan bagaimana mencapai ini menggunakan cara Anda, dan inilah yang akhirnya saya dapatkan - ambil saja ROWNUM dari tabel Anda, setiap tabel memilikinya dan Anda tahu tipenya - NUMBER. Jadi prosedur ini akan bekerja dalam kasus umum:

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. Cara memilih semua kolom, dan hitungan (*) dalam kueri yang sama

  2. Cara Mengganti Baris Baru di Oracle

  3. Oracle Apex 5.0 - Menampilkan gambar statis

  4. PRVG-2027 Pemilik file tidak konsisten di seluruh node

  5. Atasi Kesalahan PLS-00323 di Oracle