2016-04-07 9 views
0

Ich arbeite mit Oracle PL/SQL-Cursorn. Ich habe einen Cursor erstellt, kann ihn aber nicht öffnen. Ich erhalte Fehler wie:Fehler beim Öffnen des Cursors aus dynamischem SQL

Fehler (51,13): PLS-00320: die Erklärung der Art dieser Ausdruck ist unvollständig oder fehlerhaft

ich Fehler erhalten zum Öffnen und Cursor-Anweisung .

Dies ist mein Code:

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; 

Was mache ich falsch?

Antwort

2

Ihre Cursor-Deklaration CURSOR distUld return rec ist falsch. Es sieht aus wie Sie zu tun versuchen:

TYPE distUld IS REF CURSOR return rec 

aber you can't use a strongly-typed ref cursor with dynamic SQL. Sie können also nicht zurückkehren. Sie müssen auch eine Instanz dieses Typs, und anstelle des execute immediate - die nicht die into Klausel haben sollte - Sie ref Cursor öffnen dynamisch:

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; 

Es gibt andere Probleme, die nicht in den Anwendungsbereich des ursprünglichen Fehler sind , aber im Wesentlichen muss rec Felder für jede Spalte haben, die Sie in der Cursorabfrage auswählen, und die Cursorabfrage muss jede Spalte auswählen, die Sie als Argument für Ihre Funktionen übergeben möchten, und diese Aufrufe müssen die Feldnamen mit der ress qualifizieren Variable aufzeichnen. Also muss Ihre Abfrage FlightTypeIds usw. von den entsprechenden Tabellen erhalten; und rec benötigt Felder, um diese Spalten zu halten.

Sie sind auch Erklärungen für MainQuery1, FinalQuery1, CommonFilterCluase, NumberOfUldsDistinctEntires fehlt - wenn Sie die in der Frage haben, können einfach nicht gezeigt. Je nachdem, was CommonFilterCluase enthält, benötigen Sie möglicherweise ein anderes Leerzeichen in Ihrer Verkettung. Sie verwenden nicht die Variablen uldid oder flightlegid. Und so weiter.

Verwandte Themen