如何正确地将旧日期插入表中?

时间:2017-03-20 16:03:08

标签: sql oracle plsql dynamic-sql

我正在尝试将旧日期(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。

谢谢!

1 个答案:

答案 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类型。