Minimize
Blogger List

Johannes Ahrends
Toad and Oracle

Ben Boise
Toad SC Discussions

Kevin Dalton
Benchmark Factory

Steven Feuerstein
PL/SQL Obsession

Devin Gallagher
Toad SC discussions

Stuart Hodgins
JProbe Discussions

  Henrik "Mauritz" Johnson
Toad Tips & Tricks on the "other" Toads
  Mark Kurtz
Toad SC discussions
  Michael Lumbard
Toad SC discussions
Daniel Norwood
Toad for Data Analysts,
Toad Extension for Visual Studio
Debbie Peabody
Toad for Data Analysts
Gary Piper
Toad Reports Manager
John Pocknell
Toad for Oracle, JProbe
Kuljit Sangha
Toad SC discussions
Bert Scalzo Indicates Oracle ACE status
Toad for Oracle, Data Modeling, Benchmarking
Jeff Smith
Toad product family
Richard To
SQL Optimization
Jim Wankowski
DB2 - LUW and z/OS
John Weathington
  Toad Data Modeler Opens in a new window
Data Modeling
 
  Real Automated Code Testing for Oracle
Quest Code Tester blog
 
Minimize
Blog Tags
toad for oracle (122)
oracle (62)
plsql (46)
sql optimization (37)
toad for data analysts (28)
code tester (19)
toad for ibm db2 (13)
automation (11)
batch optimizer (10)
virtualization (10)
schema browser (9)
toad for sql server (9)
data grid (8)
sql (8)
sql editor (8)
toad data modeler (8)
benchmark factory (7)
excel (7)
query builder (7)
report manager (7)
toad extension (7)
visual studio (7)
11g (6)
configuration (6)
freeware (6)
health check (6)
vmware (6)
connect (5)
dba module (5)
er diagrammer (5)
F4 (5)
linux (5)
refactoring (5)
spotlight (5)
unicode (5)
compare (4)
debugger (4)
export (4)
formatter (4)
make code (4)
rman (4)
strip code (4)
benchmark (3)
bfscript (3)
bulk collect (3)
code templates (3)
code xpert (3)
database browser (3)
db2 (3)
notebook (3)
oem (3)
RAC (3)
session browser (3)
speed (3)
sql optimizer (3)
toad for mysql (3)
tpc-c (3)
9.7 (2)
alert log (2)
app designer (2)
awr (2)
code insight (2)
code snippets (2)
collection (2)
compare and sync (2)
compliance (2)
data generator (2)
data warehouse (2)
database explorer (2)
database monitor (2)
explain (2)
forall (2)
ftp (2)
group execute (2)
handbook (2)
installation (2)
job scheduler (2)
multi-task (2)
nested table (2)
os command (2)
profiler (2)
recovery (2)
release history (2)
save as (2)
schema compare (2)
sql recall (2)
stats pack (2)
subversion (2)
team coding (2)
trace file browser (2)
while loop (2)
10g (1)
64 bit (1)
7zip (1)
action (1)
addm (1)
alter (1)
ansi join (1)
array (1)
ccleaner (1)
code coverage (1)
code road map (1)
CRON (1)
cursor for loop (1)
data browser (1)
data subset (1)
database probe (1)
dbms_flashback (1)
dbms_profiler (1)
ddl (1)
feuerstein (1)
filezilla (1)
flash drive (1)
flow control (1)
for loop (1)
group policy manager (1)
hints (1)
import (1)
index (1)
inheritance (1)
invoker rights (1)
ipad (1)
java (1)
latency (1)
log switch (1)
logical model (1)
ltrim (1)
master-detail browser (1)
monitor (1)
multi-select (1)
naming standards (1)
network (1)
object explorer (1)
OEBS (1)
package (1)
parser (1)
partitioning (1)
performance (1)
pragma (1)
project manager (1)
RAT (1)
revo (1)
REXEC (1)
schema report (1)
script manager (1)
search (1)
set operator (1)
sga (1)
slow (1)
sonarsource (1)
source control (1)
space projection (1)
sql monitor (1)
sql navigator (1)
sql script (1)
sql tracker (1)
sql*plus (1)
standards (1)
statistics (1)
stored procedure (1)
string parser (1)
sub-model (1)
sub-type (1)
synch (1)
synchback (1)
TELNET (1)
toad (1)
trace (1)
unit test (1)
unix (1)
usb (1)
utility (1)
v10 (1)
v9.5 (1)
version control (1)
waits (1)
workload replay (1)
workspace (1)
xml (1)
 
WELCOME, GUEST
 
 

Blogs
Toad and Database Commentaries

Toad World blogs are a mix of insightful how-tos from Quest experts as well as their commentary on experiences with new database technologies.  Have some views of your own to share?  Post your comments!  Note:  Comments are restricted to registered Toad World users.

Do you have a topic that you'd like discussed?  We'd love to hear from you.  Send us your idea for a blog topic.


Aug 29

Written by: StevenFeuersteinTW
Wednesday, August 29, 2007 12:42 PM  RssIcon

I don't know about you, but I sometimes write code that (inadvertently, not on purpose) contains an infinite loop. So I run my program and Toad goes off into never-never land, with Oracle chewing up CPU cycles so intently that it is hard to connect as SYS and kill the session.

I hate that, don't you?

Now, there are two ways to address this problem:

1.       Don't write code that contains infinite loops. Well, DUH! Of course not. I never want to do this intentionally, but of course the world (even the world of my code) does not always match my intentions.

2.       Insert "killer logic" into the loop that forces termination of the loop after an excessive number of variations. I wrote a package (loop_killer) that makes it is easy to do precisely this.

Show me the code!

I certainly won't show you all the code in this entry. Download full source code from this zip file.

Here, however, is the specification of the package:

CREATE OR REPLACE PACKAGE loop_killer

/*

| File name: loop_killer.pkg

|

| Overview: Simple API to make it easier to insert code inside a loop

|           to check for infinite or out of control loops and kill

|           them after N iterations.

|

|           Raises the infinite_loop_detected exception.

|

| Author(s): Steven Feuerstein

|

| Modification History:

|   Date          Who         What

|   23-AUG-2007   SF          Created package

*/

IS

   e_infinite_loop_detected   EXCEPTION;

   c_infinite_loop_detected   PLS_INTEGER := -20999;

   PRAGMA EXCEPTION_INIT (e_infinite_loop_detected, -20999);

 

   PROCEDURE kill_after (max_iterations_in IN PLS_INTEGER);

 

   PROCEDURE increment_or_kill (by_in IN PLS_INTEGER DEFAULT 1);

 

   FUNCTION current_count

      RETURN PLS_INTEGER;

END loop_killer;   

How do I use it?

The loop killer package is very straightforward:

·          loop_killer.kill_after: a subprogram that tells the utility the limit of iterations after which the loop should be terminated. You call this program before you start the loop. It sets the "kill after" limit and also sets the internal counter to 1.

·          loop_killer.increment_or_kill: call this subprogram inside your loop. It will either increment the counter or kill the loop if the increment has met the "kill after" value you provided earlier.

·          loop_killer.current_count: returns the current count in the iterations.

Things to keep in mind:

The loop is terminated by raising the loop_killer.e_infinite_loop_detected exception, which has the error code -20,999. You will also see a message displayed on your screen, as you will see below in the example.

Here is an example of using loop_killer to terminate a truly infinite loop:

Here's the DBMS_OUTPUT text from the termination:

Loop killer failure: Your loop exceeded 100 iterations.

Call stack below shows location of problem:

----- PL/SQL Call Stack -----

  object      line  object

  handle    number  name

26D69C20        29  package body QCTO1600_NEW.LOOP_KILLER

26F1C63C         6  anonymous block

Here's the code, in case you want to try it yourself:

BEGIN

   loop_killer.kill_after (100);

 

   LOOP

      DBMS_OUTPUT.put_line (loop_killer.current_count);

      loop_killer.increment_or_kill;

   END LOOP;

END;

/

Tags:
Categories:

2 comment(s) so far...


Re: Quseful #7: Kill those infinite loops!

The zip file does not include the expected source code, but for the randomizer.

By Guido on   Thursday, August 30, 2007 1:11 PM

Re: Quseful #7: Kill those infinite loops!

Sorry, Guido, I have fixed the problem. SF

By StevenFeuersteinTW on   Monday, September 17, 2007 3:45 PM
Search Blog Entries