2015-10-28 3 views
0

Я пытаюсь сделать триггер, который вставляет некоторые в столбец после инструкции insert. Например, у меня есть таблица с колонкой, которая выглядит:После вставки Trigger

Column1 Column2 Column3 

И я вставляя данные в колонке 1, вставка в таблице (Column1) значения («256234», «234234»). Теперь я хотел бы автоматически вставить в COLUMN2 TIMESTAMP и в колонка3 Значение «Y», поэтому выход должен выглядит:

Column1 Column2   Column3 
256234 2015-10-28 08:48 Y 
234234 2015-10-28 08:48 Y 

Ребята, не могли бы вы помочь мне с этим? Я пытался использовать курсор

Наконец я получил что-то вроде этого:

create or replace trigger name 
    after insert on table 
declare 
    c1 sys_refcursor; 
    idx varchar2(200); 
begin 
open c1 for select Column1 from table ; 
loop 
     fetch c1 into idx; 
     exit when c1%NOTFOUND; 
     update table a1 set a1.Column2 = (select to_char(sysdate,'YYYYMMDDHHMISS') from dual) where Column1=idx; 
     update table a1 set a1.Column3 = (select 'Y' from dual) where Column1=idx; 
end loop; 
close c1; 
end; 

Он отлично работает, но мне интересно, если есть какое-то другое лучшее решение, чем это?

+0

Если вы вставляете в ту же таблицу, в которую вы вставляете, тогда вы можете использовать синтаксис ': new.columnName' – SomeJavaGuy

ответ

4

Нет необходимости курсора или даже обновление:

create or replace trigger name 
    before insert on table_x 
begin 
    :new.column2 := sysdate; 
    :new.column3 := 'Y'; 
end; 
/

Но вам нужен before триггера для этого, так как after триггера не может изменить вновь вставленную строку.

Но почему вы не просто определить значения по умолчанию для этих столбцов, то вам не нужен триггер на все:

create table table_x 
(
    column_1 integer, 
    column_2 date default sysdate, 
    column_3 varchar(1) default 'Y' 
); 
+0

Конечно ... Вы являются правильными. .. Спасибо :) – maciek2791

+0

@ maciek2791: «date» не имеет «формата», он хранится в двоичном представлении. Любой «формат», который вы видите, применяется приложением _displaying_ этой даты. Если вы хотите увидеть его в другом формате, примените функцию 'to_char()' при выборе данных. И никогда, никогда не храните даты в столбцах 'VARCHAR'. –

1

Вы можете создать триггер аналогично:

CREATE OR REPLACE TRIGGER "TRG_NAME" 
    BEFORE INSERT ON "TABLE_NAME"    
    FOR EACH ROW 
DECLARE 

BEGIN 

     :NEW.Column2 := to_char(sysdate,'YYYYMMDDHHMISS'); 
     :NEW.Column3 := 'Y'; 


END TRG_NAME ; 
/
ALTER TRIGGER "TRG_NAME" ENABLE; 
/

Надеюсь, что это PL/SQL поможет вам.

+0

Amol благодарит много, но я решил не использовать триггер, я забыл, что могу установить значения по умолчанию во время создания таблицы. – maciek2791

+0

Конечно, но триггер может помочь вам также обновить значение, когда вы выполняете обновление в той же строке. – Amol

Смежные вопросы