我有如下要求。 我有一个包含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;
答案 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;