我想知道如何創建一個 oracle 程序來找出整個表中的不同記錄并通過更新另一列的值插入到同一個表中假設表名是 temp,下面是表的結構
| id | address | key |ver_id
| 1 | 242 Street | 123 | 1
| 2 | 242 Street | 123 |2
| 3 | 242 Street | 123 |3
| 4 | 242 Long St | 456 |4
因此,如何撰寫一個 oracle 程式來從上述列的前 3 行中選擇 1 條記錄,這些記錄是重復的,并通過將 ver_id 更新為 -1 將不同的記錄插入到表的末尾,如下所示:
| id | address | key |ver_id**
| 1 | 242 Street | 123 | 1
| 2 | 242 Street | 123 |2
| 3 | 242 Street | 123 |3
| 4 | 242 Long St | 456 |4
| 5 | 242 Street | 123 |-1
我試圖撰寫簡單的程式來從表中找出重復項
create or replace PROCEDURE demo (
key1 IN VARCHAR2
) AS
CURSOR c_temp IS
SELECT
*
FROM
temp
WHERE
key = key1;
r_temp c_temp%ROWTYPE;
BEGIN
OPEN c_temp;
LOOP
FETCH c_temp INTO r_temp;
EXIT WHEN c_temp%notfound;
dbms_output.put_line('id: '
|| r_temp.id
|| ' address: '
|| r_temp.address);
END LOOP;
CLOSE c_temp ;
END;
但是上面的程序只是獲取具有重復記錄的記錄,但是我需要幫助來撰寫從重復中選擇不同記錄并插入到同一個表中的程序,其中不同的ver_id為-1
uj5u.com熱心網友回復:
你沒有說idcolumn 應該如何獲得它的值,所以我只是創建了一個序列。
這是樣本資料:
SQL> select * from temp order by id;
ID ADDRESS KEY VER_ID
---------- ----------- ---------- ----------
1 242 street 123 1
2 242 street 123 2
3 242 street 123 3
4 242 long st 456 4
SQL> create sequence seq_temp start with 5;
Sequence created.
你不需要 PL/SQL 程式來做你正在做的事情;一條 SQL 陳述句就足夠了:
dataCTE 發現重復項(它們的rn值大于 1)data2獲取不同的行。為什么?因為您不能將序列與distinct- final
select組成應該插入的值
所以:
SQL> insert into temp (id, address, key, ver_id)
2 with data as
3 (select t.*,
4 row_number() over (partition by address, key order by id) rn
5 from temp t
6 ),
7 data2 as
8 (select distinct d.address, d.key
9 from data d
10 where d.rn > 1
11 )
12 select seq_temp.nextval, address, key, -1
13 From data2;
1 row created.
結果:
SQL> select * from temp order by id;
ID ADDRESS KEY VER_ID
---------- ----------- ---------- ----------
1 242 street 123 1
2 242 street 123 2
3 242 street 123 3
4 242 long st 456 4
5 242 street 123 -1 --> here it is
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/525385.html
標籤:甲骨文程序
下一篇:區間值之和oracle
