在prepare-execute语句中为默认值列后的字段传值问题
问题解答
你的第一种写法$sth->execute($PNAME,$ID,$REGION);完全可行,不需要在execute中为date列留空占位符,原因如下:
占位符匹配逻辑:SQL语句的
VALUES子句里,(?,?,trunc(SYSDATE),?)包含三个?占位符,它们的顺序依次对应name、id、region这三个需要传参的字段。execute方法的参数会按顺序填充这些占位符,和date列的硬编码值trunc(SYSDATE)完全不冲突。错误写法说明:
$sth->execute($PNAME,$ID,,$REGION);这种写法在Perl中属于语法错误,会直接导致脚本运行失败,绝对不能这么写。
举个实际执行的例子:
假设$PNAME = "Alice",$ID = 1001,$REGION = "华东",执行后实际运行的SQL逻辑等价于:
BEGIN INSERT INTO my_table (name, id, date, region) VALUES ('Alice',1001,trunc(SYSDATE),'华东'); EXCEPTION WHEN dup_val_on_index THEN null; END;
完全符合你的需求。
另外补充一点:你的PL/SQL块中用EXCEPTION WHEN dup_val_on_index THEN null;来忽略唯一键重复的插入错误,这个逻辑是正常的,但要确保trunc(SYSDATE)生成的日期格式和表中date列的定义兼容(Oracle中DATE类型默认支持这种写法,一般不会有问题)。
内容的提问来源于stack exchange,提问作者Fazlin
相关产品推荐
相关产品推荐

