使用Perl DBI参数化INSERT向Oracle插入datetime值的问题
报错原因
参数化查询的占位符只会将传入内容作为纯值处理,不会解析其中的SQL函数逻辑。你之前拼接SQL时TO_DATE()属于SQL语句的一部分,会被Oracle正常执行;但绑定参数时,整个TO_DATE('xxx','xxx')会被当做普通字符串传入DATE类型字段,类型不匹配触发报错。
解决方案
方案1(改造成本最低,推荐)
将TO_DATE函数逻辑放到SQL模板中,仅绑定纯日期字符串参数:
- 调整日期变量定义,去掉外层的
TO_DATE包裹:
# 仅保留日期字符串本体 my $Date_Str_To_Insert = '2003/05/03 21:02:44';
- 调整SQL语句模板,把
TO_DATE写死在SQL中:
my $SQL1 = "insert into table1 (valdat) values (TO_DATE(?, 'yyyy/mm/dd hh24:mi:ss'))";
- 执行时直接传入日期变量即可:
$SQL1_sth->execute($Date_Str_To_Insert);
方案2(强类型绑定,避免格式问题)
直接绑定Perl日期对象,不需要手动处理日期格式转换:
use strict; use warnings; use DBI; use DBD::Oracle qw(ORA_DATE); use DateTime; my $SRV1='server1'; my $DB1='database1'; # 构造DateTime对象,不需要处理字符串格式 my $dt = DateTime->new( year => 2003, month => 5, day => 3, hour => 21, minute => 2, second => 44 ); my $db1 = DBI->connect("dbi:Oracle:$SRV1/$DB1", "user", "pword"); my $SQL1="insert into table1 (valdat) values (?)"; my $SQL1_sth = $db1->prepare($SQL1); # 绑定参数时指定为Oracle DATE类型 $SQL1_sth->bind_param(1, $dt, { ora_type => ORA_DATE }); $SQL1_sth->execute(); $SQL1_sth->finish(); $db1->disconnect if defined($db1);
内容的提问来源于stack exchange,提问作者Chazg76
相关产品推荐
相关产品推荐

