源码-Oracle数据库管理-第十七章-动态SQL语句-Part5(动态SQL的性能优化技巧)

2017-01-09 19:25:29来源:作者:人点击

源码-Oracle数据库管理-第十七章-动态SQL语句-Part5(动态SQL的性能优化技巧)。

--17.5 动态SQL的性能优化技巧--17.5.1 用绑定变量改善性能--使用字符串拼接的方法来执行UPDATE语句,执行速度慢DECLARE   v_sal NUMBER:=3000;           --保存调薪后的薪资   v_empno NUMBER:=7369;   v_sql VARCHAR2(500);   --保存动态SQL语句的字符串BEGIN   v_sql:='UPDATE emp SET sal='||v_sal||'WHERE empno='||v_empno;   EXECUTE IMMEDIATE v_sql;END;   --使用绑定变量来执行UPDATE语句,具有显著的性能和安全性优势DECLARE   v_sal NUMBER:=3000;           --保存调薪后的薪资   v_empno NUMBER:=&empno;   v_sql VARCHAR2(500);   --保存动态SQL语句的字符串BEGIN   v_sql:='UPDATE emp SET sal=:1 WHERE empno=:2';   EXECUTE IMMEDIATE v_sql USING v_sal,v_empno;END;   --17.5.2 重复的绑定占位符--执行动态SQL语句,为重复的val_in传入多次作为绑定变量DECLARE   col_in     VARCHAR2(10):='sal';     --列名   start_in   DATE;                    --起始日期   end_in     DATE;                   --结束日期   val_in     NUMBER;                --输入参数值   dml_str    VARCHAR2 (32767)      :=    'UPDATE emp SET '         || col_in         || ' = :val        WHERE hiredate BETWEEN :lodate AND :hidate        AND :val IS NOT NULL';         --动态SQL语句BEGIN   EXECUTE IMMEDIATE dml_str               USING val_in, start_in, end_in, val_in;END;select * from emp_history order by update_date desc;--代码17.18 执行PL/SQL动态语句时的重复绑定占位符的处理DECLARE   col_in     VARCHAR2(10):='sal';     --列名   start_in   DATE;                    --起始日期   end_in     DATE;                   --结束日期   val_in     NUMBER;                --输入参数值   dml_str    VARCHAR2 (32767):= 'BEGIN         UPDATE emp SET '         || col_in         || ' = :val        WHERE hiredate BETWEEN :lodate AND :hidate        AND :val IS NOT NULL;        END;';                        --动态PL/SQL语句BEGIN   --执行动态SQL语句,占位符:val只需要指定一次val_in即可   EXECUTE IMMEDIATE dml_str               USING val_in, start_in, end_in;END;--17.5.3 传递NULL参数--错误的写法BEGIN  EXECUTE IMMEDIATE 'UPDATE emp SET comm=:x'    USING NULL;END;--正确的写法DECLARE   null_comm NUMBER;           --定义一个未初始化的变量BEGIN  EXECUTE IMMEDIATE 'UPDATE emp SET comm=:x'    USING null_comm;           --将该变量作为绑定变量的值传入END;--17.5.4 动态SQL异常处理--代码17.19 在执行动态SQL时使用异常处理机制CREATE OR REPLACE PROCEDURE ddl_execution (ddl_string IN VARCHAR2)   AUTHID CURRENT_USER IS            --使用调用者权限BEGIN   EXECUTE IMMEDIATE ddl_string;        --执行动态SQL语句EXCEPTION   WHEN OTHERS                        --捕捉错误     THEN      DBMS_OUTPUT.PUT_LINE (         --显示错误消息         '动态SQL语句错误:' || DBMS_UTILITY.FORMAT_ERROR_STACK);      DBMS_OUTPUT.PUT_LINE (         --显示当前执行的SQL语句         '   执行的SQL语句为: "' || ddl_string || '"');      RAISE;END ddl_execution;BEGINddl_execution ('select pd from t_pd');END;

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台