plsql для извлечения максимальной строки последовательности для каждого заголовка и обновления нулевых значений столбца следующим порядковым номером для конкретного заголовка - PullRequest
0 голосов
/ 01 июня 2018

У меня есть требование, как показано ниже.У меня есть таблица с 2 столбцами, (contract_id, line_num)

create table tx (contract_id number,line_num number);

У меня есть данные типа

contract_id  ||   line_num
-----------      ---------
 1           ||      1
 1           ||      null
 1           ||      null
 2           ||       1
 2           ||      null
 2           ||      null
 3           ||      1
 3           ||      null

Я должен написать блок plsql, сначала я должен получить max(line_num) для каждого contract_id, а затем обновите следующий порядковый номер для каждого contract_id, где всегда есть ноль в столбце line_num для каждого contract_id, используя курсор для цикла.

Я должен получить, как показано ниже

contract_id    ||     line_num
-----------          ---------
   1           ||      1
   1           ||      2
   1           ||      3
   2           ||      1
   2           ||      2
   2           ||      3
   3           ||      1
   3           ||      2 

Можете ли вы помочь мне с этим ...

DECLARE
    var1   NUMBER := 0;
BEGIN
    SELECT MAX (gocpd.column46)
      INTO var1
      FROM gecm_okc_con_part_details gocpd, okc_rep_contracts_all orca
     WHERE     gocpd.contract_id = orca.contract_id
           AND orca.attribute12 = 'GE-Power' --AND GOCPD.COLUMN46 = NULL AND GOCPD.CONTRACT_ID = 525215; END
                                            ;

    BEGIN
        UPDATE GECM_OKC_CON_PART_DETAILS GOCPD
           SET GOCPD.COLUMN46 = var1 + 1
          FROM okc_rep_contracts_all orca
         WHERE     gocpd.contract_id = orca.contract_id
               AND orca.attribute12 = 'GE-Power'
               AND gocpd.column46 = NULL
               AND gocpd.contract_id = 525215;

        COMMIT;
    END;
END;

1 Ответ

0 голосов
/ 01 июня 2018

Вы не предоставили достаточно информации, которую я запросил, и я не могу соотнести ваш код PL / SQL с предоставленными вами данными.

Я предполагаю, что вам просто интересно обновить строки на основе значений NULL, а затем увеличить их с MAX(LINE_NUM).Если да, что-то вроде этого должно решить вашу цель.Если нет, пожалуйста, добавьте больше деталей в ваш вопрос.

MERGE INTO tx tgt USING (
    SELECT
        ROWID,
        contract_id,
        CASE
                WHEN line_num IS NULL THEN ROW_NUMBER() OVER(
                    PARTITION BY contract_id
                    ORDER BY
                        contract_id
                ) + MAX(line_num) OVER(
                    PARTITION BY contract_id
                ) - 1
                ELSE line_num
            END
        AS line_num
    FROM
        tx
)
src ON ( src.rowid = tgt.rowid )
WHEN MATCHED THEN UPDATE SET tgt.line_num = src.line_num;

Демонстрация SQL Fiddle

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