它是类型号——至少如果你运行一个真实的语句,而不是仅仅解释一个。作为快速检查,如果您这样做:
EXEC :X := 'X';
然后您将按预期得到“ORA-06502: PL/SQL: numeric or value error: character to number conversion error”。
我认为,令人困惑的是,您假设解释查询中的 :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 ID 和绑定信息;但是在这样做时,您将其设置为 different 查询,该查询被单独解析,并且此时未捕获绑定。但是,如果您先运行查询,您会看到同样的情况 - 首先捕获了 number 版本,但解释计划版本仍然获得了 varchar2 条目。