oracle使用变量可以带来的好处

合集下载

oracle的like变量的用法

oracle的like变量的用法

文章标题:探究Oracle中Like变量的用法及其应用1. 引言在Oracle数据库中,Like操作符是一种非常重要的文本匹配方法,它可以根据指定的模式来检索符合条件的数据。

本文将深入探讨Oracle 中Like变量的用法及其应用,帮助读者更好地理解和运用这一功能。

2. Like操作符的基本语法在Oracle中,Like操作符是用来进行模糊查询的,其基本语法为: SELECT column_nameFROM table_nameWHERE column_name LIKE pattern;其中,column_name表示要查询的列名,table_name表示要查询的表名,pattern表示匹配的模式。

3. Like操作符的常见使用方式1) 使用百分号(%)进行模糊匹配- SELECT * FROM employees WHERE last_name LIKE 'S%'; 会匹配以字母S开头的所有姓氏。

2) 使用下划线(_)进行单个字符匹配- SELECT * FROM employees WHERE last_name LIKE '_mit'; 会匹配第二个字母为m,第三个字母为i,最后一个字母为t的任意姓氏。

3) 结合百分号和下划线进行更复杂的模糊匹配- SELECT * FROM employees WHERE last_name LIKE 'S_m%'; 会匹配以字母S开头,第二个字母为m的长度大于等于3的所有姓氏。

4. Like操作符的高级应用除了基本的模糊匹配,Like操作符还可以结合正则表达式进行更为灵活的匹配,例如:- 使用[]对字符集进行匹配- 使用^表示以某个字符开头- 使用$表示以某个字符结尾- 使用|表示或- 使用()进行分组5. 个人观点和理解在实际的数据库应用中,Like操作符可以帮助我们更好地处理复杂的文本匹配需求,特别适用于需要模糊查询的情况。

玩转Oracle-PLSQL定义并使用变量

玩转Oracle-PLSQL定义并使用变量

Ⅰ、介绍:在编写pl/sql程序时候,可以定义变量和常量,在pl/sql中包括有:标量类型(scalar)复合类型(composite)参照类型(reference)lob(large object);㈠、标量:(scalar)常用的类型:在编写pl/sql的时候,如果要使用变量,需要在定义部分定义变量;pl/sql中定义变量和常量的语法如下:identifier [constant] datatype [ not null ] [:=|default expt]identifier :名称;constant :指定常量,需要指定他的初始值,而且他的值是不能够改变的;datatype:数据类型;not null ;指定变量不能为null;:= 给变量或是常量指定初始值;default:用于指定初始值;expr:指定初始值的pl/sql表达式,可以是文本、其他变量、函数等;①定义一个变长字符串:v_ename varchar2(20);②定义一个数:v_sal number(6,3);③定义一个数并给定初始值:v_sal number(5,3):=5.4④定义一个日期类型的数据:v_hitedate date;⑤定义一个bool变量,不能为null,初始值为false;v_valid boolean not null default false;㈡、标量:使用标量在定义好变量后就可以使用这些边玲了,这里需要说明的是pl/sql块为变量赋值不同于其他编程语言,需要使用:=符号;SQL> --下面以输入员工号,显示员工姓名等信息;SQL> declare2 c_tax_rate number(3,2):=0.03;3 --用户名;4 v_name varchar2(5);5 v_sal number(6,2);6 v_tax_sal number(6,2);7 begin8 --执行910 select ename ,sal into v_name , v_sal from emp where empno=&no;11 --计算所得税‘12 v_tax_sal:=v_sal*c_tax_rate;13 --输出;14 dbms_output.put_line('Name is : ' || v_name || ' sal is '||v_sal||' tax is '||v_tax_sal);15 end;16 /Enter value for no: 7788old 10: select ename ,sal into v_name , v_sal from emp where empno=&no; new 10: select ename ,sal into v_name , v_sal from emp where empno=7788; Name is : SCOTT sal is 3000 tax is 90PL/SQL procedure successfully completed.㈢、标量:使用%type类型;对于上面的pl/sql块有一个问题:如果员工的姓名操过了5个字符的话救护出错,为了降低pl/sql程序的维护工作量,可以使用%type属性定义变量,这样他会按照数据库列来确定你定义的变量类型和长度;标识符名称表明.列名%type;SQL> --下面以输入员工号,显示员工姓名等信息;SQL> declare2 c_tax_rate number(3,2):=0.03;3 --用户名;4 v_name emp.ename%type;5 v_sal emp.sal%type;6 v_tax_sal number(6,2);7 begin8 --执行910 select ename ,sal into v_name , v_sal from emp where empno=&no;11 --计算所得税‘12 v_tax_sal:=v_sal*c_tax_rate;13 --输出;14 dbms_output.put_line('Name is : ' || v_name || ' sal is '||v_sal||'tax is '||v_tax_sal);15 end;16 /Enter value for no: 7788old 10: select ename ,sal into v_name , v_sal from emp where empno=&no; new 10: select ename ,sal into v_name , v_sal from emp where empno=7788; Name is : SCOTT sal is 3000 tax is 90PL/SQL procedure successfully completed.SQL>Ⅱ、复合变量(composite);㈠、介绍:用于存放多个值的变量。

oracle存储过程declare用法

oracle存储过程declare用法

文章标题:深度解析Oracle存储过程中的declare用法在Oracle数据库中,存储过程是一种存储在数据库中的可以被多次调用的代码块,它能够完成特定的任务。

而declare则是在存储过程中的一个重要部分,用于声明变量、常量和类型。

今天,我们就来深度探讨一下Oracle存储过程中declare的用法,以便更好地理解和应用这一重要知识点。

1. 声明变量在Oracle存储过程中,declare关键字常常用来声明变量。

我们可以使用declare来声明一个整型变量x,语法如下:```sqlDECLAREx NUMBER;BEGIN-- 在这里可以使用x进行相关操作END;```在这个例子中,我们通过declare声明了一个名为x的整型变量。

这样,我们就可以在存储过程的其他部分使用x来完成相关操作。

2. 声明常量与声明变量类似,我们也可以使用declare来声明常量。

常量在存储过程中具有固定的数值,一旦赋值就不能被改变。

我们可以使用declare声明一个名为pi的常量,表示圆周率,语法如下:```sqlDECLAREpi CONSTANT NUMBER := 3.14159;BEGIN-- 在这里可以使用pi进行相关操作END;```在这个例子中,我们通过declare声明了一个名为pi的常量,并将其赋值为3.14159。

这样,我们就可以在存储过程的其他部分使用pi来完成相关操作。

3. 声明类型除了声明变量和常量,declare也可以用来声明类型。

在Oracle中,我们可以使用ROWTYPE和RECORD类型来声明自定义类型。

我们可以使用declare声明一个名为employee_record的类型,表示员工信息,语法如下:```sqlDECLARETYPE employee_record IS RECORD (id NUMBER,name VARCHAR2(50),salary NUMBER);emp_info employee_record;BEGIN-- 在这里可以使用emp_info进行相关操作END;```在这个例子中,我们通过declare声明了一个名为employee_record 的类型,它包含了id、name和salary三个字段。

变量的作用与意义

变量的作用与意义

变量的作用与意义变量是程序设计语言中的一个概念,用于存储和表示不同类型的数据。

它们在程序执行过程中可以被赋予不同的值,并且可以被多次使用。

变量的作用与意义非常重要,它们可以实现以下几个方面的功能。

1.存储数据:变量是用来存储数据的。

在程序执行的过程中,需要将各种类型的数据保存在内存中,变量可以提供一个容器来存放这些数据。

举例来说,一个计算器程序可能需要将用户输入的数字存储到一个变量中,以便进行计算。

2.赋值和操作数据:变量可以被赋予不同的值,并且可以被进行各种操作。

这样可以方便地对数据进行处理和修改。

例如,一个计算器程序可以使用变量来保存计算结果,并且在之后的计算中使用该结果。

3.数据传递:变量可以用于数据传递。

在程序的不同部分之间传递数据时,变量可以作为一个桥梁来传递数据。

这样可以实现数据在不同部分之间的交流和共享。

例如,一个函数可以通过参数传递变量的值,从而将数据传递给其他的函数。

4.代码重用:变量可以方便地重用。

在程序的不同部分中,我们可以使用同一个变量来保存不同的数据,并且可以对这些数据进行各种操作。

这样可以避免重复编写代码,提高代码的复用性和可读性。

5.动态性:变量具有动态性,可以根据需要进行动态分配和释放。

在程序执行的不同阶段,变量可以根据需要来创建和销毁。

这样可以灵活地管理内存空间,提高程序的效率。

6.命名和可读性:变量可以通过命名来标识和区分不同的数据。

通过合理命名变量,可以增加代码的可读性和可维护性。

良好的命名习惯可以使其他人更容易理解和使用代码。

总而言之,变量在程序设计中起到了非常重要的作用。

它们提供了一个用于存储和操作数据的容器,并且可以方便地传递数据和重用代码。

变量的合理使用可以提高程序的效率和可读性,并且减少代码的冗余。

因此,学习和理解变量的意义和作用对于程序员来说是至关重要的。

ORACLE绑定变量用法总结

ORACLE绑定变量用法总结

ORACLE绑定变量⽤法总结之前对ORACLE中的变量⼀直没个太清楚的认识,⽐如说使⽤:、&、&&、DEIFINE、VARIABLE……等等。

今天正好闲下来,上⽹搜了搜相关的⽂章,汇总了⼀下,贴在这⾥,⽅便学习。

==================================================================================在oracle 中,对于⼀个提交的sql语句,存在两种可选的解析过程, ⼀种叫做硬解析,⼀种叫做软解析.⼀个硬解析需要经解析,制定执⾏路径,优化访问计划等许多的步骤.硬解释不仅仅耗费⼤量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩⼤(即限制了系统的并发⾏),⽽且引起的问题不能通过增加内存条和cpu的数量来解决。

之所以这样是因为门闩是为了顺序访问以及修改⼀些内存区域⽽设置的,这些内存区域是不能被同时修改。

当⼀个sql语句提交后,oracle会⾸先检查⼀下共享缓冲池(shared pool)⾥有没有与之完全相同的语句,如果有的话只须执⾏软分析即可,否则就得进⾏硬分析。

⽽唯⼀使得oracle 能够重复利⽤执⾏计划的⽅法就是采⽤绑定变量。

绑定变量的实质就是⽤于替代sql语句中的常量的替代变量。

绑定变量能够使得每次提交的sql语句都完全⼀样。

1.sqlplus中如何使⽤绑定变量,可以通过variable来定义SQL> select * from tt where id=1;ID NAME---------- ----------------------------------------1 testSQL> select * from tt where id=2;ID NAME---------- ----------------------------------------2 testSQL> variable i number;SQL> exec :i :=1;PL/SQL 过程已成功完成。

编程中变量的作用和意义

编程中变量的作用和意义

编程中变量的作用和意义在计算机编程中,变量是一种非常重要的概念。

它们是用来存储和表示数据的容器,可以在程序中被多次使用和修改。

变量的作用和意义在编程中是不可忽视的,它们为程序提供了灵活性和可扩展性,使得程序能够处理各种不同的数据和情况。

1. 变量的定义和声明在编程中,变量的定义和声明是必不可少的步骤。

通过定义和声明变量,程序可以为数据分配内存空间,并给予其一个名称。

变量的定义通常包括数据类型和名称,而声明则是告诉编译器在程序中创建相应的变量。

2. 存储和表示数据变量的主要作用是存储和表示数据。

通过将数据存储在变量中,程序可以在需要的时候使用它们。

不同的数据类型可以存储不同种类的数据,如整数、浮点数、字符等。

变量的名称可以根据具体的应用场景来命名,以便更好地理解和使用。

3. 数据的处理和操作变量在编程中还可以用于数据的处理和操作。

通过对变量进行赋值、运算和修改,程序可以对数据进行各种操作。

例如,可以将两个变量相加并将结果存储在一个新的变量中,或者通过修改变量的值来改变程序的行为。

变量的处理和操作使得程序可以根据不同的需求和条件来执行不同的逻辑。

4. 程序的逻辑和控制变量在程序的逻辑和控制中起着重要的作用。

通过使用变量,程序可以根据不同的条件和情况来执行不同的代码块。

例如,可以使用一个布尔类型的变量来控制循环的执行,或者使用一个整数类型的变量来选择不同的分支。

变量的使用使得程序可以根据输入和运行时的状态来做出决策和控制流程。

5. 数据的传递和交互变量还可以用于数据的传递和交互。

通过将数据存储在变量中,程序可以将数据从一个地方传递到另一个地方。

例如,可以将一个变量作为函数的参数传递,或者将一个变量的值返回给调用者。

变量的传递和交互使得程序可以在不同的模块和组件之间共享和操作数据。

总结编程中变量的作用和意义是多方面的。

它们为程序提供了存储和表示数据的容器,使得程序可以处理各种不同的数据和情况。

通过对变量进行操作和修改,程序可以进行数据的处理和操作。

Oracle变量定义详解

Oracle变量定义详解

前言:使用变量可以保存计算机需要处理的数据,为了给该变量分配适当的内存空间,还需要指定数据类型,有的数据类型还需要指定长度,如字符串。

有些类型可以用于建表(如char),有些则不能(如boolean,rowtype)。

同样是字符串,建表时的限制为4000,在脚本中则为3万多。

简单语法:变量名数据类型;完整语法:变量名 [constant] 变量类型 [not null] [default 值 | :=值]其中“[ ]”表示可以不写,“|”表示任选其一。

下面给出变量定义及解释,数据类型先用建表时所用的数据类型:v1 char:说明:没有给出长度,所以v1只能保存一个字符。

超过了则会出错:数字或值错误 : 字符串缓冲区太小。

v2 varchar2(10);说明:v2最多只能保存10个字符。

如果不写长度,会出错:字符串长度限制在范围(1...32767)v3 number;说明:v3保存的数字范围非常大,几乎可以认为是没有限制的。

v4 number(5);说明:v4最多能够保存5位整数。

如果有小数,Oracle会自动四舍五入。

如果整数部分超过5位,则会报错:数字或值错误 : 数值精度太高。

v5 number(5,2);说明:v5最多能够保存3位整数,2位小数。

如果小数位不止2位,则Oracle会自动四舍五入。

整数位超过3位会报错,同上。

v6 date;说明:可以直接保存sysdate的值;如果是指定日期,则要用to_date来转化。

否则报错:文字与格式字符串不匹配。

定义了变量,变量的默认值为空,此时进行计算,结果一定为NULL。

所以变量必须初始化。

初始化有三种方式:v7 constant number := 100;说明:定义v7为常量,定义时就必须给定值。

然后在程序中就不能再对v7进行赋值了,否则会报错:表达式 'V7' 不能用作赋值目标。

v8 number default 10;说明:定义v8时就给定默认值10。

Oracle %TYPE变量

Oracle  %TYPE变量

Oracle %TYPE变量在声明变量时,除了可以使用Oracle规定的数据类型外,还可以使用%TYPE关键字定义变量类型。

%TYPE关键字的含义是声明一个与指定列名称相同的数据类型。

例如,下面的语句声明了一个与EMP表中ENAME列完全相同的数据类型:declarevar_name emp.ename%type;如果ENAME列的数据类型为V ARCHAR2(40),那么变量V AR_NAME的数据类型就是V ARCHAR2(40)。

下面的示例演示了如何使用%TYPE类型的变量从数据库中检索数据:SQL> set serveroutput onSQL> declare2 var_name emp.ename%type;3 var_no emp.empno%type;4 var_sal emp.sal%type;5 begin6 select empno,ename,sal7 into var_no,var_name,var_sal8 from emp9 where empno='7369';10 dbms_output.put_line(var_no || ' ' || var_name || ' ' || var_sal);11 end;12 /7369 SMITH 800PL/SQL 过程已成功完成。

在上面的PL/SQL程序中,主要使用了SELECT语句从EMP中检索数据。

该SELECT 语句与前面使用的SQL查询语句非常相似,惟一不同之外在于它多了一个INTO子句。

INTO 子句跟在SELECT子句后,表示从数据库检索的数值将保存在哪个变量中。

使用%TYPE定义变量有两个好处:首先,用户不必查看表中各个列的数据类型,就可以确保所定义的变量能够存储检索的数据;其次,如果对表的结构进行修改(例如,改变某一个列的数据类型),那么用户不必考虑对所定义的变量进行更改,而%TYPE类型的变量会自动调整。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中library cache的过度耗用以提高性能。

然刀子磨的太快,使起来锋利,却容易折断。

凡事皆有利弊二性,因地制宜,因时制宜,全在如何权衡而已。

本文讲述了绑定变量的使用方法,以及绑定变量的优缺点、使用场合。

一、绑定变量提到绑定变量,就不得不了解硬解析与软解析。

硬解析简言之即一条SQL语句没有被运行过,处于首次运行,则需要对其进行语法分析,语义识别,跟据统计信息生成最佳的执行计划,然后对其执行。

而软解析呢,则是由于在library cache已经存在与该SQL语句一致的SQL语句文本、运行环境,即有相同的父游标与子游标,采用拿来主义,直接执行即可。

软解析同样经历语法分析,语义识别,且生成hash value ,接下来在library cache搜索相同的hash value ,如存在在实施软解析。

有关更多的硬解析与软解析以及父游标,子游标请作如下参考:有关硬解析与软解析,请参考:oracle中的软解析和硬解析有关父游标、子游标,请参考:父游标、子游标及共享游标绑定变量首先其实质是变量,有些类似于我们经常使用的替代变量,替代变量使用&占位符,只不过绑定变量使用:替代变量使用时为&variable_para,相应的绑定变量则为:bind_variable_para通常一个SQL语句包含动态部分和静态部分,占位符实质是SQL语句中容易发生变化的部分,通常为其条件或取值范围。

动态部分在一般情况下(数据倾斜除外),对执行计划的生成的影响是微乎其微的。

故同一SQL语句不同的动态部分产生的执行计划都是相同的。

二、绑定变量的使用1、在SQLPlus中使用绑定变量[sql] view plaincopyprint?SQL> variable eno number; -->使用variable定义变量SQL> exec :eno:=7788;SQL> select ename,job,sal from emp where empno=:eno;ENAME JOB SAL---------- --------- ----------SCOTT ANALYST 3000SQL> col sql_text format a55SQL> select sql_id,sql_text,executions from v$sqlarea -->首次查询后在v$sqlarea保存父游标且执行次数EXECUTIONS为12 where sql_text like '%select ename,job,sal%' and sql_text not like '%from v$sql%';SQL_ID SQL_TEXT EXECUTIONS------------- ------------------------------------------------------- ----------dbc6vx6z6n1zv select ename,job,sal from emp where empno=:eno 1SQL> select sql_id,hash_value,child_number,sql_text from v$sql -->查询视图v$sql查看该SQL 对应的子游标,且CHILD_NUMBER为02 where sql_text like '%select ename,job,sal%' and sql_text not like '%from v$sql%';SQL_ID HASH_VALUE CHILD_NUMBER SQL_TEXT------------- ---------- ------------ -------------------------------------------------------dbc6vx6z6n1zv 3194619899 0 select ename,job,sal from emp where empno=:enoSQL> exec :eno:=7369;SQL> select ename,job,sal from emp where empno=:eno; -->再次对变量赋值并查询ENAME JOB SAL---------- --------- ----------SMITH CLERK 800SQL> exec :eno:=7521SQL> select ename,job,sal from emp where empno=:eno;ENAME JOB SAL---------- --------- ----------WARD SALESMAN 1250SQL> select sql_id,sql_text,executions from v$sqlarea -->视图v$sqlarea中EXECUTIONS值为3,对应的SQL被执行了3次2 where sql_text like '%select ename,job,sal%' and sql_text not like '%from v$sql%';SQL_ID SQL_TEXT EXECUTIONS------------- ------------------------------------------------------- ----------dbc6vx6z6n1zv select ename,job,sal from emp where empno=:eno 3-->视图v$sql中对应的子游标也实现了完全共享,保持CHILD_NUMBER为0SQL> select sql_id,hash_value,child_number,sql_text from v$sql2 where sql_text like '%select ename,job,sal%' and sql_text not like '%fromv$sql%';SQL_ID HASH_VALUE CHILD_NUMBER SQL_TEXT ------------- ---------- ------------ -------------------------------------------------------dbc6vx6z6n1zv 3194619899 0 select ename,job,sal from emp where empno=:eno2、PL/SQL块中使用绑定变量[sql] view plaincopyprint?SQL> create table t(id number,val number); -->首先创建表tSQL> get get_parse.sql1 select name,value from v$mystat a join v$statname b2* on a.statistic#=b.statistic# where like 'parse count%';SQL> @get_parse.sql -->获得当前的解析情况,此时hard parase 为63NAME VALUE------------------------- ----------parse count (total) 394parse count (hard) 63parse count (failures) 1-->下面的pl/sql代码中,Oracle实现自动变量自动绑定,执行了30次的insert操作,但oracle 认为每次执行的语句都是一样的/**************************************************//* Author: Robinson Cheng *//* Blog: /robinson_0612 *//* MSN: robinson_0612@ *//* QQ: 645746311 *//**************************************************/SQL> begin -->执行pl/sql代码,向表t中插入30条记录2 for i in 1..30 loop3 insert into t values(i,i*2);4 end loop;5 commit;6 end;7 /PL/SQL procedure successfully completed.SQL> @get_parse -->代码执行后的结果,硬解析数量仅仅增加了3次NAME VALUE------------------------- ----------parse count (total) 401parse count (hard) 67parse count (failures) 13、在存储过程或包中使用绑定变量[sql] view plaincopyprint?-->存储过程和保重,对参数的传递即是使用自动绑定变量来实现,因此编程人员无须操心绑定变量问题,如下例所示:SQL> create or replace procedure ins_t(p_id in number,p_value in number) -->创建一个过程用于向表t插入记录2 as3 begin4 insert into t values(p_id,p_value);5 commit;6 end;7 /Procedure created.SQL> select sid,serial# from v$session where username='SCOTT'; -->获得当前用户的sid,serial#SID SERIAL#---------- ----------1084 938SQL> exec dbms_monitor.session_trace_enable(session_id=>1084,serial_num=>938); -->对当前的session启用跟踪PL/SQL procedure successfully completed.SQL> exec ins_t(31,62); -->执行存储过程PL/SQL procedure successfully completed.SQL> exec ins_t(32,64);PL/SQL procedure successfully completed.SQL> exec dbms_monitor.session_trace_disable(session_id=>1084,serial_num=>938); -->关闭对session的跟踪PL/SQL procedure successfully completed.SQL> SET LINESIZE 180SQL> COLUMN trace_file FORMAT A100SQL> SELECT s.sid, -->获得跟踪文件位置2 s.serial#,3 p.spid,4 pa.value || '/' || LOWER(SYS_CONTEXT('userenv','instance_name')) ||5 '_ora_' || p.spid || '.trc' AS trace_file6 FROM v$session s,7 v$process p,8 v$parameter pa9 WHERE = 'user_dump_dest'10 AND s.paddr = p.addr11 AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');SID SERIAL# SPID TRACE_FILE---------- ---------- ------------ --------------------------------------------------------------1084 938 10883 /u02/database/CNMMBO/udump/cnmmbo_ora_10883.trcSQL> SQL>SQL> ho pwd/users/oracle-->使用tkprof工具格式化跟踪文件便于阅读SQL> ho tkprof /u02/database/CNMMBO/udump/cnmmbo_ora_10883.trc /users/oracle/ins_t.txt explain=goex_admin/goex_adminTKPROF: Release 10.2.0.3.0 - Production on Fri Sep 9 12:55:18 2011Copyright (c) 1982, 2005, Oracle. All rights reserved.SQL> ho cat /users/oracle/ins_t.txt -->查看跟踪文件......BEGIN ins_t(31,62); END;......INSERT INTO T -->可以看到insert into语句中使用了绑定变量VALUES(:B2 ,:B1 )call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 0 0.00 0.00 0 0 0 0Execute 2 0.11 0.11 2 281 27 2.......4、在动态SQL中是使用绑定变量[sql] view plaincopyprint?-->动态SQL中不能自动使用绑定变量,需要手动设定绑定变量SQL> @get_parse -->获得当前hard parse解析情况,此时为120NAME VALUE------------------------- ----------parse count (total) 533parse count (hard) 120parse count (failures) 1SQL> begin2 for i in 1..30 loop3 execute immediate 'insert into t values(:1,:2)' using i,i+i-2; -->动态SQL使用绑定变量,该语句将执行30次4 end loop;5 commit;6 end;7 /PL/SQL procedure successfully completed.SQL> @get_parse --> 动态SQL执行后,尽管执行了30次,但硬解析数量仅仅增加了2次NAME VALUE------------------------- ----------parse count (total) 537parse count (hard) 122parse count (failures) 1SQL> set serveroutput on;SQL> get get_sal.sql -->下面的pl/sql中使用了绑定变量1 DECLARE2 TYPE emp_cur IS REF CURSOR;3 my_emp_cur emp_cur;4 my_emp_rec emp%ROWTYPE;5 BEGIN6 OPEN my_emp_cur FOR 'select * from emp where deptno=:dno' USING 10;7 LOOP8 FETCH my_emp_cur INTO my_emp_rec;9 EXIT WHEN my_emp_cur%NOTFOUND;10 dbms_output.put_line(my_emp_rec.ename||'''s salary is : '||my_emp_rec.sal);11 END LOOP;12* END;13 /CLARK's salary is : 4900KING's salary is : 5000MILLER's salary is : 1300PL/SQL procedure successfully completed.SQL> /CLARK's salary is : 4900KING's salary is : 5000MILLER's salary is : 1300PL/SQL procedure successfully completed.SQL> select sql_text,executions,sql_id from v$sqlarea where sql_text like 'select * from emp where deptno=:dno%';SQL_TEXT EXECUTIONS SQL_ID--------------------------------------------- ---------- -------------select * from emp where deptno=:dno 2 c1nx6x02h655a三、绑定变量的优缺点及使用场合优点:可以在library cache中共享游标,避免硬解析以及与之相关的额外开销在大批量数据操作时将呈数量级来减少闩锁的使用,避免闩锁的竞争缺点:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。

相关文档
最新文档