Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
SQL, PL/SQL, T-SQL: запросы, DML DDL операторы, пакеты, процедуры, функции, триггеры и последовательности.
  • Страница:
  • 1
  • 2

ТЕМА: Помогите oracle с insert в поле BLOB

Помогите oracle с insert в поле BLOB 22 янв 2012 10:58 #4196

  • WindilaS
  • WindilaS аватар Автор темы
  • Посетитель
  • Посетитель
Oracle 11.2g

Есть таблица:
CREATE TABLE TERM_VERSIONS_DATA
(
  FILE_NUMBER          INTEGER NOT NULL ,
  FILE_SIZE            INTEGER NOT NULL ,
  FILE_DATA            BLOB NOT NULL ,
  ID_VERSION           INTEGER NOT NULL 
)
  TABLESPACE USER_TS
  STORAGE ( 
    BUFFER_POOL DEFAULT
   );

Есть процедура:
create or replace procedure Insert_Term_Version_Data
(
 p_ID_VERSION  IN NUMBER,
 p_FILE_NUMBER IN NUMBER,
 p_FILE_SIZE   IN NUMBER,
 p_FILE_DATA   IN OUT NOCOPY BLOB,
 RETURN_VALUE OUT NUMBER
)
is
-- ДОБАВЛЕНИЕ ДАННЫХ ВЕРСИИ ПО ДЛЯ ТЕРМИНАЛА
 PRAGMA AUTONOMOUS_TRANSACTION; -- АВТОНОМНАЯ ТРАНЗАКЦИЯ
 v_SQLCODE NUMBER;
 v_SQLERRM VARCHAR2(2048);
 v_BLOB    BLOB;
begin
 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
 RETURN_VALUE := 0;
 
 IF (p_FILE_NUMBER IS NULL) OR
    (p_FILE_SIZE IS NULL) OR
    (p_ID_VERSION IS NULL) OR
    (p_FILE_DATA IS NULL ) THEN
  RETURN_VALUE := 152;
  COMMIT;
  RETURN;-- НЕВЕРНЫЕ ВХОДНЫЕ ПАРАМЕТРЫ, ВЫХОД
 END IF;
 
 INSERT INTO TERM_VERSIONS_DATA (ID_VERSION, FILE_NUMBER, FILE_SIZE, FILE_DATA)
        VALUES (p_ID_VERSION, p_FILE_NUMBER, p_FILE_SIZE, EMPTY_BLOB())
        RETURNING FILE_DATA INTO v_BLOB; 
        
 dbms_lob.open(v_BLOB, DBMS_LOB.LOB_READWRITE);
 DBMS_LOB.APPEND(v_BLOB, p_FILE_DATA);
 dbms_lob.close(v_BLOB);
 
 COMMIT; -- ЗАВЕРШЕНИЕ ТРАНЗАКЦИИ
 
 EXCEPTION
 WHEN OTHERS THEN
 BEGIN
  ROLLBACK; -- ОТКАТ ТРАНЗАКЦИИ
  RETURN_VALUE := 153;
  v_SQLCODE := SQLCODE;
  v_SQLERRM := SQLERRM;
  INSERT INTO JOURNAL (ID_JOURNAL, RECV_DATE, "USER", DESCRIPT, OBJ_NAME, ERROR_MSG, PARAM_1, PARAM_2, PARAM_3) 
         VALUES(SEQ_JOURNAL.NEXTVAL, 
                SYSDATE, 
                USER, 
                'Ошибка при добавлении записи в TERM_VERSIONS_DATA', 
                'Insert_Term_Version_Data',
                v_SQLCODE || ' : ' || v_SQLERRM,
                TO_CHAR(p_ID_VERSION),
                TO_CHAR(p_FILE_NUMBER),
                TO_CHAR(p_FILE_SIZE));
  COMMIT; -- ЗАВЕРШЕНИЕ ТРАНЗАКЦИИ                             
 END;            
end Insert_Term_Version_Data;

Если добавлятся данные в BLOB меньше 32к, то все нормально проходит, а если больше, то ничего не происходит либо входной параметр p_FILE_DATA = NULL.

Пордскажите как быть.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Помогите oracle с insert в поле BLOB 22 янв 2012 10:58 #4197

  • Ilfoer
  • Ilfoer аватар
  • Посетитель
  • Посетитель
Не понял в чем вопрос:
declare
  b blob;
  retval number;
  buf raw(32000);
begin
	buf := utl_raw.cast_to_raw(rpad('00',32000,'00'));
	b:=buf;
  dbms_lob.writeappend(b,32000,buf);
  dbms_lob.writeappend(b,32000,buf);
  dbms_lob.writeappend(b,32000,buf);
 
	Insert_Term_Version_Data
(
 p_ID_VERSION=>2,
 p_FILE_NUMBER=>20,
 p_FILE_SIZE=>200,
 p_FILE_DATA=>b,
 RETURN_VALUE=>retval);
end;
/
 
PL/SQL procedure successfully completed
select dbms_lob.getlength(file_data) from TERM_VERSIONS_DATA;
 
DBMS_LOB.GETLENGTH(FILE_DATA)
-----------------------------
                       128000
 
SQL>

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Помогите oracle с insert в поле BLOB 22 янв 2012 10:59 #4198

  • WindilaS
  • WindilaS аватар Автор темы
  • Посетитель
  • Посетитель

Ilfoer пишет: Не понял в чем вопрос:

declare
  b blob;
  retval number;
  buf raw(32000);
begin
	buf := utl_raw.cast_to_raw(rpad('00',32000,'00'));
	b:=buf;
  dbms_lob.writeappend(b,32000,buf);
  dbms_lob.writeappend(b,32000,buf);
  dbms_lob.writeappend(b,32000,buf);
 
	Insert_Term_Version_Data
(
 p_ID_VERSION=>2,
 p_FILE_NUMBER=>20,
 p_FILE_SIZE=>200,
 p_FILE_DATA=>b,
 RETURN_VALUE=>retval);
end;
/
 
PL/SQL procedure successfully completed
select dbms_lob.getlength(file_data) from TERM_VERSIONS_DATA;
 
DBMS_LOB.GETLENGTH(FILE_DATA)
-----------------------------
                       128000
 
SQL>

Вопрос в том: Как мне записать файл размером болье 1 Мб в поле типа BLOB?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Помогите oracle с insert в поле BLOB 22 янв 2012 11:00 #4199

  • Ilfoer
  • Ilfoer аватар
  • Посетитель
  • Посетитель

Как мне записать файл размером болье 1 Мб в поле типа BLOB?



Так в чем проблема-то???
declare
  b blob;
  retval number;
  buf raw(32000);
begin
	buf := utl_raw.cast_to_raw(rpad('00',32000,'00'));
	b:=buf;
  for i in 1..100 loop
    dbms_lob.writeappend(b,32000,buf);
  end loop;
 
	Insert_Term_Version_Data
(
 p_ID_VERSION=>2,
 p_FILE_NUMBER=>20,
 p_FILE_SIZE=>200,
 p_FILE_DATA=>b,
 RETURN_VALUE=>retval);
end;
/
 
PL/SQL procedure successfully completed
select dbms_lob.getlength(file_data) from TERM_VERSIONS_DATA;
 
DBMS_LOB.GETLENGTH(FILE_DATA)
-----------------------------
                      3232000
 
SQL>

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Помогите oracle с insert в поле BLOB 22 янв 2012 11:01 #4200

  • WindilaS
  • WindilaS аватар Автор темы
  • Посетитель
  • Посетитель
Т.е. либо это глюк приложения либо глюк моей процедуры.
Этот скрипт у меня тоже сработал. А вот когда из приложения процедуру вызываешь, то она отрабатывает, но данные не добавляет.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Помогите oracle с insert в поле BLOB 22 янв 2012 11:03 #4201

  • Ilfoer
  • Ilfoer аватар
  • Посетитель
  • Посетитель

А вот когда из приложения процедуру вызываешь


Собственно, вот и ответ - из приложения вызывать надо правильно :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2