Это номер типа - по крайней мере, если вы выполняете реальное утверждение, а не просто объясняете его.В качестве быстрой проверки, если вы сделаете:
EXEC :X := 'X';
, вы получите «ORA-06502: PL / SQL: ошибка числа или значения: ошибка преобразования символа в число», как и ожидалось.
Я думаю, что путаница заключается в том, что вы предполагаете, что :X
в объясненном запросе использует объявленную вами локальную переменную связывания.Но вы можете использовать :1
или :Z
для explain plan
, и он все равно будет работать и отображать ту же информацию.
Когда вы объясняете сначала, значение связывания не фиксируется и незнать тип привязки, поэтому по умолчанию он равен varchar2
:
explain plan for SELECT /*ABC1*/ * FROM test1v where rownum = :X;
Explained.
select sbc.datatype_string, sbc.was_captured, sbc.value_string
from gv$sql s
join gv$sql_bind_capture sbc on sbc.sql_id = s.sql_id
where s.sql_text like '%ABC1%';
DATATYPE_STRING WAS_CAPTURED VALUE_STRING
--------------- ------------ ------------
VARCHAR2(32) NO
Если вы на самом деле выполняете запрос, а не просто объясняете его, значение привязки теперь фиксируется - отображаются обе версии:
SELECT /*ABC1*/ * FROM test1v where rownum = :X;
ABC
----------
1
select sbc.datatype_string, sbc.was_captured, sbc.value_string
from gv$sql s
join gv$sql_bind_capture sbc on sbc.sql_id = s.sql_id
where s.sql_text like '%ABC1%';
DATATYPE_STRING WAS_CAPTURED VALUE_STRING
--------------- ------------ ------------
VARCHAR2(32) NO
NUMBER YES 1
Я подозреваю, что вы выполнили запрос в обычном режиме, а затем добавили комментарий, чтобы найти его идентификатор SQL и информацию о привязке;но при этом вы сделали другой запрос, который был проанализирован отдельно, и привязка не была зафиксирована в этот момент.Но вы увидите то же самое, если сначала выполните запрос - сначала будет записана версия number
, но версия плана объяснения все равно получит запись varchar2
.