ORA-22835:太小缓冲区和奥拉-25137:数据的价值的范围

0

的问题

我们正在使用的软件有限Oracle的能力。 我需要过滤器,通过CLOB领域通过确保它具有具体价值。 通常情况下,外部的该软件我会做这样的:

DBMS_LOB.SUBSTR(t.new_value) = 'Y'

然而,这并不是支持所以我试图使用 CAST 代替。 我已经尝试了许多不同的尝试,但迄今为止这些都是我的发现:

该软件有一个内置查询检查/验证程序和这些是那些显示为无效:

DBMS_LOB.SUBSTR(t.new_value)
CAST(t.new_value AS VARCHAR2(10))
CAST(t.new_value AS NVARCHAR2(10))

然而,验证程序不接受这些:

CAST(t.new_value AS VARCHAR(10))
CAST(t.new_value AS NVARCHAR(10))
CAST(t.new_value AS CHAR(10))

不幸的是,尽管验证程序可以让这些家伙去过的,当运行查询来获取数据,我得到 ORA-22835: Buffer too small 当使用 VARCHARNVARCHAR. 我得到 ORA-25137: Data value out of range 当使用 CHAR.

还有其它的方式我可以尝试来检查我的CLOB领域具有具体价值,当筛选的数据? 如果不是,我怎么修复我的当前问题?

database oracle
2021-11-23 16:17:40
2

最好的答案

1

误差你得到了指示,甲骨文是尝试应用的 CAST(t.new_value AS VARCHAR(10)) 一排在哪里 new_value 拥有超过10字符。 有意义的,鉴于你的说明 new_value 是一个通用的审计领域具有的价值观从大量不同的表与各种各样的数据的长度。 鉴于这一点,你会需要的结构查询的方式,部队的优化,以减少所设置的行你要申请的 cast 以下只是那些 new_value 只有一个单字之前加 cast.

不知道什么样的范围的软件你就可使用提供了结构化你的代码,我不知道什么选择你已经在那里。 要知道,这取决于如何强大,你需要这个,优化程序具有相当的灵活选择适用谓词和功能上的投影中的一个任意的顺序。 所以即使你找到一个办法,作一次,它可以停止工作在未来的统计数据时改变或数据库升级和Oracle决定选择一个不同的计划。

2021-11-24 16:59:52
0

使用这样的数据

create table tab1(col clob);
insert into tab1(col) values (rpad('x',3000,'y'));

你需要用到的 dbms_lob.substr(col,1) 得到的 第一个 字符的(默认 offset=1)

select dbms_lob.substr(col,1) from tab1;

DBMS_LOB.SUBSTR(COL,1)
----------------------
x

注意, 默认 amount (=长度)的子字符串 32767 所以仅仅使用 DBMS_LOB.SUBSTR(COL) 将返回的比你更多的期望。

CAST 对于 CLOB 串的铸造的长度,但是(如你所指出)返回的例外 ORA-25137: Data value out of range 如果原来的字符串longert,铸造的长度。

为记录在案的 CAST 声明

投不直接支持任何LOB的数据类型。 当你使用铸转换CLOB值为一个字符数据的类型或BLOB价值为原始数据的类型、数据库隐含地将LOB值字或原始数据,然后明确地把得到的数值为目标的数据类型。 如果所得到的价值大于目标类型,然后将数据库返回的一个错误。

2021-11-23 17:06:33

不幸的是,即使后添加偏移,查询验证程序不认识 DBMS_LOB.SUBSTR() 所以我不能使用。 我以为 CAST 能够切串因为我们还不得不使用一种解决方法 TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) 和它的工作。 它摆脱的时间部分。 我希望我们可以做类似的东西对于这一个。
Patrick Gregorio

是的,这工作 VARCHAR 但可惜不对 CLOB 我更新的答复。 @PatrickGregorio
Marmite Bomber

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................