Oracle
 sql >> Base de données >  >> RDS >> Oracle

BOUCLE SQL dynamique

Le problème est que vous ne parcourez pas le curseur - pas d'instruction de récupération ou quelque chose comme ça, donc, fondamentalement, vous avez une boucle infinie. Pour éviter cela, vous devez faire quelque chose comme ceci :

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;

Mais, comme vous pouvez le voir, pour ce faire, vous devez savoir quelle table vous interrogez, donc ce n'est pas une solution générale. Il existe peut-être une solution de contournement pour cela, mais je suggère que vous utilisiez une approche plus simple et efficace, par exemple avec 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;

Ok, j'ai réfléchi à la façon d'y parvenir en utilisant votre chemin, et voici ce que j'ai fini avec - récupérez simplement ROWNUM de votre table, chaque table l'a et vous savez que c'est le type - NUMBER. Cette procédure fonctionnera donc dans le cas général :

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;