【问题标题】:Large tiff file is not inserting大型 tiff 文件未插入
【发布时间】:2020-07-13 12:42:18
【问题描述】:

我有一个函数,它有一些参数。其中一个参数是 clob,我从前端屏幕传递一个 tiff 文件。在前端,tiff 数据嵌入到 xaml 中并调用该函数。我正在尝试将 tiff 文件存储到表中。我可以插入长度小于 32768 的 tiff。当我尝试插入的长度超过该长度时,它不会插入到表中。我什至无法尝试找到文件的长度。它什么也没显示。我试过把它放在绑定变量中并立即执行插入语句。没有插入任何东西。

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 时函数异常关闭。

【问题讨论】:

  • 你得到什么返回值 - 也许文件已经存在于表中?还是你有例外? (不相关,但是在你 raise 之后你的异常处理程序中的代码无法访问;为什么你使用 CLOB 而不是 BLOB?)
  • @Alex Poole 嗨,先生。感谢您的响应。没有异常抛出。不,文件不存在。插入列具有 blob 数据类型。当我尝试使用 plsql 开发人员测试窗口通过传递超过 32768 的字符串长度来检查函数时,会抛出字符串文字太长的错误。 declare v clob; begin v:='string>32768'; select insert_tiff_data('5282659','T',v,'') from dual; end; 而不是那个字符串,小于那个值。如果我在函数中替换 clob 而不是 blob,我会收到一个错误,即 调用函数时参数的数量或类型错误
  • 您正在尝试将 tiff 文件的内容复制并粘贴为字符串?完全使用字符串听起来是错误的,但无论如何你都会达到 32k 的限制,并且根本不会调用该函数,除非你在匿名块中构造一个 CLOB。
  • 您可能在从前端和 xaml 传递文件数据时遇到同样的问题。不知道你是怎么做的,语言,工具等;但你需要看看函数调用是如何进行的。无论如何,这不是函数的问题 - 问题在于你如何调用它。

标签: oracle plsql insert tiff clob


【解决方案1】:

您需要查看 Oracle 提供的包 DBMS_LOB,以处理大型对象(blob、clob、...)。如果您的数据超过 32767 字节,则需要分段构建。 (32767 是一次可以传输的最大块大小)。

您的异常处理也有问题。 Raise_Application_Error 立即使用指定的错误代码和消息终止当前块,随后的任何代码,将其传递给异常块或任何更高块的异常块或退出过程,同一块中 RAE 之后的任何代码都不会执行。因此,您的函数无法返回 D 或 E 或将 ll_count 设置为 0。此外,立即执行的 return 语句将退出该过程并且不执行以下代码。我没有进行详尽的验证,但我认为当前函数也不能返回 F。我为demonstration 准备了一个小提琴。它会根据您的逻辑(使用参数作为值)自行模式化,但可能无法准确获取逻辑。

【讨论】:

  • 感谢先生的回复。实际上还有另一个具有相同 clob 列的表,来自 FE 的文件正在插入该表中。我们只是从 t1 中选择 clob_col 到 var1 中;并尝试插入 tiff_data 表。当我尝试在匿名块中插入> 32k并测试窗口时它的工作。但是当我从前端运行时它不工作,而是从前端插入表t1。在匿名或测试窗口中,我可以找到文件的长度dbms_output.put_line(dbms_lob.getlength(as_app_sign));----->58752 这太奇怪了。
猜你喜欢
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
相关资源
最近更新 更多