Вопрос по – PL / SQL курсор для цикла

2

Я считаю, что мне нужен курсор для цикла, чтобы пройти через столбец street1 из таблицы test_data. У меня есть программа, которая должна проверить каждую строку таблицы.

Это то, что я до сих пор:

<code>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
</code>

Ваш Ответ

2   ответа
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;
Error: User Rate Limit Exceeded
9

* 1.

* 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. [править], так что вы хотите обновить таблицу, столбцыnewstreetnumber а такжеnewstreetname - в этом случае вы могли бы сделать что-то вроде этого:

    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;

Однако обратите внимание, что это не будет работать хорошо для больших объемов, и я предпочел бы сделать все это в одном операторе UPDATE.

Error: User Rate Limit Exceeded user1332821

Похожие вопросы