0

我正在尝试创建一个字符串以在 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 值插入表的选项。

4

1 回答 1

2

即使使用动态 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.

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

  1. 如果使用另一组参数再次执行查询,则可以重用优化器计划
  2. 您的代码不会受到 SQL 注入的影响
于 2012-01-13T09:14:28.143 回答