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 Google
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?

oraclede中数据定义语言

Oracle:创建存储过程以将另一个存储过程的结果插入表中

使用存储过程中的合并将表 A 中的许多行更新为表 B 中的几行

从sql列中拆分数据并将其保存在sql存储过程中的另一个表中的最有效方法是啥[重复]