将BLOB / CLOB作为参数传递给PL / SQL函数

时间:2009-09-02 13:52:27

标签: sql database oracle plsql

我的程序包中有这个程序:

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'

有没有办法编写一个程序,可以将这些类型作为参数?某种超类可能吗?

2 个答案:

答案 0 :(得分: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);

然后,您需要弄清楚每个程序中的操作逻辑。正如科林所说,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)。