2010-11-08 11 views
5

Vorrei un esempio di codice.Come si scrive un ciclo infinito con le stored procedure di Oracle?

modifica: il codice di non stampa è stato risolto tramite l'interfaccia di gestione database.

+1

Cosa cerchi di ottenere? Non sembra molto significativo dato che normalmente si prova ad evitare di avere un loop infinito in un proc memorizzato. –

+0

I get get output: '0 1 2 3 4 5 6 7 8 9 10 var is null' – Quassnoi

+2

Il commento di Jay S è quasi certamente corretto qui-- è necessario abilitare il servoutput prima di chiamare il blocco PL/SQL. –

risposta

11

Un ciclo senza un'istruzione EXIT è un modo per generare un ciclo infinito in PL/SQL

BEGIN 
    LOOP 
    null; 
    END LOOP; 
END; 

Si potrebbe scrivi anche un ciclo WHILE che non finisce mai

BEGIN 
    WHILE(true) 
    LOOP 
    NULL; 
    END LOOP; 
END; 
2

Non so perché si avrebbe bisogno, ma:

BEGIN 
     WHILE 1 = 1 
     LOOP 
       NULL; 
     END LOOP; 
END; 
5

Se il tuo problema è che non stai ricevendo output, allora potresti non avere nabled DBMS OUTPUT ancora. È possibile farlo con:

set serveroutput on 
+0

'DBMS_OUTPUT' con un ciclo infinito è illogico. Oracle non restituisce alcun output al client fino a quando non viene completato un comando (una query, un blocco anonimo, DDL, qualunque "unità" si sta tentando di eseguire), quindi un ciclo infinito non darebbe mai output indipendentemente dal fatto che si abilitato o meno. – jpmc26

3

Un anello contenente un DBMS_OUTPUT.PUT_LINE non sarà infinita (se serveroutput è attivato) come, eventualmente, riempirà l'intero buffer di uscita o la memoria disponibile. Il limite era di circa 1 milione di byte, quindi sarebbe stato colpito abbastanza rapidamente. Se va a riempire l'intera memoria del computer, ciò può richiedere un po 'di tempo.

In loop infiniti, ho attraversato un brutto momento di dimenticare di andare al prossimo elemento in un tavolo.

DECLARE 
    type typ_tab is table of varchar2(10) index by pls_integer; 
    t_tab typ_tab; 
    v_ind number; 
BEGIN 
    t_tab(10) := 'A'; 
    t_tab(20) := 'B'; 
    v_ind := t_tab.first; 
    WHILE v_ind IS NOT NULL LOOP 
    dbms_output.put_line(t_tab(v_ind)); 
    v_ind := t_tab.next(v_ind); --Forget this and it loops forever 
    END LOOP; 
END; 

Una volta entrati in tale ciclo, potrebbe essere necessario che la sessione venga eliminata dal DBA.

Problemi correlati