SELECT fname, lname, pcode FROM cust WHERE id = 234;
SELECT fname, lname, pcode FROM cust WHERE id = 332;
as
begin
update emp
set sal=sal*2
where empno = p_empno;
commit;
end;
/
TYPE cursortype IS REF CURSOR;
cur_temp cursortype;
BEGIN
OPEN cur_temp FOR('select * from site where site_id=:1')
USING 91;
LOOP
FETCH cur_temp
INTO c_temp;
EXIT WHEN cur_temp%NOTFOUND;
EXECUTE IMMEDIATE 'insert into b values (:1)'
USING c_temp.site_id;
END LOOP;
CLOSE cur_temp;
COMMIT;
END;
对于需要用 INTO 的地方,可以如下使用
i
number(6);
execute immediate
'select count(*) from table_a where a =:1'
into i using 89;
××××××××但在pl/sql中,动态sql并不是这样的,即使使用了变量i ×××××××××××××××××××××××××
SQL> create table D ( id varchar(10));
SQL> declare
2 i number;
3 sqlstr varchar(2000);
4 begin
5 for i in 1..1000 loop
6 sqlstr :=' insert into d values('||to_char(i)||')';
7 execute immediate sqlstr;
8 end loop;
9 end;
10 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.68
这段代码同样是执行了1000条insert语句,但是每一条语句都是不同的,因此Oracle会把每条语句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用绑定变量将循环中的语句改为
SQL> declarev
2 i number;
3 sqlstr varchar(2000);
4 begin
5 for i in 1..1000 loop
6 sqlstr :=' insert into d values(:i)';
7 execute immediate sqlstr using i;
8 end loop;
9 end;
10 /
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.18
这样执行的效率就高得多了。
本文介绍在Oracle数据库中如何使用绑定变量来减少SQL语句的硬解析次数,从而提高执行效率。详细对比了硬解析和软解析的过程,并给出了具体的SQL与PL/SQL示例。
169

被折叠的 条评论
为什么被折叠?



