Использование типа BLOB в динамическом SQL в Oracle - PullRequest
0 голосов
/ 13 января 2012

Я пытаюсь создать строку для использования в операторе 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); </p>

<pre><code>-- 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;
</code>

ОШИБКА

Отчет об ошибке: 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 в таблицу.

1 Ответ

2 голосов
/ 13 января 2012

Даже с динамическим 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
...