2009-09-02 8 views
3

J'ai cette procédure i mon paquet:passant blob/CLOB en tant que paramètre à la fonction PL/SQL

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

Je voudrais pour le paramètre p_blob être soit blob ou CLOB. Lorsque j'appelle cette procédure avec le paramètre BLOB, tout va bien. Quand je l'appelle avec le paramètre CLOB, j'obtiens l'erreur de compilation:

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

Est-il possible d'écrire une procédure, qui peut prendre l'un de ces types comme paramètre? Une sorte de superclasse peut-être?

Répondre

4

Pourquoi ne pas surcharger simplement la procédure d'avoir une mise en œuvre de CLOB ainsi

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

Vous devrez ensuite travailler la logique de ce qu'il faut faire avec dans chaque procédure. Comme le dit Colin, un CLOB n'est pas un BLOB - donc je ne suis pas sûr de ce que vous envisagez de faire avec ce

+1

Oui, je vois maintenant que je ne peux pas les traiter de la même manière. À première vue, je pensais pouvoir le faire. –

2

Stupide question d'abord, êtes-vous réellement changer la procédure dans le paquet pour accepter un CLOB? Une CLOB n'est pas interchangeable avec un 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).

Questions connexes