Oracle SQL установить значение записей таблицы на основе crationdate и зарубежного ключа rententionperiod - PullRequest
0 голосов
/ 27 марта 2020

Для простоты у меня есть 2 таблицы, я изменил имена таблиц и удалил ненужные столбцы:

ТАБЛИЦА A (b_ref, создан, обнаружен)

TABLE B (id, retention_period) )

Я пытаюсь создать процедуру, которая установит значение «A.detected» для каждой записи «A» равным 1, если «A.created» Date старше, чем дни «B.retention_period» .

Основываясь на некоторых уроках и других темах здесь, я сделал это - что даже не компилируется:


 1  CREATE OR REPLACE PROCEDURE DETECT_RETENTION_EXPIRE AS 
 2  BEGIN
 3  UPDATE( 
 4  SELECT b_ref, created , b.id , b.retention_period  
 5  FROM A
 6  INNER JOIN B b 
 7  ON b_ref = b.id 
 8  WHERE created <= (SYSDATE - interval b.retention_period day) 
 9  ) a 
 10 SET a.detected = 1;
 11
 12 END DETECT_RETENTION_EXPIRE;

Компилятор выдает мне следующие ОШИБКИ:

On line 4 - PL/SQL: SQL STATEMENT IGNORED
On line 9 - PL/SQL: ORA_00907: RIGHT BRACKET MISSING

Я не уверен, что я делаю неправильно, вы можете мне помочь?

Заранее спасибо

1 Ответ

2 голосов
/ 27 марта 2020

Вам необходимо использовать interval '1' day или напрямую *b.retention_period, а a.detected должно существовать в следующем предложении SELECT:

CREATE OR REPLACE PROCEDURE DETECT_RETENTION_EXPIRE AS 
   BEGIN
   UPDATE( 
   SELECT b_ref, created , b.id , b.retention_period, a.detected  
   FROM A
   INNER JOIN B b 
   ON b_ref = b.id 
   WHERE created <= (SYSDATE - b.retention_period ) -- or b.retention_period * interval '1' day 
   ) a 
  SET a.detected = 1;

  END DETECT_RETENTION_EXPIRE;
...