2012-07-17 2 views
0

컴파일되지 않습니다. 뭐가 문제 야?Oracle : DBMS_SQL을 사용하여 대량 수집

TYPE recEniFlussiHub IS RECORD 
     (
     FLVO_ID     dbms_sql.varchar2_table, 
     flh_id_messaggio  dbms_sql.varchar2_table, 
     flh_integrazione_id  dbms_sql.varchar2_table 
    ); 

     TYPE taof_RowCurEniFlussiHub IS TABLE OF recEniFlussiHub; 

     curEniFlussiHub  taof_RowCurEniFlussiHub; 


     SELECT null FLVO_ID, 
      c.flh_id_messaggio, 
      c.flh_integrazione_id,   
     BULK COLLECT INTO curEniFlussiHub 
     FROM ENI_FLUSSI_HUB c 
     WHERE  c.flh_fornitura = P_FLH_FORNITURA 
+0

오류 메시지가 무엇을 할 필요가 없습니다? – beny23

+0

전체 코드 예제입니까? 나는 BEGIN 키워드와 같은 몇 가지 요소가 누락 된 것처럼 생각하지 않습니다. 구문 오류를 발견하기를 원하면 이해하지 못하는 오류를 나타내는 일관된 코드 샘플을 게시해야합니다. 그리고 컴파일 오류 스택도 게시하십시오! – APC

+0

실행중인 Oracle 버전은 무엇입니까? – Ollie

답변

1

당신이 BULK에서의 요소 절을 수집 참조 할 필요가 기록에 중첩 된 테이블을 사용하려고하는 경우. 이런 식으로 뭔가 :

SELECT null FLVO_ID, 
     c.flh_id_messaggio, 
     c.flh_integrazione_id   
    BULK COLLECT INTO curEniFlussiHub.FLVO_ID 
       , curEniFlussiHub.flh_id_messaggio   
       , curEniFlussiHub.flh_integrazione_id 
    FROM ENI_FLUSSI_HUB c 
    WHERE  c.flh_fornitura = P_FLH_FORNITURA 

또한 당신은 단지 기록의 인스턴스로 변수를 정의해야합니다 : 당신이 추가 테이블 형식 즉

declare 
    recEniFlussiHub IS RECORD 
     ( 
     FLVO_ID     dbms_sql.varchar2_table, 
     flh_id_messaggio  dbms_sql.varchar2_table, 
     flh_integrazione_id  dbms_sql.varchar2_table 
    ); 

    curEniFlussiHub  recEniFlussiHub;  
1

당신은 (flh_id_messaggioflh_integrazione_id 자체가 중첩 된 테이블이 아닌 내가 당신의 열을 가정하고) 귀하의 기록 형식이 잘못 선언했다. 당신이 값이 선택된 개최 연관 배열을 만드는 경우

, 각 필드는 그 자체로 수집 할 필요가 없습니다 (당신은 c.flh_integrazione_id 후 select 문에서 여분의 쉼표를했다) :

(I를 귀하의 flvo_id이 으로 선언하려고 시도했을 때 VARCHAR2이라고 가정하고, NUMBER 인 경우이를 레코드 선언에 선언하십시오.

TYPE receniflussihub IS RECORD(
    flvo_id     VARCHAR2, 
    flh_id_messaggio  eni_flussi_hub.flh_id_messaggio%TYPE, 
    flh_integrazione_id  eni_flussi_hub.flh_integrazione_id%TYPE 
); 

TYPE taof_rowcureniflussihub IS TABLE OF receniflussihub; 


cureniflussihub taof_rowcureniflussihub; 

SELECT NULL flvo_id, 
     c.flh_id_messaggio, 
     c.flh_integrazione_id 
    BULK COLLECT INTO cureniflussihub 
    FROM eni_flussi_hub C 
WHERE c.flh_fornitura = p_flh_fornitura; 

... Here

이 도움이 되었으면 좋겠 참조

편집 : 귀하의 코멘트에서

, 당신이 컬렉션의 기록 (보다는 콜렉션으로 선택해야하는 경우) 당신은 테이블 TYPE을 선언 할 필요가 없습니다. 당신의 decalred 레코드 타입의 레코드만을 선택하십시오. (당신의 코드에서 여러분은 여전히 ​​이후에 여분의 쉼표를 가졌음을 잊지 마십시오. 당신의 선택 문에) :

이 시도 :

TYPE receniflussihub IS RECORD(
    flvo_id     dbms_sql.varchar2_table, 
    flh_id_messaggio  dbms_sql.varchar2_table, 
    flh_integrazione_id  dbms_sql.varchar2_table 
); 

receniflussihub_rec receniflussihub; 

SELECT NULL flvo_id, 
     c.flh_id_messaggio, 
     c.flh_integrazione_id 
    BULK COLLECT INTO receniflussihub_rec.flvo_id, 
        receniflussihub_rec.flh_id_messaggio, 
        receniflussihub_rec.flh_integrazione_id 
    FROM eni_flussi_hub C 
WHERE c.flh_fornitura = p_flh_fornitura; 
+0

고마워,하지만 나는 그것을 FORALL 삽입과 함께 사용해야하고 테이블에 마지막 필드 (flh_integrazione_id)가 없다. 그래서 내가 그런 식으로 관리 할 수 ​​없다고 생각한다 : "FORALL i IN 1. .. curEniFlussiHub.COUNT \ n INSERT INTO ENI_FLUSSI_VAR_OPZTAR \ n curEniFlussiHub (i) \ n ##### "빠른 방법 3 DBMS_SQL 정의 배열로 가져 오기"-> http://psoug.org/reference/array_processing.html – Revious

+1

어떤 오라클 버전을 사용하고 있습니까? – Ollie

+1

죄송합니다. 수정 된 코드에 오타가 생겼습니다. 모두 수정되었습니다. – Ollie

관련 문제