【发布时间】:2022-01-02 03:29:09
【问题描述】:
我们使用的软件具有有限的 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))
不幸的是,即使验证器允许这些验证器通过,当运行查询以获取数据时,我在使用 VARCHAR 或 NVARCHAR 时得到 ORA-22835: Buffer too small。我在使用CHAR 时得到ORA-25137: Data value out of range。
在过滤数据时,是否有其他方法可以尝试检查我的 CLOB 字段是否具有特定值?如果没有,我该如何解决我当前的问题?
【问题讨论】:
-
new_value有多长?将列声明为clob然后只在其中存储一个字符似乎很奇怪。您得到的错误意味着存储的值超过 10 个字符/字节长。它们是否可能超过 32k? -
@JustinCave
new_value跟踪更改为字段值,因此它是任意长度。它还跟踪可能包含大量字符的TEXT字段的更改。但我现在需要的只是一个文本,N或Y。 -
Oracle 没有
text数据类型。这些错误意味着您正在查看的值超过 10 个字符。根据软件正在执行的操作,您的cast可能会在您拥有的任何其他谓词之前应用,这些谓词将您感兴趣的行减少到仅具有单个数据字符的行。我不知道该软件是否让您能够控制它,但如果它甚至不允许您使用内置软件包,我会倾向于怀疑它。是否允许instr或substr? -
@JustinCave 抱歉,是的,Oracle 没有
TEXT- 我一直在混合使用 Oracle 和 MySQL。此外,查询验证器无法识别SUBSTR和INSTR。 -
@JustinCave 你所说的
CAST被应用之前 将行减少到我只感兴趣的内容似乎是这里的问题。我必须创建一个子查询来过滤行并且只获取我知道只包含一个字符的行。然后我做了CASTafter。如果你把它作为答案,我会接受它。谢谢!