我正在尝试在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;
我正在使用SQL Developer 17.4.0.355
答案 0 :(得分:1)
它是数字类型-至少如果您运行真实的语句,而不仅仅是解释一个。快速检查,如果您这样做:
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 ID和绑定信息;但是这样做时,您使其成为一个 different 查询,该查询被单独解析,并且此时未捕获到绑定。但是,如果首先运行查询,您会看到相同的结果-首先捕获number
版本,但解释计划版本仍会得到varchar2
条目。