在 Oracle 的动态 SQL 中使用 BLOB 类型

Posted

技术标签:

【中文标题】在 Oracle 的动态 SQL 中使用 BLOB 类型【英文标题】:Using BLOB type in dynamic SQL in Oracle 【发布时间】:2012-01-13 08:51:15 【问题描述】:

我正在尝试创建一个字符串,用于在 execute_immediate 语句中插入表。使用的列之一是 BLOB 类型。我正在使用“||”运算符来追加列并构建 sql。 BLOB 类型似乎不适用于“||”。查看示例代码(非原创)和错误

声明
    FIRST_NAME varchar2(10);
    图片斑点; -- 斑点类型
    TEMP_STR varchar2(2000);
开始
    FIRST_NAME := '阿伦';
    -- 创建一个 blob
    DBMS_LOB.CREATETEMPORARY(图片,真);

-- next line works
insert into BLOB_TEST (PERSON_NAME,PHOTO) values (FIRST_NAME,PICTURE);

-- creating the string
TEMP_STR := 'insert into BLOB_TEST values (''' || first_name||''''||','||PICTURE||')';
-- just to view the string
DBMS_OUTPUT.PUT_LINE(TEMP_STR); 

/* code to be done */
-- execute immediate(temp_str); 
end;

错误

错误报告: ORA-06550:第 9 行,第 17 列: PLS-00306:调用“||”时参数的数量或类型错误 ORA-06550:第 9 行,第 5 列: PL/SQL:语句被忽略 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:

My table BLOB_TEST is create table BLOB_TEST ( PERSON_NAME varchar2(20), PHOTO blob );

请帮忙。我想要的是动态执行插入语句以将 BLOB 值插入表的选项。

【问题讨论】:

你的问题来了,因为你试图连接一个字符串和一个 blob。您可以使用dmbs_lob.substr 对图片进行细分,但这不是一个可行的解决方案。使用@vincent 的代码,这样更安全,不会破坏你的图片。 【参考方案1】:

即使使用动态 SQL,您也应该使用 bind variables。问题解决了。

SQL> CREATE TABLE blob_test (PERSON_NAME VARCHAR2(10), PHOTO BLOB);

Table created.

SQL> DECLARE
  2     FIRST_NAME VARCHAR2(10);
  3     PICTURE    BLOB; -- blob type
  4     TEMP_STR   VARCHAR2(2000);
  5  BEGIN
  6     FIRST_NAME := 'Arun';
  7     DBMS_LOB.CREATETEMPORARY(PICTURE, TRUE);
  8     INSERT INTO BLOB_TEST (PERSON_NAME, PHOTO) VALUES (FIRST_NAME, PICTURE);
  9     TEMP_STR := 'insert into BLOB_TEST values (:person,:myblob)';
 10     execute immediate(temp_str) using first_name, picture;
 11  END;
 12  /

PL/SQL procedure successfully completed.

不使用绑定变量是非常罕见的。使用绑定变量可以保证:

    如果使用另一组参数再次执行查询,则可以重复使用优化器计划 您的代码不会受到 SQL 注入的影响

【讨论】:

谢谢文森特。那完成了我的工作。

以上是关于在 Oracle 的动态 SQL 中使用 BLOB 类型的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中Blob和Clob

oracle查看blob字段

如何使用 PL/SQL 读取 Oracle 目录的所有文件并更新 BLOB 列

ORACLE数据库BLOB如何转化类型

使用 SQL 返回存储在 oracle blob 列中的文件的可读“文件大小”的优雅方法是啥?

使用delphi向oracle中写入大数据blob文件,文件大小1G左右,有没有啥方法能够解决呢?