2010-11-08 5 views
5

Je voudrais un exemple de code.Comment écrire une boucle infinie avec les procédures stockées d'Oracle?

edit: Le code de non-impression a été fixé via l'interface du gestionnaire de base de données.

+1

Qu'essayez-vous d'accomplir? Cela n'a pas l'air très significatif puisque normalement vous essayez d'éviter d'avoir une boucle infinie dans un proc stocké. –

+0

Je reçois la sortie: '0 1 2 3 4 5 6 7 8 9 10 var is null' – Quassnoi

+2

Le commentaire de Jay S est presque certainement correct ici - vous devez activer serveroutput avant d'appeler votre bloc PL/SQL. –

Répondre

11

Une boucle sans instruction EXIT est une façon de générer une boucle infinie dans PL/SQL

BEGIN 
    LOOP 
    null; 
    END LOOP; 
END; 

Vous pourriez Également écrire une boucle WHILE qui ne se termine jamais

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

Je ne sais pas pourquoi auriez-vous besoin, mais:

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

Si votre problème est que vous n'obtenez aucune sortie, alors vous ne pouvez pas avoir e DBTP SORTIE napped encore. Vous pouvez le faire avec:

set serveroutput on 
+0

'DBMS_OUTPUT' avec une boucle infinie est illogique. Oracle ne renvoie aucune sortie au client jusqu'à ce qu'une commande (une requête, un bloc anonyme, DDL, quelle que soit "l'unité" que vous essayez d'exécuter) soit terminée, donc une boucle infinie ne vous donnera jamais de sortie, que vous activé ou non. – jpmc26

3

Une boucle contenant un DBMS_OUTPUT.PUT_LINE ne sera pas infinie (si SERVEROUTPUT est activé) que, par la suite, il remplira toute la mémoire tampon de sortie ou la mémoire disponible. La limite utilisée pour être environ 1 million d'octets serait donc frappé assez rapidement. Si cela remplit toute la mémoire de l'ordinateur, cela peut prendre un certain temps.

Sur les boucles infinies, je suis passé par un mauvais carré d'oubli pour passer à l'élément suivant dans une table.

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; 

Une fois qu'ils sont dans une telle boucle, la session peut devoir être supprimée par le DBA.