1

我正在尝试在 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

4

1 回答 1

1

它是类型号——至少如果你运行一个真实的语句,而不仅仅是解释一个。作为快速检查,如果您这样做:

EXEC :X := 'X';

然后您将按预期得到“ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误”。

我认为,混淆在于您假设:X解释的查询中使用了您声明的本地绑定变量。但是您可以使用:1or :Zexplain 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条目。

于 2019-01-28T18:14:52.273 回答