Конвертация VARHAR2 -> BLOB

A.K.
Дата: 15.11.2008 00:01:01
Заинтересовал с теоретической точки зрения вопрос неявного преобразования VARCHAR2 в BLOB.
Согласно таблице неявных преобразований типов, и ее аналога для PL/SQL, указанные типы несовместимы.
Тем не менее, при выполнении блока:
declare
  s varchar2(20) := 'Hello world!';
begin
  insert into mytable (blobfield) values (s);
end;
/
вместо того чтобы отвергнуть код на этапе компиляции, возникает ошибка ORA-01465, что свидетельствует о попытке выполнения неявного пребразования из VARCHAR2 в BLOB через RAW.
Я невнимательно доку читаю, или она в данном случае расходится с действительностью? Где-то говорится о возможности таких цепочек преобразований (и по каким правилам они в этом случае строятся)?
andrey_anonymous
Дата: 15.11.2008 16:10:53
Как а счет классической ошибки новичков типа to_date(to_date())?
A.K.
Дата: 15.11.2008 16:20:07
andrey_anonymous, не вижу аналогии. TO_DATE принимает в качестве аргумента CHAR|VARCHAR2, а в упомянутой таблице как раз говорится о том, что DATE может неявно преобразовываться в CHAR. Все однозначно, логично и понятно.

Здесь же получается, что оператор принимает BLOB-аргумент, а подают ему на вход CHAR. Алгоритм, по которому Oracle решает, образно говоря, совместить спрос и предложение через третий тип, мне не понятна.
andrey_anonymous
Дата: 15.11.2008 16:28:12
A.K.
Алгоритм, по которому Oracle решает, образно говоря, совместить спрос и предложение через третий тип, мне не понятна.

Ну не сказал бы что все так однозначно.
Все-таки надо различать hex-строку, являющуюся, по сути, символьным представлением RAW и, собственно, строку типа "Hello, world"...
A.K.
Дата: 15.11.2008 17:46:33
andrey_anonymous
Все-таки надо различать hex-строку, являющуюся, по сути, символьным представлением RAW и, собственно, строку типа "Hello, world"...

Тут как раз различать не надо. Я же не утверждаю, что приведенный оператор должен успешно выполниться. Напротив, удивляюсь, почему он вообще пытается что-то куда-то преобразовать.

Единственное приходящее в голову объяснение такое - Oracle рассматривает оператор insert into table (blob) values (...) как бы как "перегруженный":
insert into table (blob) values (blob)
insert into table (blob) values (raw)
Тогда все встает на свои места, и преобразование char->raw(->blob) не вызывает вопросов. Хотелось бы, правда, ссылок на документацию.