在 SQL 开发人员中绑定变量 - 数据类型

Bind variables in SQL Developer - data type

我正在尝试在 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 开发者 17.4.0.355

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

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           

我怀疑你运行一个查询正常,然后加了个评论就能找到它的SQLID和绑定信息;但是在这样做的过程中,您使它成为一个 different 查询,该查询是单独解析的,并且此时没有捕获绑定。但是,如果您先 运行 查询,您会看到同样的事情 - 首先捕获 number 版本,但解释计划版本仍然获得 varchar2 条目。