2012-12-20 12 views
6

Mam procedurę, która zapełnia zmienną BLOB dokumentem PDF. Próbuję dodać logikę, aby wyświetlać tylko dokument PDF w ciągu 60 dni od daty statycznej. Patrz poniżej:Błąd ORA-22275: określono nieprawidłowy lokalizator LOB

check_staticdate  number(1); 

function DisplayPDF (audit in number) RETURN blob is 

person_id  person.person_id%type; 
z_lob   blob; 
blob_length NUMBER; 


CURSOR getPDF(audit number) IS 
    select report 
    from report_table 
    where report_type = 'PDF' 
    and job_no = audit order by rec_no; 


begin 

/* Check Valid ID */ 
if not package.ValidID(person_id, check_only=>TRUE) then 
    return z_lob; 
end if; 


/* Here is the case statement.*/ 
select case 
    when exists 
     (
     SELECT 'x' from table 
     where table_id = person_id 
     and trunc(sysdate) < trunc(table_static_date + 60) 
    ) 

    then 1 
    else 0 
    end into check_staticdate 
from dual; 


if (check_staticdate = 0) then 
    return z_lob; 
end if; 



open getPDF(audit); 
fetch getPDF into z_lob; 
close getPDF; 
return z_lob; 


end DisplayPDF; 

Błąd otrzymuję to: ORA-22275: invalid LOB locator specified.

Jestem nowy w Oracle SQL i jestem pewien, dlaczego moi ValidID prace kontrolne wracając z_lob ale mój case nie.

Edycja: Dodawanie pełne błędów stos

Failed to execute target procedure ORA-22275: invalid LOB locator specified 

ORA-06512: at "SYS.WPG_DOCLOAD", line 51 

ORA-06512: at "User.Package", line 733 

ORA-06512: at line 33 

Odpowiedz

16

Initialise swój lob z tymczasowym pierwszym

DBMS_LOB.CREATETEMPORARY(z_lob,true); --true if you want it to be cached. 
+2

Chciałem się upewnić, że masz kredyt na to. W ten sposób ponownie przydzielono i ponownie ustalono priorytety. Jednak twoja odpowiedź ostatecznie zadziałała. Dzięki! – Phoenix

+0

Wraz z 'DBMS_LOB.OPEN', podobnie - ' DBMS_LOB.CREATETEMPORARY ( lob_loc => z_lob , cache => true , dur => dbms_lob.call); DBMS_LOB.OPEN ( lob_loc => z_lob , open_mode => DBMS_LOB.LOB_READWRITE); ' - i to działa. – PhistucK

0

Twoja funkcja jest prawdopodobnie powrocie (w zależności od wartości parametru audit) plama o wartości NULL do metody SYS.WPG_DOCLOAD który rzuca nieobsługiwany wyjątek widzisz.

Może zmodyfikować return z_lob; być return nvl(z_lob, empty_blob());

Powiązane problemy