2016-04-07 5 views
0

Oracle PL/SQLカーソルを使用しています。私はカーソルを作成しましたが、私はそれを開くことができません。私のようなエラーが発生します:動的SQLからのカーソルのオープンエラー

エラー(51,13):PLS-00320:この式の型の宣言は

私もカーソル文を開くためのエラーを取得し、不完全または不正な形式であります。

これは私のコードです:私は間違っ

DECLARE 

    uldid uldlog.uldid%type; 
    flightlegid uldlog.flightlegid%type; 
    TYPE rec IS RECORD (uldid number, uldlog number); 
    --CURSOR some_cursor RETURN rec; 
    CURSOR distUld return rec; 
    ress rec; 


BEGIN 

     MainQuery1 :='select uldlog.uldid, uldlog.flightlegid 
     from uldlog 
     INTO distUld 
     INNER JOIN flightulds ON uldlog.uldid = flightulds.flightuldsid 
     INNER JOIN M_ULDTYP ON FLIGHTULDS.ULDTYPEID = M_ULDTYP.ULDTYPID 
     INNER JOIN FLIGHTLEG ON FLIGHTLEG.FLIGHTLEGID = FLIGHTULDS.INFLIGHTLEGID 
     INNER JOIN FLIGHTS ON FLIGHTLEG.FLIGHTID = FLIGHTS.FLIGHTID 
     INNER JOIN M_AIRLINE A on A.AIRLINEID = FLIGHTS.AIRLINEID 
     INNER JOIN m_flighttyp on m_flighttyp.Id=FLIGHTLEG.SERVICETYPEID 
     INNER JOIN m_pax_fr on m_pax_fr.id=m_flighttyp.pax_fr_id 
     where flightulds.uldtypeid IN (3,4,5,8,9)';   

     FinalQuery1 := MainQuery1 || CommonFilterCluase || ' GROUP BY uldlog.uldid, uldlog.flightlegid'; 
     EXECUTE IMMEDIATE FinalQuery1;   

    OPEN distUld; 
    LOOP 
     FETCH distUld into ress; 
     EXIT WHEN distUld%notfound; 
     NumberOfUldsDistinctEntires := NumberOfUldsDistinctEntires +1; 
     IF fn_bdtimedifference(uldid,flightlegid,FlightTypeIds,CargoType,CargoPriority,UldTypes,SlaStatusCommaSeparatedNumbers) is null then 
     Bd_Avg_Time := Bd_Avg_Time + 0; 
     Else 
     Bd_Avg_Time := Bd_Avg_Time + fn_bdtimedifference(uldid,flightlegid,FlightTypeIds,CargoType,CargoPriority,UldTypes,SlaStatusCommaSeparatedNumbers); 
    END IF; 
    END LOOP; 
    CLOSE distUld; 
END; 

何をしているのですか?

答えて

2

カーソルの宣言CURSOR distUld return recが間違っています。あなたがしようとしているようです:

TYPE distUld IS REF CURSOR return rec 

しかし、you can't use a strongly-typed ref cursor with dynamic SQLです。だから、あなたは帰りを持つことはできません。 into句を持つべきではない - - あなたはまた、代わりにexecute immediateの、その型のインスタンスを必要としますが、動的に参照カーソルを開きます。

元のエラーの範囲外である他の問題があります
DECLARE 
    ... 
    TYPE distUldType IS REF CURSOR; 
    distUld distUldType; 
BEGIN 
    MainQuery1 :='select uldlog.uldid, uldlog.flightlegid 
     from uldlog 
     INNER JOIN flightulds ON uldlog.uldid = flightulds.flightuldsid 
     ...'; 
    FinalQuery1 := ...; 

    OPEN distUld FOR FinalQuery1; 
    LOOP 
     FETCH distUld into ress; 
     EXIT WHEN distUld%notfound; 
     NumberOfUldsDistinctEntires := NumberOfUldsDistinctEntires +1; 
     IF fn_bdtimedifference(ress.uldid, ress.flightlegid, 
     ress.FlightTypeIds, ...) is null then 
     ... 
    END LOOP; 
    CLOSE distUld; 
END; 

本質的にrecには、カーソルクエリで選択するすべての列のフィールドが必要です。カーソルクエリは、関数の引数として渡すすべての列を選択しなければなりません。これらの呼び出しでは、ressレコード変数。したがって、クエリは適切なテーブルからFlightTypeIdsなどを取得する必要があります。 recにはこれらの列を保持するフィールドが必要です。

またMainQuery1の宣言、FinalQuery1CommonFilterCluaseNumberOfUldsDistinctEntiresを逃している - あなただけの問題でそれらを示していないかもしれません。 CommonFilterCluaseの内容に応じて、連結内に別のスペースが必要な場合があります。 uldidまたはflightlegid個の変数は使用していません。等々。

関連する問題