1

私は行があるトリガーを書きました:

SELECT * 
  INTO :NEW.EVENTDATE 
  FROM (SELECT SYSDATE 
          FROM DUAL);

何らかの理由でこれは機能しません (EVENTDATE 列にはタイムスタンプ (0) 型があります)。

何かを挿入しようとすると、その列には値が長すぎるというエラー メッセージが表示されます。私は SYSDATE と timestamp(0) が合体してお互いを理解するだろうと思っていました。

なに?

4

5 に答える 5

2

PL/SQLでこれを行う必要があります

:new.EventDate := SYSTIMESTAMP;

ただし、SQLを使用する場合

SELECT systimestamp
  INTO :new.EventDate
  FROM dual;
于 2011-02-02T21:40:00.447 に答える
1

次のような明示的なキャストを試してください

select cast(sysdate as timestamp(0)) from dual

考えとして、異常な変換を強制する可能性のあるセッションのカレンダー設定に異常なものはありますか? その場合は、変換で適切なカレンダーを指定してみてください。

select to_char(sysdate,'DD-fmMonth-YYYY','nls_calendar=''Arabic Hijrah''') from dual;
于 2011-02-02T23:17:04.590 に答える
0

どのバージョンを実行していますか?

以下は、Oracle11R2で正常に機能します。

drop   table tq84_eventdate;

create table tq84_eventdate (
  data      varchar2(10),
  eventdate timestamp(0)
);

create trigger tq84_eventdate_trg 
before insert on tq84_eventdate 
for each row
begin

  SELECT * INTO :NEW.EVENTDATE FROM (SELECT SYSDATE FROM DUAL);

end tq84_eventdate_trg;
/


insert into tq84_eventdate (data) values ('test');

select * from tq84_eventdate;

しかし、私が

insert into tq84_eventdate (data) values ('value too large!');

おっしゃったORA-12899を入手しました。したがって、エラーはおそらく、投稿したselectステートメントではなく、実際に挿入しようとしているデータに関連しています。

また、関連する注記では、トリガーで直接sysdateを割り当てることができます。つまり、selectステートメントの間接参照はありません。

create trigger tq84_eventdate_trg 
before insert on tq84_eventdate 
for each row
begin

  :new.eventdate := sysdate;

end tq84_eventdate_trg;
/
于 2011-02-02T21:44:31.990 に答える
0

ある列のタイプを別の列に変換するように上司に勧めることができました。つまり、DATEまでのタイムスタンプ。

不思議なことに、このブランチ全体で、タイムスタンプフィールドをDATEフィールドに置き換えることができると指摘した人は誰もいません。

于 2011-02-03T00:56:28.897 に答える
0

なぜこれがうまくいかないのかわかりません。発生している実際のエラー (コードとすべてを含む) を投稿できますか?

また、変数を割り当てるだけではない理由もわかりません。

:NEW.EVENTDATE := systimestamp;
于 2011-02-02T21:41:19.190 に答える