2009-09-02 4 views
3

をBLOB/CLOBを渡す:は、私は私のパッケージ、私は、この手順を持つPL/SQL関数にパラメータとして

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

私は、BLOBまたはCLOBのいずれかにパラメータp_blobのためにしたいと思います。

このプロシージャをBLOBパラメータでコールすると、すべて正常です。私はCLOBパラメータでそれを呼び出すと、私はコンパイルエラーを取得:

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

プロシージャを作成する方法はあり、それは、パラメータとして、これらのタイプのいずれかを取ることができますか?何らかのスーパークラスかもしれない?

答えて

4

は、なぜあなたはちょうど同様

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); 

あなたは、各手順のをどうするかのロジックをうまくする必要がありますCLOBの実装を持って手続きをオーバーロードしないでください。コリンが言っているように、CLOBはBLOBではないので、あなたがこれで何をする予定なのかよく分かりません。

+1

はい、私は同じように扱うことはできません。一見、私はできると思った。 –

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)。

関連する問題