我正在尝试将旧日期(01/01/1888)插入到pl / sql代码中的表中,但我只插入了值(01/01/1988)。 将这个旧日期插入表中的正确方法是什么?
declare
p_date date;
p_eventDate date;
sql_str varchar2(2000);
begin
select to_date('01-01-1888','dd-mm-yyyy') into p_eventDate from dual;
p_date := add_months(sysdate,-60);
if( p_eventDate < p_date)
then
sql_str := 'insert into test_date values (''' ||p_eventDate ||''')';
sql_str := 'insert into test_date values (to_date(''' ||p_eventDate ||''',''dd-mm-yyyy''))';
else
sql_str := 'insert into test_date values (''' ||p_date ||''')';
end if;
EXECUTE IMMEDIATE sql_str;
commit;
--dbms_output.put_line(sql_str);
end;
当我检查表test_date时,插入值01/01/1988和01/01/0088。
谢谢!
答案 0 :(得分:2)
我认为您的代码可以简化。
如果我理解得很好,你需要插入两个变量的最小值;如果是这样,你就不需要动态SQL:
declare
p_date date;
p_eventDate date;
begin
select to_date('01-01-1888','dd-mm-yyyy') into p_eventDate from dual;
p_date := add_months(sysdate,-60);
insert into test_date(d) values ( least(p_date, p_eventDate));
commit;
end;
不考虑动态SQL,代码中的主要问题是您在字符串中使用日期而不强制转换它们,因此依赖于隐式转换。
如果由于某种原因,您想要使用动态SQL,那么可以使用绑定变量,例如:
...
sql_str := 'insert into test_date values (:1)';
execute immediate sql_str using someVariable;
...
如果要保留代码的结构,则SQL字符串应为:
sql_str := 'insert into test_date values ( to_date(''' || to_char(p_date, 'dd-mm-yyyy') || ''', ''dd-mm-yyyy''))';
也就是说,首先必须将date
变量强制转换为字符串,使用它来连接语句,然后在语句中将字符串强制转换为date
类型。