объявить и вызвать переменную в триггере в оракуле - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь объявить переменную и получить доступ к ней снова, чтобы обновить ту же таблицу для определенного идентификатора. (Обновление STATUS с 'E' до 'R')

create or replace trigger resume_trgr
before update on temp_jobs

DECLARE
job_status varchar(2);

begin
  select STATUS into :job_status from temp_jobs where id=6120;
  if :job_status='E'
  then
    update temp_jobs set STATUS='R' where id=6120;
  end if;
end;
/

Но возвращается ошибкапри выполнении вышеуказанного кода.Код ошибки ниже:

Триггер резюме_trgr скомпилировано

 Errors: check compiler log

 Error(5,27): PLS-00049: bad bind variable 'STATUS'

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

В вопросе, который вы сказали, что ошибка относится к STATUS, но это не соответствует вашему опубликованному коду Вы должны получить две ошибки, относящиеся к JOB_STATUS.

Это потому, что она определяется каклокальная переменная, и вы пытаетесь ссылаться на нее как на переменную связывания.У него не должно быть префикса двоеточия;так что это компилирует:

create or replace trigger resume_trgr
before update on temp_jobs
declare
  job_status temp_jobs.status%type;
begin
  select STATUS into job_status from temp_jobs where id=6120;
  if job_status='E'
  then
    update temp_jobs set STATUS='R' where id=6120;
  end if;
end;
/

, как это делает, что полностью пропускает переменную:

create or replace trigger resume_trgr
before update on temp_jobs
begin
  update temp_jobs set STATUS='R' where id=6120 and status = 'E';
end;
/

Является ли это полезной, действительной или разумной вещью, которую нужно делать внутри триггера, это другой вопрос,Это похоже на отдельное обновление, которое вы должны выполнить вручную перед «настоящим» обновлением, возможно, в процедуре - если вы действительно хотите всегда обновлять строку для этого конкретного идентификатора, независимо от того, что еще вы действительно делаете в своем «реальном» (Триггер) обновление.

Если то, что вы действительно пытаетесь сделать, это убедиться, что статус меняется на R, даже если вызывающий не делает этого явно, то вам, вероятно, нужен триггер уровня строки, который устанавливаетзначение псевдороу, а не триггер уровня оператора с жестко заданным идентификатором.

0 голосов
/ 22 октября 2018

Ошибка, которую вы получили, это ... ну странно.Несколько комментариев:

  • В вашем коде нет переменной STATUS.
  • При выборе переменной вам не нужно двоеточие (т.е. это не into :job_statusно into job_status).
  • Вы должны использовать VARCHAR2 тип данных, а не VARCHAR.
  • Вероятно, это должен быть триггер на уровне строк (так что вы пропустите FOR EACH ROW) и, как только вы все исправите, вы увидите ошибку таблицы мутаций
  • Почему вы указали идентификатор?Это действительно будет делать что-то только для этого идентификатора?

Что вы можете сделать, это: во-первых, тестовый пример:

SQL> create table temp_jobs
  2    (id number,
  3     status varchar2(10));

Table created.

SQL> insert into temp_jobs values (1, 'E');

1 row created.

SQL> insert into temp_jobs values (6120, 'E');

1 row created.

SQL> select * from temp_jobs;

        ID STATUS
---------- ----------
         1 E
      6120 E

Триггер:обратите внимание на различия между вашим и моим кодом.

SQL> create or replace trigger resume_trgr
  2    before update on temp_jobs
  3    for each row
  4  DECLARE
  5    JOB_STATUS VARCHAR2(2);
  6  begin
  7    :new.status := case when :old.status = 'E' then 'R'
  8                        else :new.status
  9                   end;
 10  end;
 11  /

Trigger created.

Тестирование:

SQL> update temp_jobs set status = 'Y' where id = 6120;

1 row updated.

SQL> select * from temp_jobs;

        ID STATUS
---------- ----------
         1 E
      6120 R

SQL> update temp_jobs set status = 'Y' where id = 6120;

1 row updated.

SQL> select * from temp_jobs;

        ID STATUS
---------- ----------
         1 E
      6120 Y

SQL>
...