Связывание переменных в SQL Developer - тип данных - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь использовать переменные связывания в SQL Developer.Проблема в том, что я не могу установить переменную на тип NUMBER - ее тип всегда установлен на VARCHAR2(32):

create view test1v as select 1 as abc from dual;
VARIABLE X NUMBER;
EXEC :X := 1;
explain plan for SELECT /*TOTO7*/ * FROM test1v where rownum = :X;

enter image description here

Я использую SQL Developer 17.4.0.355

1 Ответ

0 голосов
/ 28 января 2019

Это номер типа - по крайней мере, если вы выполняете реальное утверждение, а не просто объясняете его.В качестве быстрой проверки, если вы сделаете:

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.

...