绑定变量的疑问
时间: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并没有自动绑定为什么?
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行。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28