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/PLSQLに役立つ可能性があります。To_Date関数

編集:

わかりました。もう一度質問を読んだ後、この場合はUPDATEよりもMERGEの方がおそらく効率的だと思います。

詳細については、この「単一列の複数行の更新」にアクセスしてください。

于 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 に答える
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 に答える