plsql为每个标头获取最大序列行,并使用特定标头的下一个序列号更新该列的空值

时间:2018-06-01 03:00:42

标签: oracle plsql

我有如下要求。 我有一个包含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块,首先我必须为每个contract_id获取max(line_num),然后使用cursor为每个contract_id更新每个contract_id的下一个序列号,其中line_num列中为null环。

我应该如下所示

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 :(得分:0)

您没有提供我要求的足够详细信息,我无法将您的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 Demo