在 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 类型的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PL/SQL 读取 Oracle 目录的所有文件并更新 BLOB 列