PLSQL入门与精通(第47章:动态SQL的变量绑定)

37 篇文章 2 订阅
6 篇文章 1 订阅

这次就动态SQL中的绑定变量的使用进行说明。
这次内容和性能相关。

首先,让我们看一个不使用绑定变量的动态SQL的例子:
<情况1:动态的SQL的变量值作为连续字符串的情况>
SQL> CREATE OR REPLACE PROCEDURE GET_ENAME ( P_ID IN NUMBER,
2 P_NAME OUT VARCHAR2)
3 IS
4 V_NAME EMP.ENAME%TYPE;
5 BEGIN
6 //
7 --动态SQL:获取指定员工编号的员工名称
8 /
/
9 EXECUTE IMMEDIATE
10 'SELECT ENAME FROM EMP WHERE EMPNO = ’ || P_ID
11 INTO V_NAME;

12 //
13 --将该员工的名字返还给呼出方
14 /
/
15 P_NAME := V_NAME;
16 END;
17 /

程序已创建。

上边例子很简单,就是根据职员号码,找到相应职员,返回该职员名字。
这个查询用动态SQL实现的。

如果需要职员号码对应的职员名称取到,需要反复调用这个程序,每次调用吧不同的职员
号码传给这个程序。Oracle在处理这个程序的时候,每次都是一个不同的SQL,
所以这么处理性能就比较差:
第10行:动态SQL(字符串的SQL),SQL是通过字符串连接(||)吧数值连接起来,形成一个连续字符串的。
通过字符串连接(||)组装SQL的处理值生成动态SQL时,处理值不同,则QL语句也不同,Oracle处理的的时候
会生成不同的SQL去解释执行,不会当做统一个SQL语句共享使用。

例如,上述GET_NAME程序分别用不同的职员编号“100”和“200”来呼出的话,
被执行的动态SQL分别是以下的SQL。
SELECT ENAME FROM EMP WHERE EMPNO = 100 ←(SQL1)
SELECT ENAME FROM EMP WHERE EMPNO = 200 ←(SQL2)

这里,SQL1和SQL2不是同一个SQL语句,不能共享。

我们可以吧上边例子做如下修改,可以作为一个共享SQL去执行,性能就会提高很多:

<情况2:动态的SQL的变量值作为绑定变量使用>
SQL> CREATE OR REPLACE PROCEDURE GET_ENAME ( P_ID IN NUMBER,
2 P_NAME OUT VARCHAR2)
3 IS
4 V_NAME EMP.ENAME%TYPE;
5 BEGIN
6 //
7 --将动态SQL的值作为绑定变量使用
8 /
/
9 EXECUTE IMMEDIATE
10 ‘SELECT ENAME FROM EMP WHERE EMPNO = :EMPID’
11 INTO V_NAME USING P_ID;

12 //
13 --将该员工的名字返还给呼出方
14 /
/
15 P_NAME := V_NAME;
16 END;
17 /

程序已创建。

这里,如果将该程序分别用职员编号“100”和“200”进行呼出,尽管数值不同,SQL语句也是相同的。
SQL语句如下:
SELECT ENAME FROM EMP WHERE EMPNO = :EMPID ←SQL3

上述SQL3的语句与源代码的第9行的动态SQL语句相同。
其中的“:EMPID”部分是绑定变量的内容。
绑定变量的名称没有特别规定,但必须在开头加上冒号(:),
然后,绑定变量的值在第11行代码中用USING语句中指定绑定变量的值。

修安排注意的是,绑定变量事先不需要在PL/SQL块内进行声明(定义),因为他在(PL/SQL块)外侧有对应的绑定的变量。

不管“EMPID”的值是“100”还是“200”,在数据库中,“SELECT ENAME FROM EMP EMPNO=:EMPID”这句话都是相同的,
是一边改变处理的值一边反复使用执行的的。

由此,SQL解析处理只需要解析1次就可以了,所以性能会有所提高。

这就是本次内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值