sql >> Databasteknik >  >> RDS >> Oracle

Dynamisk SQL LOOP

Problemet är att du inte itererar genom markören - ingen hämta-sats eller något liknande, så du har i princip en oändlig loop. För att undvika detta måste du göra något i stil med detta:

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;

Men, som du kan se, för att göra detta måste du veta vilken tabell du frågar efter, så detta är ingen generell lösning. Det kanske finns en lösning för detta, men jag föreslår att du använder ett mer enklare och effektivt tillvägagångssätt, till exempel med 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, jag tänkte på hur man kan uppnå detta på ditt sätt, och här är vad jag har slutat med - hämta bara ROWNUM från ditt bord, varje tabell har det och du vet att det är typ - NUMBER. Så denna procedur kommer att fungera i allmänna fall:

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. NANVL() Funktion i Oracle

  2. Hur får man tabelldefinition i Oracle?

  3. PostgreSQL-index används inte för fråga om IP-intervall

  4. Oracle välj senaste datumposten