[20121102]PLSQL中的绑定变量.txt

[20121102]PLSQL中的绑定变量.txt
    以前曾经遇到一个sql语句提交给开发,开发没有找到,最终确定是问题语句在PLSQL中,实际上PLSQL转化为大写,
加上自己没有注意.实际上SQL语句在PLSQL中,一些好像被"格式化一样",我举一个例子:
1.测试环境:
SQL> select * from v$version where rownum
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
SQL> select * from dept ;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        50 TEST           TEST
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

2.建立测试例子:
create or replace procedure test_bind
as
v_deptno  number;
v_dname   varchar2(14);
v_loc     varchar2(13);
v_deptno1  number;
v_dname1   varchar2(14);
v_loc1     varchar2(13);
cursor c_dept is select deptno,dname from dept order by deptno;
begin
 open c_dept;
loop
 fetch c_dept into v_deptno,v_dname;
 exit when c_dept%NOTFOUND;
 select loc into v_loc from dept where deptno=v_deptno and dname=v_dname;
    Select loc into v_loc from dept 
where deptno=v_deptno 
and dname=v_dname;
    v_deptno1 := v_deptno;
    v_dname1  := v_dname;
    Select loc into v_loc from dept where deptno=v_deptno1 
and dname=v_dname;
Select loc 
into v_loc from dept where deptno=v_deptno
and dname=v_dname1;
Select 
loc 
into v_loc1 from dept where deptno=v_deptno1
and dname=v_dname1;
end loop;
end;
/
3.测试:
alter session set events '10046 trace name context forever,level 12';
exec test_bind
alter session set events '10046 trace name context off';

4.查看跟踪文件:
SQL ID: fq1jkwcmsx57d
Plan Hash: 2852011669
SELECT LOC
FROM
 DEPT WHERE DEPTNO=:B2 AND DNAME=:B1

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        5      0.00       0.00          0          0          0           0
Execute     25      0.00       0.00          0          0          0           0
Fetch       25      0.00       0.00          0          2          0          25
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       55      0.00       0.00          0          2          0          25
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84     (recursive depth: 1)
Rows     Row Source Operation
-------  ---------------------------------------------------
      1  TABLE ACCESS BY INDEX ROWID DEPT (cr=2 pr=0 pw=0 time=0 us cost=1 size=18 card=1)
      1   INDEX UNIQUE SCAN PK_DEPT (cr=1 pr=0 pw=0 time=0 us cost=0 size=0 card=1)(object id 73200)

--可以发现全部换成了大写,并且都转化为1条语句,分析5次,共执行了25,不管sql语句如何写,带入的参数如何,都转化为:B2和:B1.

				
时间: 2024-07-31 22:54:08

[20121102]PLSQL中的绑定变量.txt的相关文章

Oracle中如何绑定变量

oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析. 一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决. 之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,这些内存区域是不能被同时修改.当一个sql语句提交后,oracle会首先检查一下共享

[20170929]& 代替冒号绑定变量.txt

[20170929]& 代替冒号绑定变量.txt --//我昨天看链接,http://orasql.org/2017/09/27/ampersand-instead-of-colon-for-bind-variables/ --//重复测试: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -

[20150812]关于抓取绑定变量.txt

[20150812]关于抓取绑定变量.txt --通过视图v$sql_bind_capture以及DBA_HIST_SQLBIND可以抓取到sql语句的绑定变量.受到一些参数的限制,曾经写过一篇: [20130410]v$sql_bind_capture和隐含参数_bind_capture_area_size.txt http://blog.itpub.net/267265/viewspace-758175/ SCOTT@test> @ver1 PORT_STRING              

[20120726]建立约束和使用绑定变量.txt

[20120726]建立约束和使用绑定变量.txt 昨天检查awr报表文件,发现:select condition from cdef$ where rowid=:1这条语句执行次数很高,因为查询的where条件使用rowid=:1,应该不会是用户的程序执行,而是某种递归的调用. 直接在google输入select condition from cdef$ where rowid=:1,发现如下链接:http://jonathanlewis.wordpress.com/2006/12/14/co

[20130918]12c FETCH FIRST和绑定变量.txt

[20130918]12c FETCH FIRST和绑定变量.txt http://connormcdonald.wordpress.com/2013/09/11/12c-fetch-first/ 重复测试: @ver BANNER                                                                               CON_ID ------------------------------------------------

关于sql_profile中的绑定变量

使用sql_profile来调优一些紧急的性能sql可以起到立竿见影的效果,如果sql语句本身结构就很清晰,简单,略作修改就能得到调优后的sql语句. 但是如果语句中含有绑定变量,如果要得到调优后的sql_id就有些困难了. 比如我们存在下面的sql语句. SELECT NVL(SUM(CUST.WEIGHT), 0) TOTAL_WEIGHT   FROM BL1_CUSTOMER CUST, BL1_CYCLE_CUSTOMERS CYC_CUST  WHERE CYC_CUST.PERIO

关于pl/sql中的绑定变量

在看关于shared pool的文档时,必定会提到绑定变量,也能够通过几个简单的例子对绑定变量带来影响有深刻的认识,但是在工作中,可能有时候我们就忘了绑定变量的影响了,其实有时候一个很小的变动就会导致性能几十几百倍的提升. 简单用跟一个实例来说明. 我们先清空shared pool,排除其它的运行语句带来的影响. SQL>alter system flush shared_pool; 然后我们创建一个表t,使用cats的方式创建,只有2个字段.SQL>create table t as sel

[20161002]绑定变量的分配长度6.txt

[20161002]绑定变量的分配长度6.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标. --一般如果绑定变量有多个字段在分配占用空间时长度变化,这样生成的子光标会增加. --我以前的测试字符串长度变化是32,32+96=128,32+96+1872=2000.也就是分4个段 1-32,33-128,129-2000,2001-4000. --相关链接: http://blog.itpub.net/267265/viewspace-1993495/ http:

oracel中sql语句和pl/sql语句使用绑定变量

关于绑定变量的用法: 之前的文章介绍了绑定变量对于系统的重要性,这里对绑定变量的使用做进一步的分析和说明. 1)在sql语句中如何带入bind value SQL> variable x number; SQL> exec :x:=100; PL/SQL procedure successfully completed. SQL> select * from t where id=:x; no rows selected SQL> exec :x:=101; SQL> sel