2016-04-07 25 views
0

Oracle PL/SQL imleçleri ile çalışıyorum. İmleç oluşturdum ancak açamıyorum. Ben gibi hatalar alıyorum:İmleci dinamik SQL'den açarken hata oluştu

Hata (51,13): PLS-00320: bu ifadenin türü beyanı

Ben de imleç deyimi açma hatası alıyorum eksik veya hatalı .

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; 

yanlış yapıyorum:

Bu benim kodudur?

cevap

2

İmleciniz bildiriminiz CURSOR distUld return rec yanlıştır.

TYPE distUld IS REF CURSOR return rec 

ama you can't use a strongly-typed ref cursor with dynamic SQL: Size yapmaya çalıştığını gibi görünüyor. Yani dönüşü alamazsın. into maddesi olmamalıdır - - Ayrıca yerine execute immediate arasında, bu tür bir örneğini gerek dinamik ref imleç açık:

orijinal hata kapsamı dışındadır diğer sorunlar vardır
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; 

Ancak, temel olarak, rec, imleç sorgusunda seçtiğiniz her sütun için alanlara sahip olmalı ve imleç sorgusu, işlevlerinize bir argüman olarak geçmek istediğiniz her sütunu seçmek zorundadır ve bu aramalar alan adlarını ress ile doğrulamak zorundadır. kayıt değişkeni. Yani sorgunuz, uygun tablolardan FlightTypeIds vb. Almak zorundadır; ve rec, bu sütunları tutmak için alanlara ihtiyaç duyar. MainQuery1, FinalQuery1, CommonFilterCluase, NumberOfUldsDistinctEntires için

Ayrıca kaçırdığını beyanlar - sadece söz konusu bu kişilere göstermiştir olmayabilir ama. Birleştirme işleminizde CommonFilterCluase'un içeriğine bağlı olarak başka bir alana ihtiyacınız olabilir. uldid veya flightlegid değişkenlerini kullanmıyorsunuz. Ve bunun gibi.