Строки-трансформеры - PullRequest
       22

Строки-трансформеры

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

Мне нужно принять следующие строки, поместить их в коллекцию типов и передать в процедуру

String Cars = Dodge Charger||Ford Mustang||Chevy Camro||Ford GT
String Cost = 35,000||25,000||29,000|55,000
String CarDesc = Power House||Sweet Ride||Too Cool||Blow your door off

Как преобразовать записи, чтобы они были похожи на следующие?

 Cars:
  Dodge Charger||35,000||Power House
  Ford Mustang||25,00||Sweet Ride
  Chevy Camro||29,000||Too Cool
  Ford GT||55,000||Blow your door off

Как мне разобрать их в массив?

Типы:

 create or replace TYPE             "CAR_OBJ"                                          
  AS
  OBJECT (CAR_NAME VARCHAR2 (50),
       Price    Number,
       CarDesc VARCHAR2 (100));
/
create or replace TYPE             "CAR_IN_ARR"                                          
  IS
   TABLE OF CAR_OBJ;
/


  procedure car_values (
      p_in_upd_car              car_in_arr,
      p_out_upd_results    out  car_out_cur
  )
  as

Я перепробовал все виды циклов for и просто не могу получить их вправильный порядок

Большое спасибо

1 Ответ

1 голос
/ 27 октября 2019

Двойной разделитель || усложняет задачу, поэтому я обманул, заменив их на ~. Вероятно, есть более удобный способ справиться с этим с помощью одного регулярного выражения или более сложный подход с использованием substr и instr.

Также я предположил, что cost пример должен быть 35,000||25,000||29,000||55,000.

Реальный код, вероятно, должен подтвердить, что все строки содержат одинаковое количество разделителей. Также вы можете захотеть разобрать стоимость стоимости в число.

declare
    inCars    long := 'Dodge Charger||Ford Mustang||Chevy Camro||Ford GT';
    inCost    long := '35,000||25,000||29,000||55,000';
    inCarDesc long := 'Power House||Sweet Ride||Too Cool||Blow your door off';

    type varchar2_tt is table of varchar2(50);

    cars      varchar2_tt := varchar2_tt();
    costs     varchar2_tt := varchar2_tt();
    carDescs  varchar2_tt := varchar2_tt();
begin
    inCars := replace(inCars,'||','~');
    inCost := replace(inCost,'||','~');
    inCarDesc := replace(inCarDesc,'||','~');

    cars.extend(regexp_count(inCars,'~') +1);
    costs.extend(regexp_count(inCost,'~') +1);
    carDescs.extend(regexp_count(inCarDesc,'~') +1);

    for i in 1..cars.count loop
        cars(i) := regexp_substr(inCars,'[^~]+', 1, i);
        costs(i) := regexp_substr(inCost,'[^~]+', 1, i);
        carDescs(i) := regexp_substr(inCarDesc,'[^~]+', 1, i);

        dbms_output.put_line(cars(i) || '||' || costs(i) || '||' || carDescs(i));
    end loop;
end;
...