[20171021]绑定变量的分配长度8.txt

简介: [20171021]绑定变量的分配长度8.txt --//前几天跟别人讨论,提到我写的测试链接 http://blog.itpub.net/267265/viewspace-2125825/ --//很有意思.
[20171021]绑定变量的分配长度8.txt

--//前几天跟别人讨论,提到我写的测试链接
http://blog.itpub.net/267265/viewspace-2125825/
--//很有意思.当时实际上自己也是在没仔细探究,实际上也很混乱.今天重复测试看看.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> create table t (c1 varchar2(4000),c2 varchar2(4000),c3 varchar2(4000),c4 varchar2(4000),c5 varchar2(4000));
Table created.

--//前面我的测试
--字符串长度变化是32,32+96=128,32+96+1872=2000.也就是分4个段 1-32,33-128,129-2000,2001-4000.
--这样如果2个字段varchar2(4000),理论讲可以出现4*4=16个子光标,测试看看是否正确。

SYS@test> alter system set "_cursor_bind_capture_area_size"=3999 scope=memory;
System altered.
--//改变 _cursor_bind_capture_area_size,保证能捕获绑定变量的值。

2.测试脚本一:

SCOTT@test01p> alter system flush shared_pool;
System altered.

declare
v_c1 varchar2(4000);
v_c2 varchar2(4000);
begin
   v_c1 := rpad('0',32);
   v_c2 := rpad('0',32);
   execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;

   v_c1 := rpad('1',32);
   v_c2 := rpad('1',128);
   execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;

   v_c1 := rpad('2',128);
   v_c2 := rpad('2',32);
   execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;

-- v_c1 := rpad('3',128);
-- v_c2 := rpad('3',128);
-- execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;
end;
/
commit;
--确定sql_id='2z6faqbzrf9jg'.

SCOTT@test01p>  select sql_id, child_number, executions  from v$sql where sql_id = '2z6faqbzrf9jg';
SQL_ID        CHILD_NUMBER EXECUTIONS
------------- ------------ ----------
2z6faqbzrf9jg            0          1
2z6faqbzrf9jg            1          1
2z6faqbzrf9jg            2          1

SCOTT@test01p>  @ bind_cap 2z6faqbzrf9jg ''
C200
-----------------------------------------------------------------------------------------------------------------------------------------
select count(*) from t where c1=:instring1 and c2=:instring2

SQL_ID        CHILD_NUMBER WAS NAME                   POSITION MAX_LENGTH LAST_CAPTURED       DATATYPE_STRING VALUE_STRING
------------- ------------ --- -------------------- ---------- ---------- ------------------- --------------- ---------------------------
2z6faqbzrf9jg            0 YES :INSTRING1                    1         32 2017-10-21 20:37:54 VARCHAR2(32)    0
                           YES :INSTRING2                    2         32 2017-10-21 20:37:54 VARCHAR2(32)    0

                         1 YES :INSTRING1                    1         32 2017-10-21 20:37:54 VARCHAR2(32)    1
                           YES :INSTRING2                    2        128 2017-10-21 20:37:54 VARCHAR2(128)   1

                         2 YES :INSTRING1                    1        128 2017-10-21 20:37:54 VARCHAR2(128)   2
                           YES :INSTRING2                    2        128 2017-10-21 20:37:54 VARCHAR2(128)   2
6 rows selected.

--//注意看我第2次执行带入参数是
v_c1 := rpad('2',128);
v_c2 := rpad('2',32);

--//而实际上CHILD_NUMBER=2.显示类型都是VARCHAR2(128).我当时的理解就是第2次执行时赋值v_c2 := rpad('1',128);
--//这样在第3次执行时,要扫描找到合适的子光标来执行语句,很明显前面2个都不合适.建立CHILD_NUMBER=2的子光标.这样选择
--//前面最大的长度继承下来.

3.测试脚本二:
SCOTT@test01p> alter system flush shared_pool;
System altered.

declare
v_c1 varchar2(4000);
v_c2 varchar2(4000);
begin
   v_c1 := rpad('0',32);
   v_c2 := rpad('0',32);
   execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;

   v_c1 := rpad('1',32);
   v_c2 := rpad('1',2000);
   execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;

   v_c1 := rpad('2',128);
   v_c2 := rpad('2',32);
   execute immediate 'select count(*) from t where c1=:instring1 and c2=:instring2' using v_c1,v_c2 ;

end;
/

--//执行这样的脚本,第3次执行脚本bind_cap,抓取的类型应该是VARCHAR2(128),VARCHAR2(2000).
--//继续测试看看.

SCOTT@test01p> @ bind_cap 2z6faqbzrf9jg ''
C200
-------------------------------------------------------------------------------------------------------------------------
select count(*) from t where c1=:instring1 and c2=:instring2

SQL_ID        CHILD_NUMBER WAS NAME                   POSITION MAX_LENGTH LAST_CAPTURED       DATATYPE_STRING VALUE_STRING
------------- ------------ --- -------------------- ---------- ---------- ------------------- --------------- -------------
2z6faqbzrf9jg            0 YES :INSTRING1                    1         32 2017-10-21 21:00:24 VARCHAR2(32)    0
                           YES :INSTRING2                    2         32 2017-10-21 21:00:24 VARCHAR2(32)    0

                         1 YES :INSTRING1                    1         32 2017-10-21 21:00:24 VARCHAR2(32)    1
                           YES :INSTRING2                    2       2000 2017-10-21 21:00:24 VARCHAR2(2000)  1

                         2 YES :INSTRING1                    1        128 2017-10-21 21:00:24 VARCHAR2(128)   2
                           YES :INSTRING2                    2       2000 2017-10-21 21:00:24 VARCHAR2(2000)  2
6 rows selected.

--//看CHILD_NUMBER=2的行,正好符合我的推测.
--//oracle这样设计的目的一定程度减少了子光标的数量.我前面的测试这样最多产生7个子光标.也许上次没讲明白,做为一个补充.



目录
相关文章
|
Shell 开发工具
写一个脚本/root/bin/argsnum.sh,接受一个文件路径作 为参数;如果参数个数小于1,则提示用户“至少应该给一个 参数”,并立即退出;如果参数个数不小于1,则显示第一个 参数所指向的文件中的空白行数
写一个脚本/root/bin/argsnum.sh,接受一个文件路径作 为参数;如果参数个数小于1,则提示用户“至少应该给一个 参数”,并立即退出;如果参数个数不小于1,则显示第一个 参数所指向的文件中的空白行数
80 1
模拟实现库函数strcat--将源字符串的副本追加到目标字符串(理解内存重叠问题)
模拟实现库函数strcat--将源字符串的副本追加到目标字符串(理解内存重叠问题)
编写一个程序,如果名为Exercise12_15.txt的文件不存在,则创建该文件。使用文本I/O将随机产生的100个整数写入文件,文件中的整数由空格分开。从文件中读回数据并以升序显示数据。
编写一个程序,如果名为Exercise12_15.txt的文件不存在,则创建该文件。使用文本I/O将随机产生的100个整数写入文件,文件中的整数由空格分开。从文件中读回数据并以升序显示数据。
294 0
有一个长度是10的数组,数组内有10个人名,要求去掉重复的人名,并输出
有一个长度是10的数组,数组内有10个人名,要求去掉重复的人名,并输出
324 0
GetUserName()第二个参数中指明缓冲区长度
GetUserName()第二个参数中指明缓冲区长度
126 0
|
Oracle 关系型数据库
[20171203]平均长度和虚拟列.txt
[20171203]平均长度和虚拟列.txt --//昨天看链接https://blog.dbi-services.com/doag-2017-avg_row_len-with-virtual-columns/ --//重复测试看看.
947 0
|
SQL Oracle 关系型数据库
[20171019]绑定变量的分配长度7.txt
[20171019]绑定变量的分配长度7.txt --//如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标。 --//参考连接: http://blog.
1073 0
|
Oracle 关系型数据库 SQL
[20161002]绑定变量的分配长度6.txt
[20161002]绑定变量的分配长度6.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标。 --一般如果绑定变量有多个字段在分配占用空间时长度变化,这样生成的子光标会增加。
761 0
|
SQL 测试技术
[20161001]绑定变量的分配长度5.txt
[20161001]绑定变量的分配长度5.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标。 --一般如果绑定变量有多个字段在分配占用空间时长度变化,这样生成的子光标会增加。
657 0
[20160313]绑定变量的分配长度4.txt
[20160313]绑定变量的分配长度4.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标。 --参考连接: http://blog.
784 0