SQL*Plus中替换变量与定义变量
替换变量
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
转载于:https://www.cnblogs.com/kerrycode/p/3967275.html
SQL*Plus中替换变量与定义变量相关推荐
- mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- css里面的let,js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...
- mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- SQL Server中替换函数stuff、replace的使用
原文链接:SQL Server中替换函数STUFF.replace的使用 STUFF ( character_expression , start , length ,character_expres ...
- 声明变量和定义变量的区别是什么?
1.什么是定义,什么是声明 (1)在 C语言中,使用变量之前必须先定义变量.所谓定义变量,就是编译器创建了一个变量,为这个变量分配一块内存并命名(变量名).例如,定义整型变量 a. int a; 这条 ...
- Python 定义变量和定义变量名的规则
上一篇文章讲述了变量的概念和作用,下面讲解的是变量的第二个知识点 - 定义变量和定义变量名的规则,下一篇在讲解变量的使用. 一.定义变量 语法规则: 变量名 = 值 定义变量的语法规则中间的'=',并 ...
- 【数据库基本原理】详解SQL标准中的隔离级别定义
详解SQL标准中的隔离级别定义 SQL标准中隔离级别的初衷 SQL标准,已被ANSI 和ISO/IEC采用,定义了四种事务隔离级别.这些隔离级别在事务处理吞吐量上游不同程度的影响. 这些隔离级别根据并 ...
- SQL允许你用EXECUTE执行一个变量中定义的SQL语句,并且允许你在被执行的SQL语句中,再次嵌套入一个变量定义的语句,并且再次在其中用EXECUTE执行它...
declare @sqlstr varchar(3000) set @sqlstr='declare @subsqlstr varchar(1000);' set @sqlstr=@sqlstr+'s ...
- SQL Server中的内存优化表变量
This article will cover the usage details and performance advantages of the memory-optimized table v ...
最新文章
- 超全大厂Java面试彩蛋
- 陕西小学三年级计算机下册教案,小学三三年级信息技术下册教学计划
- html选中radio隐藏div,radio类型的input标签选中后隐藏其他元素
- WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
- Python简介-01-Python的起源
- 表达式的计算结果必须为节点集 调试
- java 中的jframe_java中JFrame是什么
- Java8 List<对象> 转 Set、Map(高级)、排序、分组、统计
- 百度大脑技术支持慧译视频字幕系统,为听障学生带来“看得见的声音”
- mariadb安装密码验证插件
- linux 安装 navicat
- 32位汇编语言程序设计(钱晓捷) 高清完整
- 计算机知识大赛五书,2017昆山千灯镇事业单位考试常识——昆山市情解析
- ASP.NET Core与ASP.NET区别
- python随机生成二维列表_对python产生随机的二维数组实例详解
- 520 miix 小兵 黑苹果_黑苹果攒机笔记
- 博客园的模拟登陆(Simulated Login)
- 重学JavaSE 第11章 : 常用类API、String、日期API、比较器、BigDecimal、System等
- 仿真3. 仿真系统的设计思路
- python获取域名对应的ip_09python实现DNS查找域名对应的IP地址
热门文章
- 棱镜调查:提高渠道兼容性从游戏设计开始
- 校园二手交易平台的开发和利用
- pmp每日三题(2022年2月16日)
- 【蓝桥杯Java_C组·从零开始卷】第六节(一)、Java常用数学函数
- UDP和TCP的优缺点
- OEL6.8安装虚拟带库模拟器
- windows当代理服务器-CCProx的使用
- win10 64 + VS2010 + Opencv 2.4.9 + HIKVISION(海康)
- (转)java并发之Executor
- 二叉树的定义、性质、存储