http://www.perlmonks.org?node_id=11112116


in reply to Re^3: DBD::Oracle::st fetchrow_hashref failed: ORA-25401
in thread RESOLVED - DBD::Oracle::st fetchrow_hashref failed: ORA-25401

It runs fine when I leave out "NOTE" and "LOV_DISPLAY_KEY" which are VARCHAR2. The others are just NUMBER type.

I'm guessing the issue is with the "NOTE" data. If I leave out just "NOTE", it runs and gets all the rows, but then hangs when it attempts to execute the sql again for a second time through a loop it's inside... I'm guessing that's an issue with my code and trying to do it in a loop that way, this is my first time attempting stuff like this so I'm still learning. A broader snip of my perl script:

# establish database connection my $dsn = "dbi:Oracle:DWAPRD"; my $dbh = DBI->connect($dsn, $user, $pass); # execute "lov_table_lookup.sql" my $sth = $dbh->prepare($lov_table_sql); $sth->execute($note_filter, $name_filter); # print returned data and store table numbers in array my @table_numbers; print "\n----------\n"; while(my $row = $sth->fetchrow_hashref()) { print $row->{'TABLE_NUMBER'}, " ", $row->{'GLOBAL_SECTION_NAME'}, +" ", $row->{'NOTE'}, "\n"; push(@table_numbers, $row->{'TABLE_NUMBER'}); } print "----------\n"; # retrieve and print lov value list for each table number found foreach(@table_numbers) { my $row_counter = 1; # execute "lov_value_lookup.sql" my $sth = $dbh->prepare($lov_value_sql); $sth->execute($_); print "\n----------\n"; while(my $row = $sth->fetchrow_hashref()) { print "$row_counter ", $row->{'TABLE_NUMBER'}, " ", $row->{'LO +V_INTEGER_KEY'}, " ", $row->{'LOV_DISPLAY_KEY'}, " ", #$row->{'NOTE'}, "\n"; $row_counter++; } print "----------\n"; }

And the error message I get in that case, which seems to be just telling me "hey dummy, you can't do that with a loop that way" or something of that nature:

DBD::Oracle::db prepare failed: ORA-25408: can not safely replay call +(DBD ERROR: OCIStmtExecute/Describe) [for Statement "-- List all the +codes SELECT table_number , lov_integer_key , lov_display_key --, note FROM rdb_main.dk_lov_detail_rec WHERE table_number = ? ORDER BY table_number, lov_integer_key "] at lov_lookup.pl line 51. Can't call method "execute" on an undefined value at lov_lookup.pl lin +e 52.

EDIT: Yes, it runs fine when I moved the prepare statement outside the loop (derp on my part), so the problem is presumably in the "NOTE" column data for those particular rows it's hanging on.

Just another Perl hooker - My clients appreciate that I keep my code clean but my comments dirty.

Replies are listed 'Best First'.
Re^5: DBD::Oracle::st fetchrow_hashref failed: ORA-25401
by TieUpYourCamel (Scribe) on Jan 30, 2020 at 18:22 UTC
    I had a similar issue with a "notes" field, and a workaround that seemed to work well was to convert the field and cap it:
    SELECT convert(VARCHAR(8000), a.Notes) as Notes ...
    In my case, Notes was a VARCHAR(MAX) data type, and my error message was "out of memory". (My database SQL Server, driver Sybase). You might try this or see what happens if you use:
    convert(VARCHAR(1), a.Notes)
    That would at least tell you if the error is coming from some crap data in that field, assuming the crap data isn't the first character. The above is "worth a shot" but I wouldn't be surprised if it doesn't reveal the problem.

      Thanks, TieUpYourCamel. This was a great suggestion. I have to use CAST instead since my employer's Oracle DB doesn't recognize convert, but it seems to fix the issue.

      CAST(note as CHAR(30)) as note

      Looking at all the unique values, the country is always contained in the first 30 characters anyway, so I'm throwing away the other junk this way and it doesn't seem to ever hang anymore. :-)

      Just another Perl hooker - My clients appreciate that I keep my code clean but my comments dirty.