Должен ли я запросить из varray или во вложенном курсоре? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть таблица, в которой клиент определит некоторые имена, данные которых он хочет скопировать в другую таблицу. Отметки времени будут скопированы для отслеживания последних данных. В таблице, где данные обычно хранятся, его временная метка разбита на 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, поэтому прошу прощения, если есть очевидный ответ на этот вопрос.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы можете достичь этого с помощью простого запроса:

SELECT
    A.NAME,
    A.ID_NUM,
    B.VALUE,
    B.TIMESTAMP
FROM
    TABLE_A A
    JOIN TABLE_B B ON ( A.NAME = B.NAME );

Cheers !!

1 голос
/ 10 октября 2019

С моей точки зрения, ни один из ваших вариантов не является "лучшим". Вложенные циклы обещают быть медленными.

Почему бы вам просто не объединить эти два стола, например,

select a.id_num, a.name, b.value, b.timestamp
from a join b on a.id_num = b.id_num
where a.name = current_name;

и получить все прямо сейчас, прямо здесь? Если это должен быть PL / SQL, пусть будет так;нет проблем в преобразовании этого в процедуру (или функцию, в зависимости от того, что вы предпочитаете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...