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
)