regexp_substr
возвращает CLOB, если ваш первый входной параметр - CLOB, но вы не можете сравнивать содержимое CLOB с чем-либо, используя in
или =
. Поэтому вам нужно преобразовать возвращенные вами 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, '[^~]+')
)
Обновление: для таких вещей гораздо лучше использовать коллекции, а не конкатенированные строки. Просто создайте собственную коллекцию, например:
create or replace type numbers as table of number;
/
И свяжите вам список чисел как коллекцию, чтобы ваш запрос выглядел так:
select * from tablename where id in (select * from table(:numbers))
Пример использования коллекций в запросах:
SQL> select * from table(numbers(1,2,3,4));
COLUMN_VALUE
------------
1
2
3
4
person
Sayan Malakshinov
schedule
26.09.2020
SELECT dbms_lob.substr( my_clob, 4000, 1 ) FROM my_table;
- person paulsm4   schedule 26.09.2020