Как вставить строки с помощью курсора в Oracle 11g - PullRequest
0 голосов
/ 05 ноября 2011

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

Мой курсор такой, как показано ниже:

/* Formatted on 11/5/2011 11:26:57 AM (QP5 v5.149.1003.31008) */
DECLARE
    CURSOR csgetpgmecultstrecrefrs (
        update_date       DATE,
        sequence_type     VARCHAR2,
        pip_number        VARCHAR2,
        startfrom         INT,
        endon             INT)
    IS
        SELECT                                   /*+first_rows(25)  parallel (PE,20) */
                pecu.component,
                 pecu.component_serial_no,
                 TO_DATE ('11/03/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
                     date_received,
                 TO_DATE ('11/03/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
                     date_programmed,
                 pecu.date_requested,
                 pecu.component_model_no,
                 pecu.product_type,
                 pecu.product_model_no,
                 pecu.product_serial_no,
                 pecu.factory_source,
                 pecu.programming_organization,
                 pecu.programming_site,
                 pecu.program_version,
                 pecu.ecu_serial_no,
                 pecu.ecu_part_no,
                 pecu.ecu_level,
                 pecu.software_assembly_id,
                 jdcp_pip_swa.pip_version software_assembly_id_upgrade,
                 TO_DATE ('11/03/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
                     software_upgrade_date,
                 jdcp_pip_details.released_by software_upgraded_by,
                 pecu.power_bump,
                 pecu.fuel_system_part_no,
                 pecu.fuel_pump_serial_no,
                 pecu.rack_slope,
                 pecu.off_set,
                 pecu.ecu_hours,
                 pecu.cal_file,
                 pecu.ecu_boot_block_part_no,
                 jdcp_pip_details.released_by user_id,
                 pecu.performance_option_part_no,
                 pecu.vehicle_option_part_no,
                 'PIP' sequence_type,
                 pecu.flex_power_part_no,
                 pecu.performance_option_cd,
                 pecu.vehicle_option_cd,
                 pecu.lineage,
                 pecu.replaced_by_esn,
                 pecu.replaces_esn,
                 pecu.esn_copied_from,
                 pecu.payload_seq_no,
                 pecu.vehicle_system_id,
                 pecu.user_account,
                 pecu.ecu_opcode_part_no,
                 pecu.opcode_compat_code,
                 pecu.marked_qa
          FROM   (   (  jdcp_pip_details
                            INNER JOIN
                                jdcp_pip_pin_assc
                            ON jdcp_pip_details.pip_number =
                                    jdcp_pip_pin_assc.pip_number)
                      INNER JOIN
                          jdcp_pip_swa
                      ON jdcp_pip_details.pip_swa_id = jdcp_pip_swa.pip_swa_id)
                 INNER JOIN
                     (   (SELECT pe.component,
                                     pe.component_serial_no,
                                     pe.display_serial_no_13,
                                     pe.display_serial_no_17,
                                     pe.date_requested,
                                     pe.component_model_no,
                                     pe.product_type,
                                     pe.product_model_no,
                                     pe.product_serial_no,
                                     pe.factory_source,
                                     pe.programming_organization,
                                     pe.programming_site,
                                     pe.program_version,
                                     pe.ecu_serial_no,
                                     pe.ecu_part_no,
                                     pe.ecu_level,
                                     pe.software_assembly_id,
                                     pe.power_bump,
                                     pe.fuel_system_part_no,
                                     pe.fuel_pump_serial_no,
                                     pe.rack_slope,
                                     pe.off_set,
                                     pe.ecu_hours,
                                     pe.cal_file,
                                     pe.ecu_boot_block_part_no,
                                     pe.performance_option_part_no,
                                     pe.vehicle_option_part_no,
                                     pe.flex_power_part_no,
                                     pe.performance_option_cd,
                                     pe.vehicle_option_cd,
                                     pe.lineage,
                                     pe.replaced_by_esn,
                                     pe.replaces_esn,
                                     pe.esn_copied_from,
                                     pe.payload_seq_no,
                                     pe.vehicle_system_id,
                                     pe.user_account,
                                     pe.ecu_opcode_part_no,
                                     pe.opcode_compat_code,
                                     pe.marked_qa
                              FROM programmed_ecu_13_17_map_view pe
                             WHERE pe.date_received =
                                         (SELECT /*+ INDEX_DESC(PEDR PROGRAMMED_ECU_INDEX8) */
                                                  pedr.date_received AS date_received
                                             FROM programmed_ecu pedr
                                            WHERE pedr.component_serial_no =
                                                        pe.component_serial_no
                                                    AND pedr.component = pe.component
                                                    AND (pedr.date_programmed) =
                                                             (SELECT /*+ INDEX_DESC(PEDP PROGRAMMED_ECU_INDEX8) */
                                                                      pedp.date_programmed
                                                                 FROM programmed_ecu pedp
                                                                WHERE pedp.
                                                                         component_serial_no =
                                                                            pedr.
                                                                             component_serial_no
                                                                        AND pedp.component =
                                                                                 pedr.component
                                                                        AND ROWNUM = 1)
                                                    AND ROWNUM = 1)) pecu
                      INNER JOIN
                          software_assembly_id
                      ON pecu.vehicle_system_id =
                              software_assembly_id.vehicle_system_id)
                 ON (pecu.component = jdcp_pip_pin_assc.controller_short_name)
                     AND (jdcp_pip_swa.pip_version =
                                software_assembly_id.software_assembly_id)
                     AND (pecu.component =
                                software_assembly_id.controller_short_name)
         WHERE (pecu.display_serial_no_13 = jdcp_pip_pin_assc.pin_number
                  OR pecu.display_serial_no_17 = jdcp_pip_pin_assc.pin_number)
                 AND pecu.software_assembly_id <> jdcp_pip_swa.pip_version
                 AND jdcp_pip_details.pip_number = 'TEST_FWD_ASSC'
                 AND jdcp_pip_pin_assc.status_cd NOT IN
                          ('UC', 'SU', 'FA', 'RP', 'EC')
                 AND jdcp_pip_pin_assc.forward_associated = 'N'
                 AND ROWNUM BETWEEN 1 AND 25;

    rc   csgetpgmecultstrecrefrs%ROWTYPE;
BEGIN
    OPEN csgetpgmecultstrecrefrs (update_date date,
                                            sequence_type varchar2,
                                            pip_number varchar2,
                                            startfrom int,
                                            endon int);
LOOP
    FETCH csgetpgmecultstrecrefrs BULK COLLECT INTO rc;

    EXIT WHEN csgetpgmecultstrecrefrs%NOTFOUND;

    INSERT
      INTO programmed_ecu (component,
                                  component_serial_no,
                                  date_received,
                                  date_programmed,
                                  date_requested,
                                  component_model_no,
                                  product_type,
                                  product_model_no,
                                  product_serial_no,
                                  factory_source,
                                  programming_organization,
                                  programming_site,
                                  program_version,
                                  ecu_serial_no,
                                  ecu_part_no,
                                  ecu_level,
                                  software_assembly_id,
                                  software_assembly_id_upgrade,
                                  software_upgrade_date,
                                  software_upgraded_by,
                                  power_bump,
                                  fuel_system_part_no,
                                  fuel_pump_serial_no,
                                  rack_slope,
                                  off_set,
                                  ecu_hours,
                                  cal_file,
                                  ecu_boot_block_part_no,
                                  user_id,
                                  performance_option_part_no,
                                  vehicle_option_part_no,
                                  sequence_type,
                                  flex_power_part_no,
                                  performance_option_cd,
                                  vehicle_option_cd,
                                  lineage,
                                  replaced_by_esn,
                                  replaces_esn,
                                  esn_copied_from,
                                  payload_seq_no,
                                  vehicle_system_id,
                                  user_account,
                                  ecu_opcode_part_no,
                                  opcode_compat_code,
                                  marked_qa
                                 )
    VALUES (
                 rc.component,
                 rc.component_serial_no,
                 rc.date_received,
                 rc.date_programmed,
                 rc.date_requested,
                 rc.component_model_no,
                 rc.product_type,
                 rc.product_model_no,
                 rc.product_serial_no,
                 rc.factory_source,
                 rc.programming_organization,
                 rc.programming_site,
                 rc.program_version,
                 rc.ecu_serial_no,
                 rc.ecu_part_no,
                 rc.ecu_level,
                 rc.software_assembly_id,
                 rc.software_assembly_id_upgrade,
                 rc.software_upgrade_date,
                 rc.software_upgraded_by,
                 rc.power_bump,
                 rc.fuel_system_part_no,
                 rc.fuel_pump_serial_no,
                 rc.rack_slope,
                 rc.off_set,
                 rc.ecu_hours,
                 rc.cal_file,
                 rc.ecu_boot_block_part_no,
                 rc.user_id,
                 rc.performance_option_part_no,
                 rc.vehicle_option_part_no,
                 rc.sequence_type,
                 rc.flex_power_part_no,
                 rc.performance_option_cd,
                 rc.vehicle_option_cd,
                 rc.lineage,
                 rc.replaced_by_esn,
                 rc.replaces_esn,
                 rc.esn_copied_from,
                 rc.payload_seq_no,
                 rc.vehicle_system_id,
                 rc.user_account,
                 rc.ecu_opcode_part_no,
                 rc.opcode_compat_code,
                 rc.marked_qa);
END LOOP;

COMMIT;
END;

Любая помощь приветствуется.Заранее спасибо !!!Я получаю сообщение об ошибке:

Ошибка в строке 2 ORA-06550: строка 147, столбец 44: PLS-00103: Обнаружен символ «ДАТА» при ожидании одного из следующего:.(), * @% & |= - + </> в in это остаток от мода, а не диапазон rem => .. <> или! = или ~ => = <= <> и / или LIKE2_ LIKE4_ LIKEC_ в промежутке между использованием ||член мультимножества SUBMULTISET_ ORA-06550: строка 151, столбец 21: PLS-00103: обнаружен символ «)» при ожидании одного из следующих действий: из массива ORA-06550: строка 254, столбец 4: PLS-00103: обнаруженсимвол "конец файла" при ожидании одного из следующих действий:

конец не прагма конечный экземплярный экземпляр, переопределяющий статическую карту конструктора элемента Сценарий завершен в строке 2. "

1 Ответ

1 голос
/ 05 ноября 2011

Объявление вашего курсора неверно. Курсор не объявляется с использованием типов данных, вам нужно удалить всю часть в скобках. Типы данных для каждого столбца определяются столбцами, возвращаемыми оператором SELECT:

CURSOR csgetpgmecultstrecrefrs 
IS
SELECT .....

См. Примеры в руководстве для деталей:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/sqloperations.htm#sthref1296

...