Есть ли причина, по которой эта процедура не обновляет мою таблицу? - PullRequest
0 голосов
/ 14 октября 2019

Следующий код должен выполнять следующие действия: 1: читать текстовый файл 2: печатать его в CSV-файл;3: обновить мою таблицу «CATEGORY2» в моей базе данных

Это не обновляет таблицу так, как я хочу. Это правильный способ сделать это? Является ли заявление об обновлении правильной для использования в этой процедуре дозой, это должен быть INSERT INTO.

DROP Sequence Seed_ID;
Create Sequence Seed_ID INCREMENT BY 1 Start with 1;

DECLARE 
  fw UTL_FILE.FILE_TYPE; 
  fr UTL_FILE.FILE_TYPE;
  textOut Varchar2(2000); ----Store All txt file
  Seed_word Varchar2(2000); -----Seed words store
  i number; -----Incramenter for Category ID
  match_var VARCHAR(255); ---Use to mathc the category with seed words
  mvi number; -- match var incramenter
BEGIN
  fr := UTL_FILE.FOPEN('FILE_READ_WRITE', 'seed.txt', 'r');
  fw := UTL_FILE.FOPEN('FILE_READ_WRITE', 'seed2.csv', 'w');
  LOOP
    BEGIN
      i :=1;
      mvi := 1;
      UTL_FILE.GET_LINE(fr,textOut);
      match_var := REGEXP_SUBSTR (textOut, '[^,]+' ,1,1); --- gets first word in each line   
      UPDATE Category2  ---Should this insert the values int the Category tablE??????????
      SET Category_ID= mvi, Category_name= textout
      WHERE mvi = CATEGORY_ID;
      mvi :=  mvi+1;  
      WHILE TRUE LOOP
        BEGIN
          Seed_word := REGEXP_SUBSTR (textOut, '[^,]+' ,1,i+1);
          i := i+1;
          EXIT WHEN seed_word IS NULL;
          UTL_FILE.PUT_LINE(fw,Seed_ID.nextval ||','||Seed_word||','||mvi);
        END;
      END LOOP;
    END;
  END LOOP;    
EXCEPTION  
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
    UTL_FILE.FCLOSE(fr);
    UTL_FILE.FCLOSE(fw);
END;

В настоящее время я не получаю никаких ошибок, но вообще не обновляю свою таблицу. Это чтение файла TXT и запись его в файл CSV, просто не требуется обновление таблицы. с информацией.

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Оператор UPDATE, который находит нулевые записи, соответствующие критериям, не будет рассматриваться как сбой, поэтому PL / SQL продолжит работу без ошибок, даже если записи не были обновлены.

  UPDATE Category2  ---Should this insert the values int the Category tablE??????????
  SET Category_ID= mvi, Category_name= textout
  WHERE mvi = CATEGORY_ID;

Ваш код инициализируетсяmvi до 1, а затем увеличивается при каждом выполнении цикла. Эта логика предполагает, что category_id начинается от 1 для первой строки в файле до максимального идентификатора, соответствующего последней строке в файле. Если это действительно так, то это нормально;но я бы проверил, какие записи находятся в таблице category2, и проверил, действительно ли значения category_id соответствуют вашим ожиданиям.

Как указал Рустам, ваше ОБНОВЛЕНИЕ также без необходимости обновляет category_id=mvi, что неничего полезного (поскольку предложение where уже определило, что они уже идентичны).

0 голосов
/ 16 октября 2019

Возможно, ваш ответ уже встроен в скрипт:

UPDATE Category2  ---Should this insert the values int the Category tablE??????????

Это означает, что вы ожидаете, что строки, которые не существуют, будут вставлены, но это не так. Ну, ответ на этот вопрос - НЕТ. Как указано, обновление, которое воздействует на 0 строк, не считается ошибкой, но также не является указанием на то, что строка должна быть создана. Если это действительно тот функциональный элемент, который вы ищете, тогда вам нужно использовать оператор Merge вместо update.

Merge into Category2 c2
  using (select mvi, textout from dual) m
     on (m.mvi = c2.category_id)
  when matched then
          set c2.category_name = m.testout
  when not matched then 
       insert (category_id, category_name)
       values (m.mvi, m.textout);

С этим вы получите свою вставку, если запрошенный category_id не завершится. Тем не менее, я согласен с @JeffreyKemp в отношении предполагаемой логики, она кажется немного основанной на сомнительных предположениях. также для полного ответа вам необходимо предоставить тестовые данные в виде отформатированного текста и ожидаемый результат для этих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...