Как определить колонку с типом данных BLOB в приватной временной таблице (PTT)?
При написании различных процедур столкнулся с проблемой, что когда пытаюсь в приватной временной таблице (PTT) определить колонку с типом данных BLOB, вот так:
create private temporary table ora$ptt_test (
id number, userdata blob);
То получаю ошибку:
ORA-14451: unsupported feature with temporary table
14451. 00000 - "unsupported feature with temporary table"
*Cause: An attempt was made to create an IOT, specify physical attributes,
specify partition or parallel clause.
*Action: do not do that.
Если закомментировать колонку userdata, то выполнится без ошибок.
Всё, что смог найти в документации, что в основном ограничения при создании PTT те же самые, как для публичных временных таблиц (GTT). Но это не совсем соответствует действительности, потому что попробовал создать публичную временную таблицу с BLOB колонкой - никаких ошибок, так работает.
Свободный перевод How to define BLOB column in Private Temporary Table? от участника @Gregor Cerinšek
Ответы (1 шт):
Воспроизводится также для CLOB колонок. Скорее всего баг в документации (см. PRIVATE TEMPORARY).
Основная особенность приватныx временных таблиц то, что они создаются как структуры данных в памяти, конкретно в памяти сессии PGA (Program Global Area). Возможно есть сложности с управлением структурами памяти для LOB типов данных. Несколько похоже на проблематику: creating a PTT in a PDB with the in-memory option enabled.
Но с другой стороны, можно же создавать коллекции с LOB типами данных в PL/SQL, которые используют те же самые структуры памяти. И кроме того, сами LOB типы данных состоят из двух частей, локатора (LOB locator, своего рода ссылка), и собственно данных (value), а в колонке таблицы сохраняется как раз только локатор. Так что, не видно серьёзных барьеров связанных с обработкой LOB типов данных в памяти.
Исходя из вышеизложенного, возможно имеет место только временное ограничение, которое будет устранено в последующих релизах. Конечно это не решает проблему, поэтому остаётся предложить обратиться в тех. подержку Oracle, а пока пользоваться публичными временными таблицами:
create global temporary table gtt_test (
id number, userdata blob);
Global temporary TABLE created.