+ -
当前位置:首页 → 问答吧 → 绑定变量的疑问

绑定变量的疑问

时间:2011-09-16

来源:互联网

有个疑问。在过程中使用绑定变量时,是不是只能使用动态SQL来实现,还是有其他的办法?如果不是在存储过程中是不是就不能使用绑定变量了?请举例!

作者: nmyangmz   发布时间: 2011-09-16

不是的,静态sql的变量自动绑定的,动态sql必须用using,DDL无法绑定

作者: dingjun123   发布时间: 2011-09-16

create or replace procedure pro_test1
is
v_num number;
v_date date:=to_date('2011-9-11','yyyy-mm-dd');
begin

select count(*) into v_num from tb_erp_fact_autopush_all_day where date_id=v_date order by city_id;

end;

上面的是一个静态SQL,v_date变量并没有自动绑定,10046的结果就硬解析。


create or replace procedure pro_test
is
v_num number;

v_date date:=to_date('2011-9-11','yyyy-mm-dd');
v_sql varchar2(1000);
begin

v_sql:='select count(*)  from tb_erp_fact_autopush_all_day where date_id=:1 order by city_id';

execute immediate v_sql into v_num using v_date ;

end;

修改后这是个绑定变量的SQL,10046的结果就软解析。


上面的两个例子中静态SQL并没有自动绑定为什么?

作者: nmyangmz   发布时间: 2011-09-16

难道静态SQL不能在存储过程中实现自动绑定吗?

作者: nmyangmz   发布时间: 2011-09-16

你看的trace不对吧

CREATE OR REPLACE PROCEDURE bind_test
AS
v_num number;
v_date date:=to_date('2011-9-11','yyyy-mm-dd');
begin
select count(*) into v_num from all_objects  where created=v_date;
end;
/

trace里能看到


SQL ID: d0jqwwmxzw7nk
Plan Hash: 3989362717
SELECT COUNT(*)
FROM
ALL_OBJECTS WHERE CREATED=:B1

v$sql里也能看到

[email=dingjun123@ORADB]dingjun123@ORADB[/email]> SELECT sql_text FROM v$sql WHERE sql_text LIKE '%ALL_OBJECTS WHERE CREATED%';
SQL_TEXT
----------------------------------------------------------------------------------------------------
SELECT COUNT(*) FROM ALL_OBJECTS WHERE CREATED=:B1
SELECT * FROM v$sql WHERE sql_text LIKE '%ALL_OBJECTS WHERE CREATED%'
SELECT sql_text FROM v$sql WHERE sql_text LIKE '%ALL_OBJECTS WHERE CREATED%'
已选择3行。

作者: dingjun123   发布时间: 2011-09-16

热门下载

更多