gpt4 book ai didi

oracle - 为什么这封电子邮件被截断了?

转载 作者:行者123 更新时间:2023-12-02 03:32:26 25 4
gpt4 key购买 nike

我使用以下程序发送电子邮件:

procedure write_clob(p_connection in out nocopy connection, p_clob in out nocopy clob)
is
v_len integer;
v_index integer;
begin
v_len := dbms_lob.getlength(p_clob);
v_index := 1;

while v_index <= v_len loop
utl_smtp.write_data(p_connection, dbms_lob.substr(p_clob, 32000, v_index));
v_index := v_index + 32000;
end loop;
end write_clob;

长电子邮件似乎被截断了。我测试了 v_len == 28811 的消息,它小于 32000。但是,我注意到如果我将缓冲区大小更改为 3200,它不会被截断:

procedure write_clob(p_connection in out nocopy connection, p_clob in out nocopy clob)
is
v_len integer;
v_index integer;
begin
v_len := dbms_lob.getlength(p_clob);
v_index := 1;

while v_index <= v_len loop
utl_smtp.write_data(p_connection, dbms_lob.substr(p_clob, 3200, v_index));
v_index := v_index + 3200;
end loop;
end write_clob;

我尝试了一些其他尺寸,例如30000 和 28000,但它仍然被截断。请注意,28000 小于消息长度 - 28811。此外,utl_smtp_write_data 接受 varchar2,最多允许 32767:

UTL_SMTP.WRITE_DATA (
c IN OUT NOCOPY connection,
data IN VARCHAR2 CHARACTER SET ANY_CS);

我可以只使用 3200 作为我的缓冲区大小,但我不希望在不了解发生了什么的情况下应用创可贴修复。

谁能帮我理解为什么会出现这种奇怪的行为?谢谢!

我正在使用 Oracle 11.2.0.3.0。

最佳答案

我们遇到了同样的问题,魔数(Magic Number)似乎是 2,000。如果您看到 3,200 有效,那么我猜您传递的是单字节字符数据,实际限制是 4,000。

在针对这个问题敲打我们的头脑之后,我有一个“呃?”时刻(完成不确定的问号)。我一直在阅读,写入数据的限制应为 32k,但调用 write_data() 时的变量类型是 varchar2。虽然 pl/sql 中的 varchar2 最多允许 32k,但我怀疑 database 4,000 字节的 varchar2 限制被强加在 utl_smtp.write_data() 函数中 - 无论由于某些内部限制,或者通过传入缓冲区的显式截断,我不知道。

我建议将您的 block 大小保持在 2,000 或更少,以避免任何双字节字符集问题。事实上,网络上的每个示例似乎都使用 1,900……一个奇数,它的存在可能追溯到 asktom.oracle.com 站点上 13 年前的代码:

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1739411218448#2624320100346519249

引用:

I wish I remembered why it was in 1900 byte chunks, but that was 9 years ago. I guess I should have been more specific with the comment.

Tyler

我发现这比我可能表达的更有趣。

关于oracle - 为什么这封电子邮件被截断了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25844731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com