ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB - 在 regexp_substr 函数中使用 clob
ORA-00932: inconsistent datatypes: expected - got CLOB - while using clob in regexp_substr function
我正尝试在 regexp_substr 函数中使用 CLOB 变量,如下所示
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select regexp_substr(clob_variable,'[^~]+', 1, level) from dual
connect by regexp_substr(clob_variable, '[^~]+', 1, level) is not null
)
clob_variable
是 CLOB 类型,包含 ~ 分隔的 ID。
执行更新语句时出现以下错误:
ORA-00932: inconsistent datatypes: expected - got CLOB
我们可以将 CLOB 与 RegExp 一起使用吗?如果没有,有没有办法将 CLOB 值转换为表格格式?
数据应从 CLOB
转换为字符串(CHAR
或将 Tab_ID
列视为 INTEGER
的数字类型),例如
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN
(
SELECT TO_NUMBER(REGEXP_SUBSTR(clb, '[^~]+', 1, level))
FROM (SELECT clb
FROM t -- the other table with CLOB column
CONNECT BY level <= CEIL(DBMS_LOB.GETLENGTH(clb) / 4000))
CONNECT BY level <= REGEXP_COUNT(clb, '~') + 1
AND PRIOR SYS_GUID() IS NOT NULL
)
regexp_substr
returns 如果您的第一个输入参数是 CLOB,则为 CLOB,但您无法使用 in
或 =
将 CLOB 的内容与任何内容进行比较。因此,您需要将返回的 CLOB 转换为 TAB_ID
.
的数据类型
所以如果你的TAB_ID是数字类型,它应该是:
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select to_number(to_char(regexp_substr(clob_variable,'[^~]+', 1, level))
from dual
connect by level<=regexp_count(clob_variable, '[^~]+')
)
如果您的 TAB_ID 是 varchar2 或 char:
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select to_char(regexp_substr(clob_variable,'[^~]+', 1, level)
from dual
connect by level<=regexp_count(clob_variable, '[^~]+')
)
更新:
对于此类事情,使用 collections 而不是连接字符串要好得多。只需创建自己的 collection,例如:
create or replace type numbers as table of number;
/
并将您的数字列表绑定为 collection,因此您的查询将如下所示:
select * from tablename where id in (select * from table(:numbers))
在查询中使用 collection 的示例:
SQL> select * from table(numbers(1,2,3,4));
COLUMN_VALUE
------------
1
2
3
4
试试这个:
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select replace(dbms_lob.substr(regexp_substr(clob_variable,'[^~]+~', 1, level)), '~', '') from dual
connect by dbms_lob.compare(regexp_substr(clob_variable,'[^~]+~', 1, level), empty_clob() ) != 0
)
我正尝试在 regexp_substr 函数中使用 CLOB 变量,如下所示
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select regexp_substr(clob_variable,'[^~]+', 1, level) from dual
connect by regexp_substr(clob_variable, '[^~]+', 1, level) is not null
)
clob_variable
是 CLOB 类型,包含 ~ 分隔的 ID。
执行更新语句时出现以下错误:
ORA-00932: inconsistent datatypes: expected - got CLOB
我们可以将 CLOB 与 RegExp 一起使用吗?如果没有,有没有办法将 CLOB 值转换为表格格式?
数据应从 CLOB
转换为字符串(CHAR
或将 Tab_ID
列视为 INTEGER
的数字类型),例如
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN
(
SELECT TO_NUMBER(REGEXP_SUBSTR(clb, '[^~]+', 1, level))
FROM (SELECT clb
FROM t -- the other table with CLOB column
CONNECT BY level <= CEIL(DBMS_LOB.GETLENGTH(clb) / 4000))
CONNECT BY level <= REGEXP_COUNT(clb, '~') + 1
AND PRIOR SYS_GUID() IS NOT NULL
)
regexp_substr
returns 如果您的第一个输入参数是 CLOB,则为 CLOB,但您无法使用 in
或 =
将 CLOB 的内容与任何内容进行比较。因此,您需要将返回的 CLOB 转换为 TAB_ID
.
所以如果你的TAB_ID是数字类型,它应该是:
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select to_number(to_char(regexp_substr(clob_variable,'[^~]+', 1, level))
from dual
connect by level<=regexp_count(clob_variable, '[^~]+')
)
如果您的 TAB_ID 是 varchar2 或 char:
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select to_char(regexp_substr(clob_variable,'[^~]+', 1, level)
from dual
connect by level<=regexp_count(clob_variable, '[^~]+')
)
更新: 对于此类事情,使用 collections 而不是连接字符串要好得多。只需创建自己的 collection,例如:
create or replace type numbers as table of number;
/
并将您的数字列表绑定为 collection,因此您的查询将如下所示:
select * from tablename where id in (select * from table(:numbers))
在查询中使用 collection 的示例:
SQL> select * from table(numbers(1,2,3,4));
COLUMN_VALUE
------------
1
2
3
4
试试这个:
UPDATE TableName
SET Tab_DATE = SYSDATE
WHERE Tab_ID IN (
select replace(dbms_lob.substr(regexp_substr(clob_variable,'[^~]+~', 1, level)), '~', '') from dual
connect by dbms_lob.compare(regexp_substr(clob_variable,'[^~]+~', 1, level), empty_clob() ) != 0
)