in reply to zero vs undef

Change your conditionals. There's a myriad conditions your can use to your advantage: in the first case, since you're pulling the parameters off one by one you can check for whether @ARGV still has elements:
my $MISC_FILE_DIR = @ARGV ? shift : die usage(); # ... # ...
But I'd rather write that piece as
die usage() if @ARGV < 5; my ($MISC_FILE_DIR, $req, $inqfile, $sent, $status) = @ARGV;
Your second situation requires the canonical fix, a test of definedness:
while( my @row = $sth->fetchrow_array ) { print join( '|', map ( defined() ? $_ : 'NULL', @row )) ."\n"; }

Makeshifts last the longest.