替换变量

SQL*Plus中的替换变量又叫替代变量,它一般用来临时存储相关数据;在SQL语句之间传递值。一般使用&或&&前缀来指定替换变量. 关于使用替换变量,一般是利用其创建通用的脚本或达到和用户交换目的。如下所示:

例如,我需要查看表的相关信息,如果不使用替换变量,每次查询我都要修改脚本。非常不便,如果使用替换变量,我们可以将下面脚本存放在tab.sql脚本中,每次运行时,只需要输入替换变量的值就可以了。

COL LOGGING FOR A7;

 

COL OWNER FOR A12;

 

COL TABLE_NAME FOR A30

 

COL TABLESPACE_NAME FOR A30

 

SELECT OWNER, TABLE_NAME, TABLESPACE_NAME, STATUS, COMPRESSION, 

       LOGGING, PARTITIONED, NUM_ROWS,

       TO_CHAR(LAST_ANALYZED,'YY-MM-DD HH24:MI:SS') LAST_ANALYZED

 

FROM DBA_TABLES 

 

    WHERE TABLE_NAME LIKE '&table_name_like%'

 

    ORDER BY TABLE_NAME;

 

epps> @tab.sql

Enter value for table_name_like: EMP

old   4:  WHERE  TABLE_NAME LIKE '&table_name_like%'

new   4:  WHERE  TABLE_NAME LIKE 'EMP%'

 

OWNER     TABLE_NAME       TABLESPACE_NAME      STATUS   COMPRESS LOGGING PAR   NUM_ROWS LAST_ANALYZED

------- --------------- ---------------------- -------- -------- ------- --- ---------- -----------------

SCOTT        EMP               USERS             VALID    DISABLED YES     NO          14 09-07-20 22:00:12

WIPOWNER     EMPLOYEE_MASTER   WIPOWNER_DATA     VALID    DISABLED YES     NO       12084 14-09-07 14:08:22

 

epps> @tab.sql

Enter value for table_name_like: DEPT

old   4:  WHERE  TABLE_NAME LIKE '&table_name_like%'

new   4:  WHERE  TABLE_NAME LIKE 'DEPT%'

 

OWNER     TABLE_NAME    TABLESPACE_NAME    STATUS   COMPRESS LOGGING PAR   NUM_ROWS LAST_ANALYZED

------- -------------- ------------------ -------- -------- ------- --- ---------- -----------------

SCOTT       DEPT                USERS       VALID    DISABLED YES     NO           4 09-07-20 22:00:12

 

epps> 

如果替换变量为数字类型,那么可以直接是&+变量名称,如下所示&DEPTNO,

SQL> SELECT deptno, dname, loc 

  2  FROM SCOTT.DEPT

  3  WHERE DEPTNO= &DEPTNO;

Enter value for deptno: 10

old   3: WHERE DEPTNO= &DEPTNO

new   3: WHERE DEPTNO= 10

 

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

如果是字符串类型或日期类型,最好使用单引号将其包裹起来,否则在输入变量值时则必须加上单引号,不那样做就会报错,如下所示。

SQL> SELECT deptno, dname, loc 

  2  FROM SCOTT.DEPT

  3  WHERE DNAME= &DNAME;

Enter value for dname: SALES

old   3: WHERE DNAME= &DNAME

new   3: WHERE DNAME= SALES

WHERE DNAME= SALES

             *

ERROR at line 3:

ORA-00904: "SALES": invalid identifier

 

SQL> SELECT deptno, dname, loc 

  2  FROM SCOTT.DEPT

  3  WHERE DNAME= &DNAME;

Enter value for dname: 'SALES'

old   3: WHERE DNAME= &DNAME

new   3: WHERE DNAME= 'SALES'

 

    DEPTNO DNAME          LOC

---------- -------------- -------------

        30 SALES          CHICAGO

关于替换变量中&与&&的区别,两者区别在于作用范围不一样,&引用的替换变量只在当前SQL有效,而&&引用的替换变量则在当前会话有效。下面以人们经常引用的例子来说明

SQL> SELECT 2+&NUM FROM DUAL;

Enter value for num: 2

old   1: SELECT 2+&NUM FROM DUAL

new   1: SELECT 2+2 FROM DUAL

 

       2+2

----------

         4

 

SQL> SELECT 3+&NUM FROM DUAL;

Enter value for num: 3

old   1: SELECT 3+&NUM FROM DUAL

new   1: SELECT 3+3 FROM DUAL

 

       3+3

----------

         6

 

SQL> SELECT 2+&&NUM FROM DUAL;

Enter value for num: 2

old   1: SELECT 2+&&NUM FROM DUAL

new   1: SELECT 2+2 FROM DUAL

 

       2+2

----------

         4

 

SQL> SELECT 3+&&NUM FROM DUAL;

old   1: SELECT 3+&&NUM FROM DUAL

new   1: SELECT 3+2 FROM DUAL

 

       3+2

----------

         5

 

小知识1:在存储过程或包体里面,经常有在字符串中使用&的情况,执行脚本时,经常会将这些字符串视为替换变量,要求输入值,这样烦不甚烦,其实只需要设置一下SQL*PLUS的环境变量即可避免这种情况。通常通过SET DEFINE OFF

小知识2:如果要显示SQL*Plus使用替换值替换后的脚本文件,可以使用SET VERIFY ON/OFF 命令

SQL> SET VERIFY OFF

SQL> SELECT 2+&NUM FROM DUAL;

 

       2+2

----------

         4

 

SQL> SET VERIFY ON

SQL> SELECT 2+&NUM FROM DUAL;

old   1: SELECT 2+&NUM FROM DUAL

new   1: SELECT 2+2 FROM DUAL

 

       2+2

----------

         4

 

 

用户定义变量

使用DEFINE定义了的变量(或许我们可以叫其定义常量,和C/C++中的DEFINE非常类似),可以使用&引用声明的变量。其作用范围或生命周期通常是整个会话。如果定义了变量后,需要清除变量,则可以使用UNDEFINE清除变量,使用DEFINE VARIABLE来查看变量

SQL> DEFINE NUM=2;            --定义变量

SQL> DEFINE NUM                    --查看变量

DEFINE NUM             = "2" (CHAR)

SQL> SELECT 2+&NUM FROM DUAL;      --引用变量

old   1: SELECT 2+&NUM FROM DUAL

new   1: SELECT 2+2 FROM DUAL

 

       2+2

----------

         4

 

SQL> UNDEFINE NUM;               --清除变量

SQL> SELECT 2+&NUM FROM DUAL;    --清除变量后,&NUM变成替换变量了。需要输入值

Enter value for num: 

 

小知识点:查看当前会话下,SQL*Plus下定义的变量

SQL> define

DEFINE _DATE = "11-SEP-14" (CHAR)

DEFINE _CONNECT_IDENTIFIER = "epps" (CHAR)

DEFINE _USER = "SYS" (CHAR)

DEFINE _PRIVILEGE = "AS SYSDBA" (CHAR)

DEFINE _SQLPLUS_RELEASE = "1002000400" (CHAR)

DEFINE _EDITOR = "ed" (CHAR)

DEFINE _O_VERSION = "Oracle Database 10g Release 10.2.0.4.0 - Production" (CHAR)

DEFINE _O_RELEASE = "1002000400" (CHAR)

 

 

VARIABLE变量和DEFINE变量不同的是其需要指定变量类型,类似编程语言中的强类型和弱类型变量。前者用于绑定变量,后者是用于&或&&进行变量替换

SQL> VAR NUM NUMBER;

SQL> EXEC :NUM :=10;

PL/SQL procedure successfully completed.

SQL> PRINT NUM;

NUM

----------

10

DECLARE定义变量则一般用于PL/SQL中。一般大家也用得比较多。在此不做说明。

参考资料:

http://www.doc88.com/p-783671200732.html

http://blog.itpub.net/9933980/viewspace-627702/

http://blog.csdn.net/haiross/article/details/15340489

SQL*Plus中替换变量与定义变量的更多相关文章

  1. SQL Server中的临时表和表变量

    SQL Server中的临时表和表变量 作者:DrillChina出处:blog2008-07-08 10:05 在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的 ...

  2. JavaScript中var和this定义变量的区别

    JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...

  3. 『Python基础-3』变量、定义变量、变量类型、关键字Python基础-3』变量、定义变量、变量类型、关键字

    『Python基础-3』变量.定义变量.变量类型.关键字 目录: 1.Python变量.变量的命名 2.变量的类型(Python数据类型) 3.Python关键字 1. Python 变量.变量的命名 ...

  4. SQL Server中的临时表和表变量 Declare @Tablename Table

    在SQL Server的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择.记得在给一家国内首屈一指的海运公司作SQL Se ...

  5. sql server中的临时表、表变量和公用表表达式

    在编写T-SQL语句的时候,SQL Server提供了三种方法临时存储某些结果集,分别是临时表.表变量和公用表表达式. 临时表 临时表需要在临时数据库TempDB中通过I/O操作来创建表结构,一旦用户 ...

  6. SQL Server中可能为null的变量逻辑运算的时候要小心

    DECLARE @a int declare @b int IF(@a<>@b) print('@a<>@b') else print('@a=@b') ) print('b& ...

  7. MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  8. mysql -- 存储过程中 declare 和 set 定义变量的区别

    mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...

  9. js中let和var定义变量的区别

    let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (fun ...

随机推荐

  1. golang获取程序运行路径

    golang获取程序运行路径: /* 获取程序运行路径 */ func getCurrentDirectory() string { dir, err := filepath.Abs(filepath ...

  2. phpstorm 63342默认端口怎么修改

    phpstorm进行网页调试的时候,默认是加端口号63342,在配置本地php环境的时候默认端口不一定是63342这个,更多的是系统默认的端口号80,那么问题就出现了,如何在phpstorm中将633 ...

  3. SQL Server 2014里的性能提升

    在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...

  4. Nancy之结合tinyfox给我们的应用提供简单的数据服务

    说到提供数据服务给我们的一些应用,估计用的最多的也就是json和xml这两种数据格式 实现的方法也是多种多样,web api,mvc的jsonresult和contentresult...等等 本文是 ...

  5. ASP.NET-Web项目运行缓慢-AjaxMin在搞鬼

    AjaxMin 4.8版本是没问题,出现问题的时候是AjaxMin 5.3.xxxxx版本,起初我也不知道是AjaxMin出现问题一直以为是因为我大幅度修改Web项目架构,以及采用大量反射后所带来的后 ...

  6. 委托 lambda表达式浅显理解

    方法不能跟变量一样当参数传递,怎么办,C#定义了委托,就可以把方法当变量一样传递了,为了简单,匿名方法传递,省得再声明方法了:再简单,lambda表达式传递,比匿名方法更直观. public dele ...

  7. CSS基础转载

    css基本知识框架:(一:基本知识缩影.二基本知识框架图) 1.css样式表的基本概念 2.样式表基本类型-----1.内嵌样式 2.内联样式3.链入外部样式表4.导入外部?式 3.样式表配置方法 4 ...

  8. C# DataTable的詳細用法

    转载别人的转载,原作者都不知道了 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一 ...

  9. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  10. 关于Java语言和面向对象记录

    本科时常用的c语言是面向过程的语言,而Java是面向对象的语言 Java语言的11个关键术语 简单性.可移植性.面向对象.分布式.高性能.解释型.健壮性.多线程.安全性.动态性.体系结构中立 面向对象 ...