1

正直なところ、私はこれに少し固執しており、良い解決策を見つけることができません。解決策はまったくありません。

名前がActor-01 ..などの形式になっているこのテーブルactor(id,Actor_Name)があります。

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

私が必要としているのは、プロシージャを使用して、これらのアクターの名前を 1 つずつ増やすことです。このような:

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

おそらく、ある種の反復が必要であり、カーソルを少し試しましたが、ほとんどが惨事です。誰かがきちんとした解決策、または何かを提供できれば、私は本当に幸せです!

4

7 に答える 7

1

次のようなものを試してください(テストされていません)

update actor set actor_name = 'Actor-' || lpad( to_char( id + 1), 2, '0' );
commit;
于 2012-12-08T19:13:49.850 に答える
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

実行可能なソリューションを示す可能性のあるいくつかの概念を次に示します。

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

手続きは不要です。

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

別のアプローチ:

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 に答える
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 に答える
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 に答える