我试图创建一个字符串,供在execute_immediate语句中使用以插入表中。 使用的列之一是BLOB类型。 我使用'||' 运算符以追加列并构建sql。 BLOB类型似乎不适用于'||'。 查看示例代码(非原始代码)和错误
declare
FIRST_NAME varchar2(10);
PICTURE blob; -- blob type
TEMP_STR varchar2(2000);
begin
FIRST_NAME := 'Arun';
-- a blob is created
DBMS_LOB.CREATETEMPORARY(PICTURE, true);
[cc]-- 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
);
pre>
请帮忙。 我想要的是动态执行插入语句以将BLOB值插入表的选项。
您遇到的问题是因为您试图连接字符串和Blob。 您可以使用dmbs_lob.substr替换图片,但这不是可行的解决方案。 使用@vincents代码,该代码更安全并且不太可能破坏您的图片。
即使使用动态SQL,也应使用绑定变量。 问题解决了。
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注入的影响
谢谢文森特。 那完成了我的工作。