Не вставляется большой файл TIFF - PullRequest
0 голосов
/ 13 июля 2020

У меня есть функция, у которой есть параметр. Один из параметров - clob, куда я передаю tiff-файл с экрана внешнего интерфейса. В интерфейсе данные tiff встраиваются в xaml и вызывают функцию. Я пытаюсь сохранить файл TIFF в таблице. Я могу вставить tiff, длина которого меньше 32768. Когда я пытаюсь вставить больше, он не вставляется в таблицу. Я даже не могу найти длину файла. Ничего не показывает. Я попытался поместить его в переменную привязки и немедленно выполнить оператор вставки. ничего не вставлено.

CREATE OR REPLACE FUNCTION insert_tiff_data
(
as_fno      varchar2(10),
as_a_code      IN amc.amc_code%TYPE,
as_app_sign clob,
as_sataus        IN VARCHAR2
) RETURN VARCHAR2 IS
--declared variables here
BEGIN
ls_file := as_a_code || '_' || as_fno || '.TIF';

BEGIN
    BEGIN
        SELECT COUNT(*)
          INTO ll_count
          FROM tiff_data
         WHERE filename = ls_file AND
               image_type = 'S' AND
               fid = as_fno;
    EXCEPTION
        WHEN OTHERS THEN
            raise_application_error(-20780,
                        excep);
            ll_count := 0;
    END;
    IF ll_count >= 1 THEN
        RETURN 'Z';
    ELSE
        IF length(as_app_sign) > 0 THEN
            BEGIN
                INSERT INTO tiff_data
                    (filename,
                     image_type,
                     amc_code,
                     fid,
                     image_date,
                     image,
                     editor_id,
                     xy_cor)
                VALUES
                    (ls_file,
                     'S',
                     as_a_code,
                     as_fno,
                     SYSDATE,
                    plf_base64_clob_to_blob(as_app_sign),
                     '',
                     '');
                IF SQL%ROWCOUNT > 0 THEN
                    RETURN 'Y';
                ELSE
                    RETURN 'C';
                END IF;
            EXCEPTION
                WHEN OTHERS THEN
                    raise_application_error(-20781,
                                excep);
                    RETURN 'D';
            END;
        
        
        END IF;
    END IF;
EXCEPTION
    WHEN OTHERS THEN
        raise_application_error(-20782,
                    excep);
        RETURN 'E';
END;
RETURN 'F';
END insert_tiff_data;

Я думаю, что функция закрылась ненормально при попытке доступа к этой переменной as_app_sign .

1 Ответ

0 голосов
/ 14 июля 2020

Вам нужно проверить прилагаемый Oracle пакет DBMS_LOB , для обработки большого объекта (blob, clob, ...). Если ваши данные превышают 32767 байт, вам нужно будет разбить их на сегменты. (32767 - это самый большой размер блока, который может быть передан за один раз). У вас также есть проблема с обработкой исключений. Raise_Application_Error немедленно завершает текущий блок с указанным кодом ошибки и сообщением, любым последующим кодом, передавая его в блок исключения или блок исключения любого более высокого блока или вне процедуры, любой код после RAE в том же блоке не выполняется. Таким образом, ваша функция неспособна или возвращает D или E, или устанавливает ll_count в 0. Кроме того, выполненный оператор return немедленно завершает процедуру, и следующий код не выполняется. Я не проверил полностью, но не думаю, что текущая функция способна возвращать F. Я собрал скрипку для демонстрации . Он формирует себя после вашего logi c (с использованием параметров для значений), но, вероятно, не получает точно logi c.

...