它是类型号——至少如果你运行一个真实的语句,而不仅仅是解释一个。作为快速检查,如果您这样做:
EXEC :X := 'X';
然后您将按预期得到“ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误”。
我认为,混淆在于您假设:X
解释的查询中使用了您声明的本地绑定变量。但是您可以使用:1
or :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 ID 和绑定信息;但是在这样做时,您将其设为了一个不同的查询,该查询被单独解析,并且此时未捕获绑定。但是,如果您先运行查询,您会看到同样的情况 - 首先number
捕获版本,但解释计划版本仍然会获得一个varchar2
条目。