У меня есть таблица, в которой клиент определит некоторые имена, данные которых он хочет скопировать в другую таблицу. Отметки времени будут скопированы для отслеживания последних данных. В таблице, где данные обычно хранятся, его временная метка разбита на day_part и time_part, которые оба являются RAW (3);
Это мои таблицы:
table_A
name VARCHAR2(1000)
таблица_B
name VARCHAR2(1000)
id_num INT
таблица_C
id_num INT
day_part RAW(3)
time_part RAW(3)
value NUMBER(20,5)
таблица_D
name VARCHAR2(1000)
time_stamp TIMESTAMP
Отметка времени в table_D создается функцией с входными данными day_part и time_part.
Я хочу скопировать данные из table_C, основываясь на именах в table_A и самой последней отметке времени в table_D,Это часть огромной системы, поэтому я не могу изменить две RAW на одну временную метку, это вызовет множество проблем.
Мое текущее решение - сначала открыть курсор, чтобы найти заданный id_numname в table_A, используя
SELECT table_B.name, table_B.id_num
FROM table_A
INNER JOIN table_B
ON table_B.name = table_A.name;
Имя и id_num извлекаются в переменные (current_name, current_id) для поиска данных во втором курсоре, внутри первого. Перед открытием второго курсора я преобразую метку времени в RAW:
SELECT MAX(time_stamp)
INTO stamp_variable
FROM table_D
WHERE name = current_name;
stampToRaw(last_dPart, last_tPart, stamp_variable);
Теперь открывается второй курсор, который выполняет запрос:
SELECT value, day_part, time_part
FROM table_C
WHERE id_num = current_id
AND ((day_part = lastdPart AND time_part > last_tPart)
OR day_part > last_dPart);
Если найдены новые данные, этокопируется в другую таблицу, и ее временная метка сохраняется в table_D, которая будет использоваться при следующем запуске. Есть ли более эффективный способ сделать это, чего я не вижу? Я не привык к мышлению PL / SQL, поэтому прошу прощения, если есть очевидный ответ на этот вопрос.