0

我想执行update query

源列是varchar类型,目标列是date类型

我正在使用 oracle 10g,所以 isdate 功能不起作用

我想更新基于列而不是基于行

认为

更新后的预期输出

source             target 
11/12/2012         11 dec 2012 
sdfsdf             null 

update dummy set 
    informationdate = 
(begin to_date(txt_informationdate) exception when others null);

我不能使用最大限制的程序或功能

4

3 回答 3

0

您可以使用 Oracle 的错误记录工具:

execute dbms_errlog.create_error_log('DUMMY', 'DATE_ERRORS');

update dummy 
   set informationdate = to_date(txt_informationdate, 'mm/dd/yyyy')
log errors into date_errors
reject limit unlimited;

更新将更改 to_date() 成功的所有行。所有其他人都将登录到 DATE_ERRORS 表中,您可以在那里检查它们。

请注意,我在 to_update() 调用中使用了格式掩码以确保正确转换文本。你不应该在没有指定格式的情况下使用 to_date(),因为它依赖于 NLS(客户端)设置,这可能不是你认为的那样。

于 2012-07-31T22:02:13.300 回答
0

这可能有助于Oracle/PLSQL:To_Date 函数

编辑:

好的。再次阅读您的问题后,我认为在这种情况下,使用 MERGE 可能比 UPDATE 更有效。

有关更多信息,请访问此更新单列中的多行

于 2012-07-25T06:03:30.880 回答
0

如果你在 pl/sql 上下文中运行,你真的可以像这样去做

declare
   l_date date;
begin
   begin
      l_date := to_date(txt_informationdate);
   exception
      when others then l_date := null;
   end;
   if l_date is null then
      update dummy set informationdate = l_date;
   end if;
exception
   when others then 
      dbms_output.put_line('something else went wrong');
end;

我没有对此进行测试,但应该可以。也许你必须纠正一些语法错误。

如果您想从其他语言程序中进行更新,那么您可能需要为上述内容创建一个小过程,而不是对远程过程调用进行更新。或者您也可以为自己定义一个 is_date 函数,可能像这样

create or replace function is_date(i_date varchar2)
return date
as
begin
   return to_date(i_date);
exception
   when other then return null;
end;

您的更新可能看起来像这样

update dummy set informationdate = is_date(txt_informationdate);

同样,这一切都未经测试,可能有一些语法错误,但我相信你明白了。

于 2012-07-31T20:44:55.973 回答