PL / SQL - объявить запись, где хранить записи таблицы и операции? - PullRequest
0 голосов
/ 17 октября 2018

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

  • Объявить запись, в которой вы ведете запись таблицы LOCATIONS (LOCATION_ID,STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE и COUNTRY_ID) и операция.

  • Объявление массива, в котором вы храните записи местоположения в качестве элементов.

  • Инициализация массива с помощьюзаполнение значений для каждого местоположения, которое вы хотите обработать
  • Тип операции может быть «U» для обновления, «I» для вставки и «D» для удаления
  • Итерация всех элементов массива изначало до конца и выполнить следующую логику для каждого местоположения, определенного в массиве:
    1. Если тип операции - «U», то обновите таблицу LOCATIONS значениями, поступающими из массива.Если идентификатор местоположения не найден в таблице, вставьте его как новую запись.
    2. Если тип операции - «I», вставьте запись в таблицу.Значения должны поступать из массива
    3. Если тип операции «D», удалить это местоположение из таблицы.
    4. Для каждой операции отображать сообщение после завершения процесса
    5. Если тип оператора отличается от U, I, D, отобразите правильное сообщение с указанием «Недопустимая операция».
    6. Подтвердите все транзакции

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

BEGIN
IF INSERTING THEN
    INSERT INTO carlog
    VALUES ('INSERT',user, SYSDATE, UPPER(:NEW.serial), UPPER(:NEW.make),
        UPPER(:NEW.model), UPPER(:NEW.color));
END IF;
IF UPDATING THEN
    INSERT INTO carlog
    VALUES ('UPDATE',user, SYSDATE,:old.serial, old.make, 
        old.model, old.color);
END IF;
IF DELETING THEN
    INSERT INTO carlog
    VALUES ('DELETE',user, SYSDATE,:old.serial, old.make, 
        old.model, old.color);
END IF;
END;

1 Ответ

0 голосов
/ 17 октября 2018

Массив - это просто тип коллекции.Если вы посмотрите документацию здесь: https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#LNPLS00501

Вы можете увидеть, что «Ассоциативный массив» - это просто тип коллекции PL / SQL.

Что касается «Операции»Мое понимание, основанное на спецификации, заключается в том, что это чисто атрибут самой записи местоположения.Я хотел бы сделать что-то похожее на приведенное ниже:

DECLARE 
  --declare your location record based on the spec
  TYPE location IS RECORD (
    location_id integer,
    operation VARCHAR2(1)
    --additional values from the spec would go here
  );

  --declare an array as a table of the location type
  TYPE location_array IS TABLE OF location INDEX BY BINARY_INTEGER;

  --two variables to hold the data
  example_location location;
  locations location_array;
BEGIN 
  --start building your location record for the location you want to modify
  example_location.location_id := 1;
  example_location.operation   := 'T';
  --..... additional values here

  --add the location to the array
  locations(locations.count + 1) := example_location;

  --repeat the above for any other locations, or populate these some other way

  --loop through the locations
  FOR i IN locations.first..locations.last
  LOOP
    --decide the logic based on the operation, could just as easily use your if logic here
    CASE locations(i).operation
      WHEN 'U' THEN
        dbms_output.put_line('your update logic here');
      WHEN 'I' THEN
        dbms_output.put_line('your insert logic here');
      WHEN 'D' THEN
        dbms_output.put_line('your delete logic here');
      ELSE
        dbms_output.put_line('other operations');
    END CASE;
  END LOOP;
END;

Вам нужно будет адаптировать вышеупомянутое в соответствии со своими потребностями, добавив в соответствующую логику сообщения, коммиты, обработку ошибок и т. Д.

...