2012-04-16 106 views
2

我相信我需要一个光标循环才能通过table test_data的street1列。我有一个程序需要测试表中的每一行。PL/SQL光标for循环

这是我到目前为止有:

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循环例如:

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更喜欢在一个UPDATE语句中完成这一切。

+0

是表有newstreetnumber和newstreetname – user1332821 2012-04-17 06:02:56

2

杰弗里·肯普说,这可以在一个更新众所周知声明来完成:

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”改写为“street1 like'%Cnr%'” – 2012-04-17 07:58:04