I hope you will forgive me for a late addendum.
Not only do I have to apologize for the late arrival of this post, I also 
should apologize for its (lack of) seriousness.
Actually - this is in every respect just a programming scherzo, so to speak. 
(Even though the code below works, at least for me)
Now you are all warned. ;-)

So: If you are used to letting MARC::Batch read the records from a file, then 
you can simply read from your database (i.e. your statement handle) like you 
were reading from a file.
Like this:

<code>
#!/usr/local/bin/perl -w
use DBI;
use MARC::Batch;
use strict;
#BEGIN {
#    $ENV{NLS_LANG} =  ...;
#}
my $dbh = DBI->connect(...) || die 1;
$dbh->{LongReadLen} = 99999;
$dbh->{LongTruncOk} = 0;
my $sql = q( select GetBibBlob(bib_id) from bib_master where rownum <= 3 );
my $sth = $dbh->prepare($sql) || die 2;
my $rv  = $sth->execute() || die 3;
# add some magic:
tie(*MARC, 'dbfile', $sth);
# pass the virtual filehandle to MARC::Batch
my $batch = MARC::Batch->new('USMARC', *MARC );
$batch->strict_off;
# read as usual
while ( my $marc = $batch->next ) {
    print $marc->as_formatted(), "\n\n";
}

#---------------
package dbfile;
use strict;
sub TIEHANDLE {
    my ($class, $sth) = @_;
    my $i = { 'sth' => $sth,
              'eof' => 0, };
    bless $i, $class;
}
sub READLINE {
    my ($marc) = $_[0]->{sth}->fetchrow_array() ;
    if (defined $marc) {
        my $len = substr($marc,0,5);
        return substr($marc,0,$len);
    }
    else {
        $_[0]->{'eof'} = 1;
        return undef;
    }
}
sub EOF {
    # eof()
    $_[0]->{'eof'};
}
sub FILENO {1}
sub BINMODE {1}
sub CLOSE {1}
sub DESTROY {1}
__END__
</code>

That's all folks,

/Leif
Leif Andersson, Systems Librarian
Stockholm University Library

________________________________________
Från: Doran, Michael D [do...@uta.edu]
Skickat: den 7 januari 2011 15:11
Till: Leif Andersson; 'Jon Gorman'; perl4lib
Ämne: RE: MARC blob to MARC::Record object

Hi Leif and Jon,

> use MARC::Record;
> ...
> my $record = MARC::Record->new_from_usmarc( $blob );

This works!

> From: Jon Gorman [mailto:jonathan.gor...@gmail.com]
> Sent: Friday, January 07, 2011 7:51 AM
> You'll probably think of this when you get up, but did you make sure
> to import the package? ie use MARC::FILE::USMARC;?

This made the other way work, too! (I had only "use MARC::File")

Much thanks to Leif and Jon.

-- Michael

# Michael Doran, Systems Librarian
# University of Texas at Arlington
# 817-272-5326 office
# 817-688-1926 mobile
# do...@uta.edu
# http://rocky.uta.edu/doran/

> -----Original Message-----
> From: Leif Andersson [mailto:leif.anders...@sub.su.se]
> Sent: Friday, January 07, 2011 7:50 AM
> To: Doran, Michael D; perl4lib
> Subject: Re: MARC blob to MARC::Record object
>
> Hi Michael,
>
> this is how I - in principle - usually do it:
>
> use MARC::Record;
> ...
> my $record = MARC::Record->new_from_usmarc( $blob );
>
> /Leif
>
> Leif Andersson, Systems librarian
> Stockholm University Library
> ________________________________________
> Från: Doran, Michael D [do...@uta.edu]
> Skickat: den 7 januari 2011 00:18
> Till: perl4lib
> Ämne: MARC blob to MARC::Record object
>
> I am working on a Perl script that retrieves data from our Voyager ILS via an
> SQL query.  Among other data, I have MARC records in blob form, and the script
> processes one MARC record at a time.  I want to be able to parse and
> modify/convert the MARC record (using MARC::Record) before writing/printing
> data to a file.
>
> How do I make the MARC blob into a MARC::Record object (without having to
> first save it a file and read it in with MARC::File/Batch)?  The MARC blob is
> already in a variable, so it doesn't make sense (to me) to write it out to a
> file just so I can read it back in.  Unless I have to, natch.
>
> I apologize if I am missing something obvious.
>
> -- Michael
>
> # Michael Doran, Systems Librarian
> # University of Texas at Arlington
> # 817-272-5326 office
> # 817-688-1926 mobile
> # do...@uta.edu
> # http://rocky.uta.edu/doran/

Reply via email to