Oracle过程增加字符串数据类型并将其存储为表中的列之一
Posted
技术标签:
【中文标题】Oracle过程增加字符串数据类型并将其存储为表中的列之一【英文标题】:Oracle procedure to increment string data type and store it as one of the column in table 【发布时间】:2021-09-07 06:11:15 【问题描述】:我需要从表 A 中获取以 AB 开头的列 id 的最大值 我有一个表 B,我需要更新表 B 中所有行的列值最大值 +1。
例如,如果我从表 A 中获得最大值为 AB1500,并且表 B 有 20 条记录和各种列,我需要为表 B 中的 ORG_ID 列的记录填充 AB1501 到 AB1520。 问题:For 循环无法将数据写入 TABLE B
表 A:
ORG_ID | ORG_NAME |
---|---|
AE500 | |
AB1500 | Amazon |
AB1200 | Apple |
表 B:这里对于可用记录,我需要从表 A 中 AB 的最大值递增
Country | Country_ID | ORG_ID |
---|---|---|
US | 10 | AB1501 |
UK | 11 | AB1502 |
FRANCE | 12 | AB1503 |
Create or replace procedure proc_incr(
v_org_id IN TableB.org_id%TYPE
)
v_max_number NUMBER;
v_max_org_id VARCHAR2(20);
v_max_var VARCHAR2(20);
v_temp VARCHAR2(20);
v_count NUMBER;
begin
select max(Table A.org_id)
into v_max_org_id
from TableA where org_id like 'AB%';
select count(*)
into v_count
from Table B;
select regexp_substr(v_max_org_id, '\d+')
into v_max_number
from dual;
select regexp_substr(v_max_org_id, '\D+')
into v_max_var
from dual;
// For Loop to write data to Table B
for i in 1 .. (v_count) LOOP
v_temp := v_max_number+i;
v_max_org_id := v_max_var||v_temp;
v_org_id := v_max_org_id;
End LOOP;
commit;
END proc_incr;
【问题讨论】:
但是您没有在代码中将数据写入表 B。这个语句的含义是什么:“For循环无法将数据写入TABLE B”?它有什么问题? 嗨@astentx,我正在尝试将表 B 中存在的 20 条记录的数据从 AB1501 写入 AB1520,但无法通过 for 循环实现。非常感谢任何帮助。 请添加您的示例数据。 (不是图片) 您的输入是什么,您的预期输出是什么?您的table_b
值似乎已经增加了 1,这是您的预期输出吗?如果是这样,你从什么开始?如果它是您的起始数据,那么您期望输出是什么?
另外,您可能不想使用MAX(org_id)
,因为它是一个字符串,并且在您进行字符串比较时AB900
大于AB1500
。
【参考方案1】:
样本数据:
SQL> SELECT * FROM tablea;
ORG_ID
------
AB1500
CD1234
SQL> SELECT * FROM tableb;
ORG_ID NAME
------ ------
xxxxxx Little
Foot
Mahe
您的代码,稍作修正;您没有执行任何更新,所以我认为这就是您遇到“问题”的原因
For 循环无法将数据写入 TABLE B
注意tableb
表的光标;它用于更新它获取的当前行。
SQL> DECLARE
2 v_max_number NUMBER;
3 v_max_org_id VARCHAR2 (20);
4 v_max_var VARCHAR2 (20);
5
6 CURSOR curb IS
7 SELECT org_id, name
8 FROM tableb
9 FOR UPDATE;
10
11 cbr curb%ROWTYPE;
12 i NUMBER := 1;
13 BEGIN
14 SELECT MAX (tablea.org_id)
15 INTO v_max_org_id
16 FROM tablea
17 WHERE org_id LIKE 'AB%';
18
19 SELECT REGEXP_SUBSTR (v_max_org_id, '\d+') INTO v_max_number FROM DUAL;
20
21 SELECT REGEXP_SUBSTR (v_max_org_id, '\D+') INTO v_max_var FROM DUAL;
22
23 -- For Loop to write data to Table B
24 OPEN curb;
25
26 LOOP
27 FETCH curb INTO cbr;
28
29 EXIT WHEN curb%NOTFOUND;
30
31 v_max_org_id := v_max_var || TO_CHAR (v_max_number + i);
32
33 UPDATE tableb
34 SET org_id = v_max_org_id
35 WHERE CURRENT OF curb;
36
37 i := i + 1;
38 END LOOP;
39 END;
40 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM tableb;
ORG_ID NAME
------ ------
AB1501 Little
AB1502 Foot
AB1503 Mahe
SQL>
【讨论】:
您好需要您的帮助,选择查询是否 SELECT MAX (tablea.org_id) INTO v_max_org_id FROM tablea WHERE org_id LIKE 'AB%';总是获取以 AB 开头的最大值 我不这么认为。以上是关于Oracle过程增加字符串数据类型并将其存储为表中的列之一的主要内容,如果未能解决你的问题,请参考以下文章
雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值
如何将格式化文本存储在 oracle 表中并将其加载回 json?