Разбор строки в PL/SQL и вставка значений в базу данных с помощью веб-службы RESTful

Я читаю значения, которые хочу вставить в базу данных. Я читаю их по строчкам. Одна строка примерно такая:

String line = "6, Ljubljana, Slovenija, 28";

Веб-сервис должен разделять значения запятыми и вставлять их в базу данных. На языке PL/SQL. Как я могу это сделать?


person Wolf    schedule 08.07.2015    source источник
comment
Откуда вы читаете эти строки? Доступны ли они все сразу или они приходят откуда-то один за другим?   -  person Nick Krasnov    schedule 08.07.2015
comment
Я читаю их с ftp-сервера, и они могут быть доступны все сразу (файл за файлом).   -  person Wolf    schedule 09.07.2015
comment
Если вы можете прочитать весь файл, то внешние таблицы и простые insert ... select .. from <external_table> — это то, что вам нужно, если нет необходимости в дополнительном преобразовании данных.   -  person Nick Krasnov    schedule 09.07.2015
comment
Спасибо за совет, я учту это.   -  person Wolf    schedule 09.07.2015


Ответы (2)


Вот некоторый pl/sql, который я использовал для разбора строк с разделителями, а затем извлечения отдельных слов. Возможно, вам придется немного повозиться с ним при использовании с веб-службой, но он отлично работает, когда вы запускаете его прямо в оракуле.

declare
  string_line varchar2(4000);
  str_cnt number;
  parse_pos_1 number := 1;
  parse_pos_2 number;
  parsed_string varchar2(4000);
begin
  --counting the number of commas in the string so we know how many times to loop
  select regexp_count(string_line, ',') into str_cnt from dual;

  for i in 1..str_cnt + 1
  loop
      --grabbing the position of the comma
      select regexp_instr(string_line, ',', parse_pos_1) into parse_pos_2 from dual;

      --grabbing the individual words based of the comma positions using substr function
      --handling the last loop
      if i = str_cnt + 1 then
        select substr(string_line, parse_pos_1, length(string_line)+1 - parse_pos_1) into parsed_string from dual;

        execute immediate 'insert into your_table_name (your_column_name) values (' || parsed_string || ' )';
        execute immediate 'commit';
      --handles the rest
      else
        select substr(string_line, parse_pos_1, parse_pos2 - parse_pos_1) into parsed_string from dual;
        execute immediate 'insert into your_table_name (your_column_name) values (' || parsed_string || ' )';
        execute immediate 'commit';
      end if;

      parse_pos_1 := parse_pos_2+1;

   end loop;
end;
person Jared    schedule 08.07.2015
comment
Это немного помогло мне, но я опубликовал точный ответ. Вы получите большой палец вверх, когда я получу 15 повторений. Спасибо за ответ. - person Wolf; 09.07.2015

Я нашел ответ на этот конкретный вопрос. Если у вас есть значения, аналогичные тем, которые я разместил для вопроса, например числа, которые выглядят примерно так:

String line = "145, 899";

Эта строка отправляется через запрос POST (веб-служба RESTful, APEX). Теперь получение значений в PL/SQL и вставка их в таблицу выглядит примерно так:

DECLARE
    val1 NUMBER;
    val2 NUMBER;
    str CLOB;
BEGIN
    str := string_fnc.blob_to_clob(:body);                   // we have to convert body
    val1 := TO_NUMBER(REGEXP_SUBSTR(str, '[^,]+', 1, 1));
    val2 := TO_NUMBER(REGEXP_SUBSTR(str, '[^,]+', 1, 2));
    // REGEXP_SUBSTR(source, pattern, start_position, nth_appearance)
INSERT INTO PRIMER VALUES (val1, val2);

END;

Однако это метод вставки строки за строкой в ​​базу данных, поэтому, если у вас есть большое количество строк в файле для вставки, это не способ сделать это. Но вот пример, который я просил. Я надеюсь, что это поможет кому-то.

person Wolf    schedule 09.07.2015
comment
Остерегаться! Регулярное выражение формата '[^,]+' вернет неожиданное значение, если в списке есть нулевой элемент, а выбранный вами элемент находится после этого элемента. См. здесь для получения дополнительной информации: оракул"> stackoverflow.com/questions/30192688/ - person Gary_W; 09.07.2015