I had an occasion to use the func('plsql_errstr') extension of
DBD::Oracle today. It didn't exactly fit my needs. The problem is that
the function as currently defined returns ALL of the contents of
user_errors table, some of which are very old from pacakges that are
not what I am loading. As implemented, it is the functional equivilent
of

show errors

when I really need 

show errors table foo

Soooo, I put the following in my script:

package DBD::Oracle::db;
sub plsql_errstr2 {
    # original version thanks to Bob Menteer
    my $sth = shift->prepare_cached(q{
        SELECT name, type, line, position, text
        FROM user_errors ORDER BY name, type, sequence
    }) or return undef;
    $sth->execute or return undef;
    my ( @msg, $oname, $otype, $name, $type, $line, $pos, $text, %msg_idx );
    $oname = $otype = 0;
    while ( ( $name, $type, $line, $pos, $text ) = $sth->fetchrow_array ) {
        if ( $oname ne $name || $otype ne $type ) {
            push @msg, "Errors for $type $name:";
            $oname = $name;
            $otype = $type;
            $msg_idx{$name} = {
                        'name' => $name,
                        'type' => $type,
                        msg => []
                        };
        }
        push @msg, "$line.$pos: $text";
        push @{$msg_idx{$name}->{'msg'}}, "$line.$pos: $text";
    }
    if([EMAIL PROTECTED]) {
        return join( "\n", @msg );
    } else {
        return join( "\n", {$msg_idx{$_[0]}->{'msg'}} );
    }
}

and called 

$dbh->func('mytrigger','plsql_errstr2'')

after creating my trigger. Worked like a charm. May I suggest
replacing the current version of plqsl_errstr with this one. If
accpeted, point me to where I should patch the corresponding tests and
I will do so.
 
Now, you will notice that I had to name the function plsql_errstr2.
When I named it plsql_errstr, it did not override the existing
function. My suspicion is that either DBI does some unusualy funky
dispatch stuff OR I simply don't understand how to override functions
without subclassing. Would anyone care to enlighten me as to why I
failed to override plsql_errstr?

Thank you



-- 
Matthew O. Persico

Reply via email to