用于循环的PL/SQL游标

use*_*821 2 oracle plsql for-loop cursor

我相信我需要一个游标for循环来遍历表test_data中的street1列.我有一个程序需要测试表中的每一行.

这是我到目前为止:

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
Run Code Online (Sandbox Code Playgroud)

Jef*_*emp 9

*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;
Run Code Online (Sandbox Code Playgroud)

或者,您可以完全避免显式游标定义,例如:

FOR r1 IN (SELECT street1 FROM test_data) LOOP
   ... do your stuff with r1.street1
END LOOP;
Run Code Online (Sandbox Code Playgroud)

*3.您的IF语句不能包含分号 - 例如:

    If
    Instr(r1.street1, 'Cnr', 1) >= 1
    Then
Run Code Online (Sandbox Code Playgroud)

*4.[edit]所以你想要更新你的表,列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;
Run Code Online (Sandbox Code Playgroud)

但请注意,这对于大卷来说效果不佳,我宁愿在一个UPDATE语句中完成所有操作.