Nano Hash - криптовалюты, майнинг, программирование

Oracle - Как добавить запись в коллекцию того же типа (Multiset Union)

Я использовал MULTISET UNION, чтобы загрузить коллекцию в другую коллекцию того же типа, однако сейчас я работаю с Записями и хочу добавить Запись в Коллекцию. того же типа. По какой-то причине я просто не могу понять подходящий синтаксис или просто правильный способ сделать это, поскольку MULTISET UNION, похоже, не очень хорошо работает с записями так, как я привык работать с коллекциями.

В конце я добавил краткое описание того, как работает этот код (все равно он должен работать).

Скриншот и код ниже

LINE 44: c_los_ms_tbl_ret := c_los_ms_tbl_ret MULTISET UNION los_ms_row;

введите здесь описание изображения

DECLARE  

  TYPE t_los_ms_rec IS RECORD(
      appt_id NUMBER DEFAULT NULL,
      appt_name VARCHAR(300) DEFAULT NULL,
      tot_units NUMBER DEFAULT 0,
      new_rentals NUMBER DEFAULT 0,
      term_rentals NUMBER DEFAULT 0,
      avg_los_all NUMBER DEFAULT 0
  );

  TYPE t_los_ms_tbl IS TABLE OF t_los_ms_rec;

  /* Two collections based on Table Type of Record t_los_ms_rec */
  c_los_ms_tbl_ret  t_los_ms_tbl  :=  t_los_ms_tbl();  
  c_los_ms_tbl      t_los_ms_tbl  :=  t_los_ms_tbl();  

  FUNCTION los_func(p_appt_ids IN VARCHAR) RETURN t_los_ms_tbl
  IS
        los_ms_row  t_los_ms_rec; /* Declare Row based on Record Type */

  BEGIN
    /* Outer loop: iterate through all user selected appartments. */
    FOR los IN 
    (
      SELECT 1001 AS appt_id, 45 AS tot_units, 10 AS new_rentals, 3 AS term_rentals, 'Building1' AS appt_name
        FROM dual UNION ALL
      SELECT 1002 AS appt_id, 37 AS tot_units, 6  AS new_rentals, 4 AS term_rentals, 'Building2' AS appt_name
        FROM duaL
    )
    LOOP      
      /* Set Row Fields to the Data being returned by Outer Loop.  Fake Table data from dual. */
      los_ms_row.appt_name    := los.appt_name;      
      los_ms_row.appt_id      := los.appt_id;
      los_ms_row.new_rentals  := los.new_rentals;
      los_ms_row.term_rentals := los.term_rentals;
      los_ms_row.tot_units    := los.tot_units;
      los_ms_row.avg_los_all  := 45; /* Made up Number */

      /* Output Apartment Name for testing */
      dbms_output.put_line('Apartment Name' || los_ms_row.appt_name);

      /* Save Row Data into Collection */ /* HOW DO I POPULATE COLLECTION WITH A RECORD */
      c_los_ms_tbl_ret  := c_los_ms_tbl_ret MULTISET UNION los_ms_row;

    END LOOP;

    RETURN c_los_ms_tbl_ret; /* Return Populated Collection */

  END los_func;  

BEGIN  
  /* Call Function and Store Returned Collection into a collection of same type */
  c_los_ms_tbl  :=  los_func(p_appt_ids => '1001,1002');

  FOR r IN c_los_ms_tbl.FIRST .. c_los_ms_tbl.LAST
  LOOP
    dbms_output.put_line(c_los_ms_tbl(r).avg_los_all);
  END LOOP;

END;

Сводка

  • Объявлен тип записи. t_los_ms_rec
  • Тип таблицы, объявленный на основе записи t_los_ms_tbl
  • Две коллекции объявлены на основе типов таблиц c_los_ms_tbl_ret и c_los_ms_tbl

  • В блоке BEGIN основного сценария функция los_func(), которая возвращает коллекцию типа t_los_ms_tbl, вызывается с использованием идентификаторов апартаментов в качестве параметров.

  • LINE 20: Внутри los_func() объявляется строка с именем los_ms_row того же типа t_los_ms_rec. Поля этой строки заполняются фальшивыми данными.
  • Далее нужно заполнить коллекцию по одной строке за раз. Не могу понять.
  • В этот момент при комментировании LINE 44, где я пытаюсь заполнить коллекцию, имена апартаментов успешно отправляются в dbms_output. Здесь он ломается из-за того, что я не знаю, как получить запись, которая успешно заполняется данными, в коллекцию c_los_ms_tbl_ret.

Сообщение об ошибке -

ORA-06550: строка 44, столбец 32: PLS-00306: неправильное количество или типы аргументов при вызове «MULTISET_UNION_ALL»

25.04.2019

Ответы:


1

MULTISET UNION используется для создания одной вложенной таблицы из двух вложенных таблиц. Вы пытаетесь использовать MULTISET UNION для объединения вложенной таблицы и одной записи.

Есть два способа исправить это:

  1. Создайте одноэлементную таблицу из одной записи:

        c_los_ms_tbl_ret  := c_los_ms_tbl_ret MULTISET UNION t_los_ms_tbl(los_ms_row);
    
  2. Откажитесь от использования MULTISET UNION и просто добавьте новую запись в таблицу:

        c_los_ms_tbl_ret.EXTEND(1);
        c_los_ms_tbl_ret(c_los_ms_tbl_ret.COUNT) := los_ms_row;
    
25.04.2019
  • @LuckWoodward Очень мило. Оба работают. Любопытно, если у вас есть какие-либо знания о производительности. Я предполагаю, что MULTISET UNION будет иметь большую нагрузку, но я не думаю, что у меня достаточно опыта, чтобы точно сказать, так или иначе. Мысли? 25.04.2019
  • Мое внутреннее чувство говорит, что второй будет быстрее, но я не уверен, что между ними есть огромная разница в производительности. Если вас действительно беспокоит производительность, попробуйте оба варианта и посмотрите, какой из них работает быстрее. 25.04.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..