2011-11-05 3 views
-3

커서를 사용하여 테이블 중 하나에 데이터를 삽입하는 함수를 oracle에 작성하려고합니다. 삽입해야하는 데이터를 선택하려면 select 쿼리가 필요합니다. 이것은 내가 쓰고있는 첫 번째 커서이며 너무 복잡합니다.Oracle 11g 커서를 사용하여 행을 삽입하는 방법

내 커서는 다음과 같습니다 :

/* 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; 

어떤 도움에 감사드립니다. 미리 감사드립니다 !!! 내가 무엇입니까 오류 메시지는 다음과 같습니다 라인 147, 열 44 : PLS-00103 :가 발생 상징 "DATE"다음 중 하나를 예상 : 2 호선 ORA-06550에서

오류가 발생했습니다.(), * @ % & | = -! + < />의 모드 나머지는하지 범위 REM => .. <> 또는 = 또는 ~ => = < = <> 및 또는 LIKE2_ LIKE4_ LIKEC_ 같은 사이 등의 사용에서 || MULTISET 부재 SUBMULTISET_ ORA-06550 : 선 (151), 칼럼 (21) : PLS-00103 : 조우 심볼 ")"는 다음 중 하나가 예상 : 일괄로 행을 ORA-06550 : 선 (254), 컬럼 4 : PLS-00103 : 심볼을 "파일의 끝 '가 발생 중 하나를 기대하는 경우 다음

끝은 스크립트 라인 2."

+2

그리고 정확히 질문은 무엇인가? 오류가 있습니까? 그렇다면 정확한 오류 메시지를 붙여 넣으시겠습니까? 예상대로 작동하지 않습니까? 그렇다면 당신이 기대하는 것과 코드가 실패한 부분에 대해 자세히 설명하십시오. –

+0

죄송합니다. 질문에서 오류 메시지를 업데이트했습니다. –

+0

게시물의 어느 곳에서나 올바른 Oracle 오류 메시지가 표시되지 않습니다. –

답변

1
에 종료 정적 멤버 생성자지도 를 오버라이드 (override) 최종 인스턴스화 순서를 PRAGMA하지

커서의 선언이 잘못되었습니다. 커서가 de 데이터 유형을 사용하여 clared되면 괄호 사이의 전체 부분을 제거해야합니다. 각 열에 대한 데이터 유형은 SELECT 문에 의해 반환 된 열을 기준으로 결정됩니다

CURSOR csgetpgmecultstrecrefrs 
IS 
SELECT ..... 

은 자세한 내용은 설명서의 예를 참조 :

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

+0

을 확인하십시오. 도움이되지 않습니다. insert 문을 사용한 예는 없습니다. 내가 선택 진술과 함께 삽입을 찾고 있는데, 열 중 하나에서 원시가 길다. 그런 예를 나에게 줄 수 있니? –

+0

게시 한 오류는 모두 구문 오류에 관한 것입니다. "질문"에서 SELECT 및 RAW 열 (아무래도 사용해서는 안 됨)에 대한 INSERT에 대해 묻지 마십시오. 나는 당신이 게시 한 문법 오류에 대한 질문에 대답했다. 다른 질문이 있으시면 명확히 기재하십시오. –

관련 문제