Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamische SQL-SCHLEIFE

Das Problem ist, dass Sie nicht durch den Cursor iterieren - keine Abrufanweisung oder ähnliches, also haben Sie im Grunde eine Endlosschleife. Um dies zu vermeiden, müssen Sie Folgendes tun:

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;

Aber wie Sie sehen können, müssen Sie dazu wissen, welche Tabelle Sie abfragen, also ist dies keine allgemeine Lösung. Vielleicht gibt es dafür eine Problemumgehung, aber ich schlage vor, Sie verwenden einen einfacheren und effizienteren Ansatz, zum Beispiel mit 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, ich habe darüber nachgedacht, wie ich das auf Ihre Weise erreichen kann, und hier ist, was ich herausgefunden habe - rufen Sie einfach ROWNUM aus Ihrer Tabelle, jede Tabelle hat es und Sie wissen, dass es der Typ ist - NUMBER. Dieses Verfahren funktioniert also im Allgemeinen:

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;