2009-09-02 183 views
3

我有這個程序我我的包:傳遞BLOB/CLOB作爲參數傳遞給PL/SQL函數

PROCEDURE pr_export_blob(
    p_name    IN  VARCHAR2, 
    p_blob    IN  BLOB, 
    p_part_size   IN  NUMBER); 

我想爲參數p_blob是要麼BLOB或CLOB。

當我用BLOB參數調用這個過程時,一切都很好。當我和CLOB參數調用它,我得到的編譯錯誤:

 
PLS-00306: wrong number or types of arguments in call to 'pr_export_blob' 

有沒有寫一個程序的方式,可以採取兩種這些類型作爲參數的?某種超類也許?

回答

4

你爲什麼不只是超載過程有一個CLOB實施以及

PROCEDURE pr_export_lob(
    p_name    IN  VARCHAR2, 
    p_blob    IN  BLOB, 
    p_part_size   IN  NUMBER); 

PROCEDURE pr_export_lob(
    p_name    IN  VARCHAR2, 
    p_clob    IN  CLOB, 
    p_part_size   IN  NUMBER); 

然後,您需要制定出如何處理每個過程中做的邏輯。正如Colin所說,CLOB不是一個BLOB--所以我不確定你打算怎麼處理這個

+1

是的,我現在看到我不能把它們當作相同的東西。乍一看,我想我可以。 – 2009-09-02 14:17:31

2

愚蠢的問題首先,你是否真的改變包中的程序來接受CLOB? CLOB不能與BLOB互換。

It is possible to convert a CLOB to BLOB

create or replace procedure CLOB2BLOB (p_clob in out nocopy clob, p_blob in out nocopy blob) is 
-- transforming CLOB â BLOB 
l_off number default 1; 
l_amt number default 4096; 
l_offWrite number default 1; 
l_amtWrite number; 
l_str varchar2(4096 char); 
begin 
    begin 
    loop 
     dbms_lob.read (p_clob, l_amt, l_off, l_str); 

     l_amtWrite := utl_raw.length (utl_raw.cast_to_raw(l_str)); 
     dbms_lob.write(p_blob, l_amtWrite, l_offWrite, 
     utl_raw.cast_to_raw(l_str)); 

     l_offWrite := l_offWrite + l_amtWrite; 

     l_off := l_off + l_amt; 
     l_amt := 4096; 
    end loop; 
    exception 
     when no_data_found then 
     NULL; 
end; 
end; 

Example by Victor on OTN forums)。