лично мне нравится хранить undef
для представления значений NULL - это соответствует тому, что все заполнители DBI / DBIx :: Class / SQL :: Abstract все делают, и риск установки в качестве строки "NULL"
заключается в том, что вы случайновставьте строку, а не NULL
.
Если вы используете последнюю версию Perl (5.10 или более позднюю), то проверьте операторы «определенные-или» //
и //=
которые особенно удобны для обработки аргументов.
относительно SQL, если вы хотите сгенерировать строку SQL, вы можете получить что-то вроде этого:
sub mysub {
my ($args) = @_;
my @fields = qw/ field1 field2 field3 /;
my $sql = "INSERT INTO mytable (field1,field2,field3) VALUES (" .
join(',', map { ("'".$args->{$_}."'") // 'NULL' ) } )
.")";
return $sql;
}
edit (чтобы ответить нанемного о NULL и undef):
Использование дескрипторов DBI с заполнителями:
my $sth = $dbh->prepare('INSERT INTO mytable (field1,field2,field3) '.
'VALUES (?,?,?)');
# undef will set a NULL value for field3 here:
$sth->execute( "VAL1", "VAL2", undef );
DBIx :: Class
DBIx :: Class - тот же принцип - передать значение undef для создания NULL
в базе данных:
my $rs = My::Schema->resultset('MyTable');
my $obj = $rs->create({
field1 => 'VAL1',
field2 => 'VAL2',
field3 => undef, # will set a `NULL` value for field3 here
});