2013-07-03 3 views
0

Пожалуйста, помогите мне с проблемой, я хочу написать триггер, где я могу вставлять значения в новую таблицу, когда вставка/обновление происходит в исходной таблице.Вставка/обновление Oracle SQL Trigger ---

Ниже представлена ​​структура таблицы, откуда я хочу получить данные в другую таблицу.

СПИСОК ТАБЛИЦА

Name Null Type


LISTINGID NOT NULL VARCHAR2(28)
LISTINGMANAGERID NOT NULL VARCHAR2(28)
MANAGEAVAILABILITYFLAG VARCHAR2(1)
AVAILABILITYTEXT VARCHAR2(2000)

AREAINQUIRYFLAG VARCHAR2(1)
COUNTRYTEXT VARCHAR2(50)
STATEPROVINCETEXT VARCHAR2(50)
CITYTEXT VARCHAR2(50)
CHECKINTIME VARCHAR2(10)
CHECKOUTTIME VARCHAR2(10)
TIMEZONEID VARCHAR2(20)

PERSONALLINKURL VARCHAR2(150)

GOLDSUBSCRIPTIONSINCE DATE
AUDITPASSFLAG NOT NULL VARCHAR2(1)
MGRONLINEFLAG NOT NULL VARCHAR2(1)
ADMINAPPROVALFLAG NOT NULL VARCHAR2(1)
DELETEDFLAG VARCHAR2(1)
LASTUPDATED NOT NULL DATE
UPDATEDBY NOT NULL VARCHAR2(28)
OCA NOT NULL NUMBER(38)
SUSPENDEDFLAG NOT NULL VARCHAR2(1)
POSSIBLEFEATUREDCITYFLAG NOT NULL VARCHAR2(1)
TOTALPHOTOS NUMBER(38)
SUSPENDEDDATE DATE
OFFLINEDATE DATE
CURRENCY VARCHAR2(3)
POINTCHARGE VARCHAR2(2)
AVERAGEOFREVIEWS FLOAT(126)
NUMBEROFREVIEWS NUMBER(38)
RENTALMODEL VARCHAR2(10)
NOTHANKS VARCHAR2(1)
DIGITALSIGN VARCHAR2(50)

Нужна привести к приведенной ниже таблице с любым обновлением или новой вставкой из списка таблицы.

i) listingid должен содержать листинг из таблицы листинга.

ii) OFFLINE COLUMN должна содержать данные с условием ниже.

AuditPassFlag = 'Y' AND AdminApprovalFlag = 'Y' И MgrOnlineFlag = 'Y' И DeletedFlag - это NULL AND SuspendedFlag!= 'Y'

iii) TIMESTAMP COLUMN lastupdated date from listing table.

LISTING_LASTUPDATE ТАБЛИЦА

Название Null Тип


LISTINGID NOT NULL VARCHAR2(20)

IS_OFFLINE VARCHAR2(1)

TIMESTAMP TIMESTAMP(0)

Ниже триггера Я написал:

Не работает должным образом, если это условие означает, что Листинг находится в режиме онлайн: кроме того, что его работа прекрасна.

CREATE OR REPLACE TRIGGER listingLast_updated 
    AFTER INSERT OR UPDATE 
    ON listing 
    FOR EACH ROW 

DECLARE 
    L_Listingid    VARCHAR2 (20); 

    L_ISOFFLINE    VARCHAR2 (1); 

    LASTUPDATED_TIMESTAMP DATE; 
BEGIN 
    SELECT SYSDATE INTO LASTUPDATED_TIMESTAMP FROM DUAL; 

    IF ( :NEW.AuditPassFlag = 'Y' 
     AND :NEW.AdminApprovalFlag = 'Y' 
     AND :NEW.MgrOnlineFlag = 'Y' 
     AND :NEW.DeletedFlag IS NULL 
     AND :NEW.SuspendedFlag != 'Y') THEN 
     L_ISOFFLINE := 'Y'; 
    ELSE 
     L_ISOFFLINE := 'N'; 

     INSERT 
     INTO LISTING_LastUPDATED (LISTINGID, IS_OFFLINE, LASTUPDATED_TIMESTAMP) 
     VALUES (:NEW.LISTINGID, L_ISOFFLINE, LASTUPDATED_TIMESTAMP); 
    END IF; 
END; 
+0

Это не сервис-код письма. Есть ли какой-то конкретный аспект создания триггера, с которым вам нужна помощь? Я уверен, что Oracle тратит много денег на их документацию, и это очень хорошо. Возможно, попробуйте прочитать его - http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm – OldProgrammer

+0

@OldProgrammer: Я поделился с написанным тиражом, пожалуйста, посмотрите на него. –

+0

Что вы имеете в виду, не работает - ошибка времени выполнения или ошибка компиляции? В коде триггера нет «ГДЕ». Пожалуйста, будьте более конкретными. – OldProgrammer

ответ

0

Вы писали:

Нужна привести к приведенной ниже таблице с любым обновлением или новой вставкой из списка таблицы.

Это не то, что делает ваш триггер. Еще раз посмотрим на ваш оператор IF. Это упрощает до:

if ... then 
    ... 
else 
    insert ... 
end if; 

Ваш INSERT находится в предложении ELSE. Поэтому вы должны выполнить INSERT, когда исходный оператор IF равен true. Не любой обновление или новая вставка".

Есть целый ряд других вещей, которые вы можете изменить:

  1. Переменная L_Listingid никогда не используется, удалите ее.

  2. Нет необходимости использовать SELECT INTO ... для назначения переменной. Это может быть сделано следующим образом в блоке декларации:

    lastupdated_timestamp date := sysdate; 
    

    Однако, я не вижу особой необходимости эта переменная существует, так что вы можете удалить его и просто использовать SYSDATE в вашей единственной INSERT.

  3. Нет необходимости выполнять ELSE вообще. Установите значение по умолчанию L_ISOFFLINE как N, а затем используйте это, если условие IF не оценивается как true.

  4. Две косметические изменения, нет необходимости обертывать AND в скобках; Я добавил имя триггера в конец, чтобы оно стало понятным.

Вы имеете вы также написано:

TIMESTAMP COLUMN LastUpdated дата из листинга таблицы.

У вас на самом деле есть дата LASTUPDATED в таблице LISTING, что означает, что вы не следуете своим собственным правилам. Вместо этого вы должны использовать столбец.

Собираем все это вместе, триггер может выглядеть следующим образом:

create or replace trigger listinglast_updated 
    after insert or update 
    on listing 
    for each row 
declare 

    l_isoffline varchar2(1) := 'N'; 

begin 

    if :new.auditpassflag = 'Y' 
     and :new.adminapprovalflag = 'Y' 
     and :new.mgronlineflag = 'Y' 
     and :new.deletedflag is null 
     and :new.suspendedflag != 'Y' then 

     l_isoffline := 'Y'; 

    end if; 

    insert into listing_lastupdated (listingid, is_offline, lastupdated_timestamp) 
    values (:new.listingid, l_isoffline, :new.lastupdated); 

end listinglast_updated; 
+0

Спасибо Бен за ваши комментарии ... Я переписал и удалил ненужную вещь с триггера. Я не использовал LastUpdated из таблицы листинга. Я хотел иметь время и вместе с датой, и я не могу вносить изменения в базовую таблицу. –

+0

Итак, вы просто заменили ': new.lastupdated' на' sysdate', затем @Aryan? – Ben