Рекурсивное обновление строк таблицы на основе выбора из ALL_TABLES в Oracle SQL - PullRequest
0 голосов
/ 16 октября 2019

У меня есть таблица, которая содержит table_name и значение столбца ID всех таблиц в схеме, и я хочу установить значение в соответствии с максимальным значением столбца ID в каждой таблице.

Пока у меня естьфункция для получения max (id) из таблицы:

create or replace function get_max_id ( t_name in varchar2 )
return number as max_id number default null;
begin 
execute immediate 
    'select max(id) from ' || t_name into max_id;
return max_id;
end;

И следующий выбор возвращает мне все имена таблиц и значения max (id):

select TABLE_NAME, GET_MAX_ID( owner || '.' || table_name ) max_id
from ALL_TABLES at
where owner = 'SCHEMA_NAME'
and at.TABLE_NAME in (
    select eks.NAME from SCHEMA_NAME.ENTITY_KEYS eks
)

Но яизо всех сил пытается обновить ENTITY_KEYS таблицу со значением max_id.

Это не работает, очевидно (получение single row subquery returns more than one row):

update SCHEMA_NAME.ENTITY_KEYS eks
set eks.CUR_VALUE = (
    select GET_MAX_ID( owner || '.' || table_name ) max_id
    from ALL_TABLES t
    where owner = 'SCHEMA_NAME'
    and eks.NAME in (
        select name from SCHEMA_NAME.ENTITY_KEYS
        where NAME = t.TABLE_NAME
    )
)
;

Как я могу изменить вышеуказанный оператор обновления для обновлениякаждая строка рекурсивно или обновить выбор, чтобы вернуть только одну строку?

Пробовал с объединением и естественно получал ту же ошибку:

update SCHEMA_NAME.ENTITY_KEYS
set CUR_VALUE = (
    select GET_MAX_ID( owner || '.' || table_name )
    from SCHEMA_NAME.ENTITY_KEYs eks
    inner join ALL_TABLES t on t.TABLE_NAME = eks.NAME
    where t.owner = 'SCHEMA_NAME'
)
;

1 Ответ

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

Вы можете просто использовать функцию direct в операторе таблицы обновления:

UPDATE SCHEMA_NAME.ENTITY_KEYS EKS
SET
    EKS.CUR_VALUE = GET_MAX_ID('SCHEMA_NAME'
                               || '.'
                               || EKS.NAME)
WHERE
    EXISTS (
        SELECT
            1
        FROM
            ALL_TABLES T
        WHERE
            T.TABLE_NAME = EKS.NAME
            AND T.OWNER = 'SCHEMA_NAME'
    );

Cheers !!

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