【发布时间】: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