- 浏览: 54818 次
- 性别:
- 来自: 成都
文章分类
最新评论
首先,我们再次复习一下host variables和binding variables的区别和使用,以便我们更好地理解和运用绑定变量。
Host variable:
定义:
在sqlplus中,输入help define可以看到:
DEFINE
----------------------------------------------------------------------------------
Specifies a substitution variable and assigns a CHAR value to it, or
lists the value and variable type of a single variable or all variables.
DEF[INE] [variable] | [variable = text]
Host变量主要作用是起到一个替代变量的作用,是主机环境可以和oracle进行交互的一个媒介。通过define定义host变量的时候必须指定变量名和变量的值,如果变量名已经存在于host变量中,则自动覆盖,这个值不可以指定类型,一律按char存储。定义的格式是:
define variable_name = value //必须定义的时候就赋值,否则define variable_name是显示已经存在的host变量值,不存在会报告未定义。
另外可以使用define命令显示单个(define variable_name,不能显示多个)或全部(define)的host变量的值和类型(类型都是char)。
例如:
WORKGROUP\DINGJUN-PC>define x=ab
WORKGROUP\DINGJUN-PC>define x
DEFINE X = "ab" (CHAR)
WORKGROUP\DINGJUN-PC>define
DEFINE _DATE = "04-1月 -09" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "XE" (CHAR)
DEFINE _USER = "DINGJUN123" (CHAR)
DEFINE _PRIVILEGE = "" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1002000100" (CHAR)
DEFINE _EDITOR = "Notepad" (CHAR)
DEFINE _O_VERSION = "Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production" (CHAR)
DEFINE _O_RELEASE = "1002000100" (CHAR)
DEFINE DATEVALUE = "The time is 2009-01-04 21:22:08" (CHAR)
DEFINE HNAME = "WORKGROUP\DINGJUN-PC" (CHAR)
DEFINE A = "10" (CHAR)
DEFINE _RC = "0" (CHAR)
DEFINE X = "ab" (CHAR)
define x=ab 也可以写成define x=’ab’或者define x=”ab”,效果是一样的,建议使用最简单的定义方式。
使用:
首先要了解host变量只是在当前session环境中有效。了解对于host变量启用和关闭的命令是:set define on和set define off。这在sqlplus和plsql developer的command window中都可以使用,在sql或plsql中引用host变量,使用&符号,只是做一个简单的替换动作,比如
define x=TEST
Select * from ‘&x’;那么会报表找不到的错误,因为x被替换为test,那么’TEST’表是不存在的,TEST表存在,多了个单引号。
也可以不定义,直接在sql或plsql中在字符串前面加&符号,会提示你输入变量的值,然后替换。这种情况下是临时的变量,define命令查不到。
例如:
WORKGROUP\DINGJUN-PC>define x=TEST
WORKGROUP\DINGJUN-PC>select * from &x;
原值 1: select * from &x
新值 1: select * from TEST
NUM
-------------------------------------------------
1
3
已选择2行。
WORKGROUP\DINGJUN-PC>define name=全球
WORKGROUP\DINGJUN-PC>select * from trademark where name like '&name%';
原值 1: select * from trademark where name like '&name%'
新值 1: select * from trademark where name like '全球%'
ID NAME T TRADE_DATE
----- ---------- - -----------------------------------
2 全球通 0 27-11月-08
WORKGROUP\DINGJUN-PC>set define off
WORKGROUP\DINGJUN-PC>select * from trademark where name like '&name%';
未选定行
WORKGROUP\DINGJUN-PC>select * from &m;
输入 m 的值: Trademark where id=1
原值 1: select * from &m
新值 1: select * from Trademark where id=1
ID NAME T TRADE_DATE
----- ---------- - ----------
1 TD 0 27-11月-08
从上面可以看出,&host_name只是做一个简单的替换动作。当set define off之后,就不会把&host_name当成引用host变量了,只是一个普通的字符串,比如字符串就包含了&符号,这时候set define off就起作用了。
经常使用host变量的场合是在写脚本的时候,脚本的有些地方经常变化,其他地方固定,那么可以使用&引用。
Binding variable:
定义:
绑定变量主要是在sql中使用,达到sql解析一次,执行多次,从而提高效率的目的。绑定变量和host变量一样,也有定义的,也有临时性的。(临时性的在动态sql或动态plsql中通过占位符和using使用),其他的如sql会自动使用绑定变量的情况,此处不专门讨论。定义的绑定变量也是在当前session中有效。下面说的大部分功能都是在SQLPLUS中演示的,对于真实的程序,有自己的一套绑定变量的使用机制,和下面的演示有一定的区别。
在sqlplus中输入help var:
WORKGROUP\DINGJUN-PC>help var
VARIABLE
------------------------------------------------------------------------------------------------
Declares a bind variable that can be referenced in PL/SQL, or
lists the current display characteristics for a single variable
or all variables.
VAR[IABLE] [variable [type]]
where type represents one of the following:
NUMBER CHAR CHAR (n [CHAR|BYTE])
NCHAR NCHAR (n) VARCHAR2 (n [CHAR|BYTE])
NVARCHAR2 (n) CLOB NCLOB
REFCURSOR BINARY_FLOAT BINARY_DOUBLE
Sqlplus中可以使用大于等于3个字符表示一个命令,这里我们用var,var命令是声明一个绑定变量,只能给予名称和类型,定义的时候不能赋值,赋值可以在plsql中或者采用函数赋值(而host变量定义的时候必须赋值)。
Var var_name type 声明一个指定类型的绑定变量,类型上面列表中已经列出。
对于var或var var_name只是显示所有的绑定变量或者指定名称的绑定变量的name和type,不显示其值,显示其值用print命令,可以采用help print查看。
WORKGROUP\DINGJUN-PC>help print
PRINT
------------------------
Displays the current values of bind variables, or lists all bind
variables.
PRI[NT] [variable ...]
Print是输出所有绑定变量的值,print name1 name2 ….是输出指定的绑定变量的值,多个用空格分割。对于host变量的define要么输出全部,要么输出单个,没有指定数目的。Print后面的绑定变量名也可以加前缀冒号,效果一样。
WORKGROUP\DINGJUN-PC>var a number
WORKGROUP\DINGJUN-PC>var b varchar2(10)
WORKGROUP\DINGJUN-PC>var c refcursor
WORKGROUP\DINGJUN-PC>print a b
使用:
1. 绑定变量在sql和plsql中直接引用必须加前缀 :。如要引用绑定变量a,则是 :a。
2. 在真正运行的PLSQL程序中,比如自动运行,有自己的一套机制。
3. 初始化和应用绑定变量,初始化定义的绑定变量,可以使用过程和函数,其中过程可以内部给绑定变量赋值、也可以参数是绑定变量,参数模式为out返回。使用函数和过程差不多,还可以使用call 函数来赋值,另外还可以使用SQLPLUS中的execute命令直接赋值,多个绑定变量用分号隔开。
4. 注意NULL值不可赋值给绑定变量,这在NDS中也成立。
使用过程和sqlplus命令初始化绑定变量:
WORKGROUP\DINGJUN-PC>begin
2 :a := 1;
3 end;
4 /
PL/SQL 过程已成功完成。
WORKGROUP\DINGJUN-PC>print a
A
--------------------------------------
1
WORKGROUP\DINGJUN-PC>select :a from dual;
:A
---------------------------------------
1
###使用execute初始化,初始化多个用分号隔开
SQL> var x number;
SQL> var y number;
SQL> exec :x :=1; :y :=2;
PL/SQL procedure successfully completed
x
---------
1
y
---------
2
下面看下NULL值赋值给绑定变量,会报错
WORKGROUP\DINGJUN-PC>exec :a:='aa',:b:=null;
BEGIN :a:='aa',:b:=null; END;
*
第 1 行出现错误:
ORA-06550: 第 1 行, 第 16 列:
PLS-00103: 出现符号 ","在需要下列之一时:
* & = - + ; < /
> at in is mod remainder not rem <an exponent (**)>
<> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_
between || multiset member SUBMULTISET_
符号 ";在 "," 继续之前已插入。
再如下面的例子,使用过程返回绑定变量,定义一个Var x number;
WORKGROUP\DINGJUN-PC>var x number;
WORKGROUP\DINGJUN-PC>Create or replace procedure pt( m out number)
2 As
3 Begin
4 m:=10;
5 End;
6 /
过程已创建。
WORKGROUP\DINGJUN-PC>exec pt(m => :x);
PL/SQL 过程已成功完成。
WORKGROUP\DINGJUN-PC>print x
X
-------------------------
10
绑定变量是REFCURSOR类型。一个参数使用ref cursor,通过绑定变量类型定义为REFCURSOR,然后传入过程,打印绑定变量(效果和查询语句一样)。
WORKGROUP\DINGJUN-PC>var x refcursor;
WORKGROUP\DINGJUN-PC>create or replace procedure pt(cur out SYS_REFCURSOR)
2 AS
3 BEGIN
4 OPEN cur for select * from test where rownum<3;
5 END;
6 /
过程已创建。
WORKGROUP\DINGJUN-PC>exec pt(cur => :x);
PL/SQL 过程已成功完成。
WORKGROUP\DINGJUN-PC>print x
SJ ID
---- ----------
01 1
02 2
由上面可以知道,print可以直接把refcursor的结果打印出来,不需要迭代查找。
下面看看如何用函数初始化定义的绑定变量:
WORKGROUP\DINGJUN-PC>create or replace function concatestring(a in varchar2, b in varchar2) return varchar2
2 as
3 c varchar2(100);
4 begin
5 c := a||b;
6 return c;
7 end;
8 /
函数已创建。
WORKGROUP\DINGJUN-PC>variable x varchar2(10);
WORKGROUP\DINGJUN-PC>call concatestring('a','b') into :x;
调用完成。
WORKGROUP\DINGJUN-PC>print x
X
----------------------------------------------------------------
ab
当然也可以将函数的参数定义为out模式来初始化,我们这里使用call命令调用函数把结果传给绑定变量,调用格式为:call function(参数列表) into :绑定变量。
pl/sql中的参数和定义的变量(包括全局变量和临时变量)都会内部转为绑定变量,所以尽量在pl/sql中尽量使用静态sql,而不要使用动态sql,如果使用动态sql,要尽量加上绑定变量。
绑定变量的基本作用
绑定变量主要是sql的执行过程中,在解析sql之后会进行共享池(SGA)的检查,看优化器有没有分析优化过这个sql,环境必须完全一致才可以(包括大小写的一致,session情况一致等)。那么可以达到一次分析,多次执行的目的,这就是软解析,否则要进过解析,优化,行资源生成等一系列sql执行的过程,因为sql优化需要耗费很多资源,如果硬解析,sql性能会下降。
看SGA中的sql是否是软解析被调用多次,可以查看v$sql或v$sqlarea视图,查看列sql_text,executions,如:
select sql_text,executions from v$sql where sql_text like '%trademark%';
SQL_TEXT EXECUTIONS<被执行的次数>
select * from trademark where id=:tid 6
发表评论
-
plsql中的循环
2010-03-29 16:48 3409plsql的循环有三种类型: • The simple or ... -
Authid Current_User--存储过程中也能使用role角色权限(转)
2010-01-28 16:52 2225我们知道,用户拥有的role权限在存储过程是不可用的。遇到这种 ... -
rollup与cube
2009-12-31 09:32 10541.rollup会对每个分组进行合计,如: select ... -
ORACLE分析函数学习之Windowing Aggregate Functions
2009-10-29 20:46 2533ORACLE在数据仓库的应用上,有很多针对分析数据和报表查询的 ... -
Oracle 分析函数
2009-10-27 14:52 1081Oracle 分析函数 技 ... -
oracle 存储过程的基本语法
2009-10-27 14:51 888oracle 存储过程的基本语 ... -
ORACLE分析函数FIRST_VALUE(expr) OVER(analytic-clause)的应用
2009-10-10 16:24 2885需求:有一利率表BBFMCDRT,表结构: CD ... -
ORACLE中SQL取最后一条记录的几种方法
2009-09-28 09:43 16812在ETL过程中,经常会碰到取结果集的最后或最前一条记录。如 ...
相关推荐
绑定变量和其他高级特性(Binding Variables and Advanced Features) - 讨论了绑定变量的使用,包括按名称或位置绑定参数,绑定方向,绑定NULL值,ROWID值,DML RETURNING绑定变量,LOB绑定变量,REF游标绑定变量...
4. **数据绑定(Data Binding)**:可能还包括一种机制,使得变量的变化能够实时反映到UI元素上,或者反过来,UI元素的改变能直接影响变量的值。这对于创建动态且响应式的用户界面非常有用。 5. **多变量容器...
该方案通过分析传统分页查询技术的不足,融合了多种技术,包括数据库优化策略、SQL 语句优化、游标变量、批绑定、动态 SQL 等,以提高海量数据的分页查询效率。 database optimization 在 Oracle 10g 数据库中,...
绑定表变量到SQL查询结果或过程的输出,可以将查询结果直接赋值给表变量,简化了数据处理流程。 #### Scalar Variables 标量变量用于存储单个值,它们在过程中的作用类似于临时存储单元,可以用于计算、条件判断和...
最后,使用`bind`方法绑定变量上下文,并调用`result`方法渲染模板: ```ruby output = template.result(variables.instance_eval { binding }) puts output ``` `instance_eval`方法会将`variables`哈希转换为一...
- **绑定变量的重命名 (Renaming of Bound Variables)** - 介绍了如何重命名绑定变量。 - **替换 (Substitution)** - 详细讨论了替换操作的实现方式。 - **一般性判定 (General Judgements)** - **一般性 ...
##### 2.1 绑定数据字段(Binding Data Field) 在报表设计界面,可使用XRLabel组件来展示数据。关键在于正确绑定数据字段。例如,在GroupHeader1区域内,可通过拖放XRLabel组件并设置其绑定的字段,如\[SONO\],...
6. **绑定变量**:`BIND_AWARE` 和 `BINDING_VARIABLES` 列可以帮助识别SQL语句是否使用了绑定变量,这对于优化和避免硬解析至关重要。 7. **版本控制**:`CHILD_NUMBER` 和 `VERSION_COUNT` 列展示了SQL语句的版本...
##### 2.1 绑定数据字段 (Binding Data Field) 在报表设计过程中,一个关键的步骤是将数据字段绑定到报表的各个部分,如标题、明细行等。具体操作如下: - 在报表设计器中,选择DetailBand区域,这里是展示数据的...
Dashboard组件持有数据,并通过输入绑定(input binding)将这些数据传递给每个子组件,这是Angular中从父组件向子组件共享数据的方式。此外,Angular还会跟踪数据变化,以便在数据更新时自动重新渲染视图。 输入绑定...
#### 绑定模板变量到小部件 (Binding of Template Variables to Widgets) 为了使得用户输入的数据能够正确地应用于模板中,需要将模板中的变量与界面上的小部件绑定起来。这样当用户修改了界面上的值时,相应的模板...
表变量类型定义(TableVariableTypeDefinition)和绑定表变量(Binding Table Variables)是处理表类型数据的操作。 游标定义和使用(Cursors)是SQL脚本中处理数据库查询结果集的机制,它允许逐行操作查询结果,...
- **1.3 Scoping and Binding of Variables(变量的作用域与绑定)**:讨论变量的作用域规则和绑定机制。这对于理解程序的行为至关重要,特别是在处理局部变量和全局变量时。 2. **数据抽象(第2章)** - **2.1 ...
#### 1.1 绑定数据字段(Binding Data Field) - **概念**:在报表设计阶段,通常需要将数据集中的字段与报表中的组件绑定,以便展示数据。 - **实现方式**:可以通过直接在报表设计器中给Text Object组件的`Text`...
5. **局部变量(Local Variables)** 父组件可以通过在模板中声明局部变量来直接引用子组件。例如,`#childRef`可以用来引用子组件实例,然后在父组件的类中通过`@ViewChild('childRef')`获取子组件,从而调用子...
2. SET_VARIABLES_STATE:此命令用于设置变量的状态,这里的变量可能是用户输入或由其他操作触发的值。在XML配置中,`<bi:VARIABLE>` 定义了变量(例如UPM-公司部门),而 `<bi:VARIABLE_TYPE>` 部分指定了变量类型...
`),以及如何通过强制解析(force unwrapping)、可选绑定(optional binding)等方式安全地处理这些变量。 ##### Functions 函数是组织代码和执行特定任务的基本单位。该章节介绍了如何定义函数、传递参数以及...
Spring Web Flow采用了一种层次化的范围搜索算法,当访问一个EL变量时,它会按照预定义的顺序在不同的作用域中查找该变量,确保了数据访问的正确性和高效性。 ### 五、Rendering views #### 5.1 Introduction 视图...
51. **Dynamic Binding**:动态绑定,也称为晚期绑定,是指运行时确定函数调用或成员访问的绑定。 52. **Dynamic Model**:动态模型,描述程序在运行时的行为和状态变化。 53. **Echo Printing**:回显打印,显示...