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

Posted

技术标签:

【中文标题】将 BLOB/CLOB 作为参数传递给 PL/SQL 函数【英文标题】:Passing BLOB/CLOB as parameter to PL/SQL function 【发布时间】:2009-09-02 13:52:26 【问题描述】:

我的包裹中有这个程序:

过程 pr_export_blob(
    p_name IN VARCHAR2,
    p_blob 在 BLOB 中,
    p_part_size IN NUMBER);

我希望参数 p_blob 是 BLOB 或 CLOB。

当我用 BLOB 参数调用这个过程时,一切都很好。当我用 CLOB 参数调用它时,我得到编译错误:

PLS-00306:调用“pr_export_blob”时参数的数量或类型错误

有没有办法编写一个可以将其中任何一种类型作为参数的过程?也许是某种超类?

【问题讨论】:

【参考方案1】:

为什么不直接重载过程以实现 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 - 所以我不确定你打算用它做什么

【讨论】:

是的,我现在明白了,我不能对它们一视同仁。乍一看,我以为我可以。【参考方案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).

【讨论】:

以上是关于将 BLOB/CLOB 作为参数传递给 PL/SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章

将文件作为参数传递给 Docker 容器

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

将数组中的所有值作为参数传递给函数

将'select from dual'作为参数传递给java可调用语句

将列表作为参数传递给 udf 方法

.Net 将对象列表作为参数传递给 JQuery