2012-04-16 12 views
2

私は、test_dataテーブルからstreet1カラムを通過するためのカーソルが必要だと思います。私はテーブルから各行をテストする必要のあるプログラムを持っています。ループのPL/SQLカーソル

これは私がこれまで持っているものです。

cursor c1 is 
street1 
from test_data 

Begin 
    If Instr(street1, ‘Cnr’, 1) >= 1; 
    Then 
     Newstreetname := Substr(street1, Instr(street1, ‘Cnr’, 1)+3); 
    Else if 
     Instr(street1, ‘PO Box’, 1) >= 1; 
    Then 
     Newstreetname:= Substr(street1, Instr(street1, ‘PO Box’, 1)); 
    Else if 
     REGEXP_ Instr (street1, [\d], 1) = 0; 
    Then 
     Newstreetname:= street1; 
    Else if 
     REGEXP_ Instr (street1, [\d], 1) >= 1; 
    Then 
     Newstreetnumber:= regexp_substr(street1, '\d+(\s|\/)(\d+)?-?(\d+)?(\w {1})?'); 
     Newstreetname:= regexp_substr(street1, '(\w+\s\w+)$'); 
End 

答えて

8

* 1。カーソル定義にSELECTとセミコロンが必要です

* 2あなたは、例えば、カーソル

上FOR LOOPを追加することができます。

DECLARE 
     cursor c1 is 
     SELECT street1 
     from test_data; 
     r1 c1%ROWTYPE; 
    BEGIN 
     FOR r1 IN c1 LOOP 
     ... do your stuff with r1.street1 
     END LOOP; 
    END; 

あなたは、その代わりに、

FOR r1 IN (SELECT street1 FROM test_data) LOOP 
    ... do your stuff with r1.street1 
END LOOP; 

* 3:完全例えばを明示カーソルの定義を回避することができます。 IF文にセミコロンを含めることはできません。例:

If 
    Instr(r1.street1, 'Cnr', 1) >= 1 
    Then 

* 4 [編集]あなたは更新したいあなたのテーブル、カラムnewstreetnumbernewstreetname - あなたはこのような何か行うことができ、その場合には:

DECLARE 
     cursor c1 is 
     SELECT street1 
     from test_data 
     FOR UPDATE; 
     r1 c1%ROWTYPE; 
    BEGIN 
     FOR r1 IN c1 LOOP 
     ... do your stuff with r1.street1 
     UPDATE test_data 
     SET newstreetnumber = ... 
      ,newstreetname = ... 
     WHERE CURRENT OF c1; 
     END LOOP; 
    END; 

ただしを、これは大容量のためにうまく機能しないだろう、と私は」というdは1つのUPDATEステートメントですべてを実行することをお勧めします。

+0

はい表では、これが道であるnewstreetnumberとnewstreetname – user1332821

2

ジェフリー・ケンプが、これは1つの更新statemantで行うことができます言ったように:

UPDATE test_data 
    SET newstreetname = CASE WHEN Instr(street1, ‘Cnr’, 1) >= 1 
          THEN Substr(street1, Instr(street1, ‘Cnr’, 1)+3) 
          WHEN Instr(street1, ‘PO Box’, 1) >= 1 
          THEN Substr(street1, Instr(street1, ‘PO Box’, 1)) 
          WHEN REGEXP_Instr (street1, '[\d]', 1) = 0 
          THEN street1 
          WHEN REGEXP_Instr (street1, '[\d]', 1) >= 1 
          THEN regexp_substr(street1, '(\w+\s\w+)$') 
         END, 
     newstreetnumber = CASE WHEN ..... 
         END; 
+2

1を持っています。私は "instr(street1、 'Cnr'、1)> = 1"を "%Cnr% 'のような" street1 "として書き直していますが –

関連する問題