更新 table [PL/SQL 中每一行的一列,unix 脚本]
Update one column of each row in a table [PL/SQL, unix scripting]
我有一个有 12 列的 table:
table1:
1
2
3
4
5
6
7
8
9
10
11
12
abc
1
000
aaa
zzz
2
234
OOO
00001
01
123
214
def
2
023
bbb
yyy
4
345
PPP
00002
02
133
224
ghi
3
011
ccc
xxx
6
456
QQQ
00003
03
143
234
jkl
4
112
ddd
www
8
567
RRR
00004
04
153
244
我想在循环中使用第 3 列数据并从另一个 table 获取 'best match' 数据。
table2:
1
2
3
4
0
777
676
america
00
888
878
england
01
999
989
france
02
666
656
germany
第 3 列数据将在循环中被修剪,直到在 table2 中获取匹配项。
first row:
iter 1: table1 row1 col3=000 -- no match in table
iter 2: table1 row1 col3=00 -- return england, replace table1 row1 col12=214 with 'england'
updated row: abc,1,000,aaa,zzz,2,234,OOO,00001,01,123,england
second row:
iter 1: table1 row2 col3=023 -- no match in table
iter 2: table1 row2 col3=02 -- return germany, replace table1 row1 col12=224 with 'germany'
updated row: def,2,023,bbb,yyy,4,345,PPP,00002,02,133,germany
您需要做的是创建一个过程,然后在该过程中声明一个 cursor 以及一个 variable_c_row cursor_name%ROWTYPE
。
在程序中,这将是内容:
OPEN cursor_name
FETCH cursor_name INTO variable_c_row;
WHILE cursor_name%FOUND LOOP
-- Declare a number variable (i)
i := 0;
-- Declare a varchar variable (match)
match := variable_c_row.col3
WHILE length(match) > 0 LOOP OR l_countryname IS NULL
begin
-- Declare a yourrow%ROWTYPE variable (l_countryname)
SELECT col4 FROM table2 INTO l_countryname WHERE col1 = match;
UPDATE table1 SET col12 = l_countryname;
exception when no_data_found then null;
end;
i := i+1;
match := substr(variable_c_row.cow3, 0, length(match)-i);
END LOOP;
FETCH cursor_name INTO variable_c_row;
END LOOP;
CLOSE cursor_name;
由于问题没有DDL或DML,我能提供的最多是一个广泛的答案,没有经过测试。
我有一个有 12 列的 table:
table1:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|
abc | 1 | 000 | aaa | zzz | 2 | 234 | OOO | 00001 | 01 | 123 | 214 |
def | 2 | 023 | bbb | yyy | 4 | 345 | PPP | 00002 | 02 | 133 | 224 |
ghi | 3 | 011 | ccc | xxx | 6 | 456 | QQQ | 00003 | 03 | 143 | 234 |
jkl | 4 | 112 | ddd | www | 8 | 567 | RRR | 00004 | 04 | 153 | 244 |
我想在循环中使用第 3 列数据并从另一个 table 获取 'best match' 数据。
table2:
1 | 2 | 3 | 4 |
---|---|---|---|
0 | 777 | 676 | america |
00 | 888 | 878 | england |
01 | 999 | 989 | france |
02 | 666 | 656 | germany |
第 3 列数据将在循环中被修剪,直到在 table2 中获取匹配项。
first row:
iter 1: table1 row1 col3=000 -- no match in table
iter 2: table1 row1 col3=00 -- return england, replace table1 row1 col12=214 with 'england'
updated row: abc,1,000,aaa,zzz,2,234,OOO,00001,01,123,england
second row:
iter 1: table1 row2 col3=023 -- no match in table
iter 2: table1 row2 col3=02 -- return germany, replace table1 row1 col12=224 with 'germany'
updated row: def,2,023,bbb,yyy,4,345,PPP,00002,02,133,germany
您需要做的是创建一个过程,然后在该过程中声明一个 cursor 以及一个 variable_c_row cursor_name%ROWTYPE
。
在程序中,这将是内容:
OPEN cursor_name
FETCH cursor_name INTO variable_c_row;
WHILE cursor_name%FOUND LOOP
-- Declare a number variable (i)
i := 0;
-- Declare a varchar variable (match)
match := variable_c_row.col3
WHILE length(match) > 0 LOOP OR l_countryname IS NULL
begin
-- Declare a yourrow%ROWTYPE variable (l_countryname)
SELECT col4 FROM table2 INTO l_countryname WHERE col1 = match;
UPDATE table1 SET col12 = l_countryname;
exception when no_data_found then null;
end;
i := i+1;
match := substr(variable_c_row.cow3, 0, length(match)-i);
END LOOP;
FETCH cursor_name INTO variable_c_row;
END LOOP;
CLOSE cursor_name;
由于问题没有DDL或DML,我能提供的最多是一个广泛的答案,没有经过测试。