Generating values from block dumps

Today, I had to identify all rows on a given block. I used DBMS_ROWID, but initially I wasn’t using it correctly. I figured out what I should have been doing (below)…

select work_id from xwc.frbr_holding_display partition(FRBR_HOLDING_DISPLAY_P12) where dbms_rowid.ROWID_BLOCK_NUMBER(rowid,'BIGFILE') > = 8566791

…but in the meantime, I also ended up dumping the blocks and writing the following python script. This assumes the first column is a primary key or some other kind of unique identifier for the rows…

alter system dump datafile &1 block &2;
grep "col  0" trace_file > tmp.txt
python blockdump.py tmp.txt

…where blockdump.py is below…

#!/usr/bin/python
#---------------------------------------------------------------------------
#Author:        Steve Howard
#Date:          March 23, 2009
#Organization:  AppCrawler
#Purpose:       Simple script to print integer equivalents of block dump values.
#---------------------------------------------------------------------------

import fileinput
import string
import sys

for line in fileinput.input([sys.argv[1:][0]]):
  dep=int(string.replace(string.split(string.split(line,"]")[1])[0],"c","")) - 1
  i=0
  tot=0
  exp=dep
  for col in string.split(string.split(line,"]")[1]):
    if i > 0:  
      tot = tot + ((int(col, 16) - 1) * (100**exp))
      exp = exp - 1
    i = i + 1
  print line.rstrip("\n") + " converts to " + str(tot)

You can then validate the output by using the dump function in the database, converted to base 16…

select dump(&one_of_the_values_returned_above,16) from dual;

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.