Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вставка переменной в строку  [new]
Bastist29
Member

Откуда:
Сообщений: 24
Не получается вставить переменную в строку

CREATE OR REPLACE TRIGGER trig_obn_audit AFTER UPDATE OR DELETE OR INSERT ON ZP_STUDENTS FOR EACH ROW
BEGIN
  DECLARE
  b ZP_AUDIT.IZM_TYPE%TYPE;
    BEGIN
      if updating THEN b:='обновление';
      ELSIF deleting THEN b:='удаление';
      ELSIF inserting THEN b:='вставка';
      END IF;
    END;

  IF :NEW.TABN<>:OLD.TABN THEN 
      INSERT INTO ZP_AUDIT (
      KOD, ST_TABN, N_TABN, IZM_TYPE, IZM_BY, DATAIZM
      )
      VALUES (trig_seq.NEXTVAL, :OLD.TABN, :NEW.TABN, b, USER, SYSDATE); 
  END IF;
END;


SQL.sql: Ошибка: (16,55): PL/SQL: ORA-00984: column not allowed here
SQL.sql: Ошибка: (13,7): PL/SQL: SQL Statement ignored
5 май 17, 19:54    [20461809]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
end за end if
Guest
Bastist29,

Переменная b.
5 май 17, 21:07    [20461909]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
Eсли ты уберешь этот совершенно ненужный вложенный блок триггер скомпилируется но работать будет не так как ты ожидаешь. :OLD при INSERT всегда NULL так-же как и :NEW при DELETE. Так-что INSERT INTO ZP_AUDIT будет только при UPDATE и то при условии что :OLD и :NEW IS NOT NULL.

SY.

Сообщение было отредактировано: 5 май 17, 22:36
5 май 17, 22:30    [20461998]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Bastist29
Member

Откуда:
Сообщений: 24
SY,

дак я не против NULL, там же напротив будет указано "вставка" или "удаление" и будет ясно. Я одного не понимаю, почему я не могу вставить текст в переменную и вывести его в строку, вот и всё.
6 май 17, 00:51    [20462065]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Bastist29
Member

Откуда:
Сообщений: 24
SY,

Oracle не дает засунуть текст "вставка", "удаление", "обновление" в переменную b. И я не знаю почему.
6 май 17, 00:52    [20462068]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7421
Bastist29,

Убирай переменные из триггера.

if updating THEN :NEW.IZM_TYPE:='обновление';
      ELSIF deleting THEN :NEW.IZM_TYPE:='удаление';
      ELSIF inserting THEN :NEW.IZM_TYPE:='вставка';
END IF;

  IF :NEW.TABN<>:OLD.TABN THEN 
      INSERT INTO ZP_AUDIT (
      KOD, ST_TABN, N_TABN, IZM_TYPE, IZM_BY, DATAIZM
      )
      VALUES (trig_seq.NEXTVAL, :OLD.TABN, :NEW.TABN, :NEW.IZM_TYPE, USER, SYSDATE); 
  END IF;
6 май 17, 01:29    [20462083]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
Relic Hunter
Убирай переменные из триггера.


Ну скомпилировался триггер. Аудита на INSERT и DELETE все равно не будет (да и с UPDATE возможно тоже не всегда). У TC,исходя из "дак я не против NULL, там же напротив будет указано "вставка" или "удаление" и будет ясно" с NULL тоже напряженка.

SY.

Сообщение было отредактировано: 6 май 17, 03:59
6 май 17, 03:51    [20462139]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Bastist29
Member

Откуда:
Сообщений: 24
SY,

блин..проверил, всё так. И как решить эту проблему?
6 май 17, 12:40    [20462384]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Bastist29
Member

Откуда:
Сообщений: 24
Решил проблему так, вроде работает

CREATE OR REPLACE TRIGGER trig_obn_audit AFTER UPDATE OR DELETE OR INSERT ON ZP_STUDENTS FOR EACH ROW
BEGIN
        if updating THEN INSERT INTO ZP_AUDIT (
  KOD, ST_TABN, N_TABN, IZM_TYPE, IZM_BY, DATAIZM
)
VALUES (trig_seq.NEXTVAL, :NEW.TABN, :OLD.TABN, 'обновление', USER, SYSDATE);
        ELSIF deleting THEN INSERT INTO ZP_AUDIT (
  KOD, ST_TABN, N_TABN, IZM_TYPE, IZM_BY, DATAIZM
)
VALUES (trig_seq.NEXTVAL,:OLD.TABN , NULL, 'удаление', USER, SYSDATE);
        ELSIF inserting THEN INSERT INTO ZP_AUDIT (
  KOD, ST_TABN, N_TABN, IZM_TYPE, IZM_BY, DATAIZM
)
VALUES (trig_seq.NEXTVAL, NULL, :NEW.TABN, 'вставка', USER, SYSDATE);
        END IF;
END;
Bastist29
SY,

блин..проверил, всё так. И как решить эту проблему?
6 май 17, 12:53    [20462396]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Гхостик
Guest
Bastist29
Я одного не понимаю, почему я не могу вставить текст в переменную и вывести его в строку, вот и всё.
Ты пытаешься использовать переменную b вне того блока в котором она объявлена, а там её уже не видно.
6 май 17, 13:28    [20462442]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
Bastist29
И как решить эту проблему?


CREATE OR REPLACE
  TRIGGER TRIG_OBN_AUDIT
    AFTER UPDATE
       OR DELETE
       OR INSERT
    ON ZP_STUDENTS
    FOR EACH ROW
    BEGIN
        IF INSERTING
          THEN
            INSERT
               INTO ZP_AUDIT
               VALUES(TRIG_DEQ.NEXTVAL,NULL,:NEW.TABN,'вставка',USER,SYSDATE);
        ELSIF DELETING
          THEN
            INSERT
               INTO ZP_AUDIT
               VALUES(TRIG_DEQ.NEXTVAL,:OLD.TABN,NULL,'удаление',USER,SYSDATE);
        ELSIF NOT (:OLD.TABN = :NEW.TABN OR NVL(:OLD.TABN,:NEW.TABN) IS NULL)
          THEN
            INSERT
               INTO ZP_AUDIT
               VALUES(TRIG_DEQ.NEXTVAL,:OLD.TABN,:NEW.TABN,'обновление',USER,SYSDATE);
        END IF;
END;
/


SY.

Сообщение было отредактировано: 6 май 17, 14:53
6 май 17, 14:46    [20462477]     Ответить | Цитировать Сообщить модератору
 Re: Вставка переменной в строку  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18482
2 раза ответ дан, а SY (ну и Relic Hunter) все разминаются перед Днем победы
9 май 17, 13:03    [20466376]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить