1

老实说,我有点坚持这一点,我找不到一个好的解决方案。根本没有解决办法。

我有这张表 actor(id,Actor_Name) ,其中名称的格式为 Actor-01 .. 等:

id        Actor_Name    
--------------------
01        Actor-01 
02        Actor-02 
03        Actor-03 

我需要的是,使用一个过程将每个演员的名字加一个。像这样:

id        Actor_Name    
--------------------
01        Actor-02 
02        Actor-02 
03        Actor-04 

可能我需要某种迭代,并且我已经尝试过使用游标,但它主要是一场灾难。如果任何人都可以提供一些简洁的解决方案,或者我会非常高兴!

4

7 回答 7

1

以下是一些可能指向可行解决方案的概念。

您可以使用 INSTR 查找减号的位置。

SELECT INSTR('ACTOR-74','-') FROM DUAL

您可以使用 SUBSTR 拉出 DIGITS

SELECT SUBSTR('ACTOR-74', 6) FROM DUAL

您可以使用 TO_NUMBER 将数字转换为数字

SELECT TO_NUMBER('1234') FROM DUAL

您可以使用串联来构建替换值

SELECT SUBSTR('ACTOR-74',1,6) || 
       TO_CHAR(74 + 1, '09') FROM DUAL

这会产生一个可以在更新中使用的值。

UPDATE TABLE
    SET ACTOR_NAME = the-replacement-value
于 2012-12-08T19:20:48.893 回答
1

另一种方法:

update (select id
             , replace( Actor_name
                      , substr(actor_name, -2)
                      , To_char(to_number(substr(actor_name, -2)) + 1, 'fm00')
                      ) as New_Actor_name
             , Actor_name
         from actor
        ) a
set a.actor_name = a.new_actor_name;

SQLFiddle 演示

于 2012-12-08T19:39:45.523 回答
1

无需手续。

merge into actor
using (
  select id, 
         substr(actor_name, 1, instr(actor_name, '-')) as name,
         to_number(substr(actor_name, instr(actor_name, '-') + 1)) as nr
  from actor
) t on (t.id = actor.id)
when matched then update
   set actor_name = t.name || to_char(nr + 1, 'FM09');

SQLFiddle 示例:http ://sqlfiddle.com/#!4/93c02/1

于 2012-12-08T19:32:23.283 回答
1

我认为您不需要光标。我不是 100% 确定所需的格式,但 select CAST(REGEXP_SUBSTR('Actor-01','[[:digit:]]+')as int) from dual;返回 1 之类的东西可以递增和存储(例如UPDATE table1 set col1 = 'Actor-0' || CAST(REGEXP_SUBSTR(col1,'[[:digit:]]+')as int)+1 WHERE ....

于 2012-12-08T19:07:11.917 回答
1

尝试类似(未测试)

update actor set actor_name = 'Actor-' || lpad( to_char( id + 1), 2, '0' );
commit;
于 2012-12-08T19:13:49.850 回答
0

为这样一个简单的任务使用存储过程似乎有点过头了。

update ACTOR
set substr(ACTOR_NAME,1,length(ACTOR_NAME)-2)||to_number(substr(ACTOR_NAME,-2,2))+1
where substr(ACTOR_NAME,-2,2) between '00' and '99'
于 2012-12-08T19:59:16.760 回答
0

您可能已经使用游标关闭了,但可能不知道游标默认为只读。要切换此行为,请使用for update光标定义中的选项:

http://www.techonthenet.com/oracle/cursors/for_update.php (该条款的附加说明for update

然后在遍历游标时,您还需要使用一个子句,该子句允许您更新游标最后获取的记录:where current of

http://www.techonthenet.com/oracle/cursors/current_of.php (“当前的”示例)

这应该适用于匿名 pl/sql 块或存储过程定义。

于 2012-12-10T20:21:47.297 回答