友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第58部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
分析
你可以在许多的需要中见到变量的使用 例如 为你想要重新定向输出的文件命名或
为 ORDER BY 子句指定一个表达式 其中的方法之一是使用变量替换 一种使用变量替换
的情况是在事务处理诊断报告中在 WHERE 子句中输入日期 如果你的查询设计成要求在
特定的时间内得到信息的话 你也许需要设置一个替换变量来与表中的 SSN 列进行比较
NEW_VALUE
NEW_VALUE 命令可以将 SELECT 语句中的数值返回给一个没有经你明确定义的变
量 语法格式如下
语法
COL'UMN' column_name NEW_VALUE new_name
你可以使用&符号来调用这个值 例如
&new_name
在 NEW_VALUE 命令中必须使用 COLUMN 命令
注意&符号与 COLUMN 在下边的 SQL*PLUS 文件中是一起使用的 在这个文件中出
现了 GET 命令
输入
SQL》 get prod1
459
…………………………………………………………Page 460……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输出
line 5 truncated。
1 ttitle left 'Report for Product: &prod_title' skip 2
2 col product_name new_value prod_title
3 select product_name; unit_cost
4 from products
5* where product_name = 'COFFEE MUG'
输入
SQL》 @prod1
输出
Report for Product: COFFEE MUG
PRODUCT_NAME UNIT_COST
COFFEE MUG 6。95
分析
PRODUCT_NAME 列的值已经通过 NEW_VALUE 方法被存入了变量 PROD_TITLE
中 该变量中的值将在稍后被 TTITLE 命令调用
对于在 SQL 中更多的变量信息 请参见第 18 天的 PL/SQL 简介 以及第 19 天的
TRANSACT SQL 简介
DUAL 表
DUAL 表是在每一个 ORACLE 数据库中都存在的虚拟表 它只有一个叫 DUMMY 的
列和一行值为 X 的数据 这个表可以由所有的用户出于通用的目标如进行计算 这时它可
以像一个计算器一样使用 或维护 SYSDATE 的格式而使用
输入
SQL》 desc dual;
输出
Name Null? Type
DUMMY VARCHAR2(1)
输入
SQL》 select * from dual
460
…………………………………………………………Page 461……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输出
D
X
让我们来看一对使用 DUAL 表的例子
输入
SQL》 select sysdate from dual;
输出
SYSDATE
08…MAY…97
输入
SQL》 select 2 * 2 from dual;
输出
2*2
非常简单 第一条语句从 DUAL 表中选择了 SYSDATE 以取得今天的日期 第二个例
子显示了如何用这个表来进行乘法计算 我们的答案是 2*2 的结果为 4
DECODE 函数
DECODE 函数是 SQL*PLUS 中众多功能强大的函数之一— — 也许它的功能是最强大
的 标准的 SQL 中没有过程函数 它是包括在如 COBOL 和 C 语言中的
DECODE 语句与程序语言中的 IF THEN 语句类似 对于复杂的报表来说灵活性是
必需的 DECODE 可以弥补标准的 SQL 与过程语言函数之间的缺陷
语法
DECODE(column1; value1; output1; value2; output2; output3)
语法中的例子是对 column1 列执行 DECODE 函数 如果 column1 有一个值为 value1
那么将会用 output1 来代替当前值 如果 column1 的值为value2 那么就会用 OUTPUT2 来
代替当前值 如果 column1 中哪两个值都不是 那么就会用 OUTPUT3 来代替当前值
实际应用的例子呢 我们先来对一个新表运行一下 SELECT 语句
输入
SQL》 select * from states;
461
…………………………………………………………Page 462……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入
ST IL
IN OH
FL CA
KY NY
7 rows selected。
现在来用一下 DECODE 命令
输入
SQL》 select decode(state;'IN';'INDIANA';'OTHER') state from states;
输出
STATE OTHER
INDIANA OTHER
OTHER OTHER
OTHER OTHER
7 rows selected。
分析
符合条件 州为 IN 的记录只有一条 所以只有一行显示为 INDIANA 其它的记录
看上去都不符合 因为它们的显示为 OTHER
下边的例子为表中的每一个值提供了输入字符串 只有当你的州不在列表中时 你才
会收到 OTHER 信息
输入
SQL》 select decode(state;'IN';'INDIANA';
2 'FL';'FLORIDA';
3 'KY';'KENTUCKY';
4 'IL';'ILLINOIS';
5 'OH';'OHIO';
6 'CA';'CALIFORNIA';
7 'NY';'NEW YORK';'OTHER')
8 from states;
输出
462
…………………………………………………………Page 463……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
DECODE(STATE)
INDIANA
FLORIDA
KENTUCKY
ILLINOIS
OHIO
CALIFORNIA
NEW YORK
7 rows selected。
这实在太容易了 在下一个例子中将引入一个 PAY 表 这个表可以显示职 DECODE
函数更为强大的能力
输入
SQL》 col hour_rate hea 〃HOURLY|RATE〃 for 99。00
SQL》 col date_last_raise hea 〃LAST|RAISE〃
SQL》 select name; hour_rate; date_last_raise
2 from pay;
输出
HOURLY LAST
NAME RATE RAISE
JOHN 12。60 01…JAN…96
JEFF 8。50 17…MAR…97
RON 9。35 01…OCT…96
RYAN 7。00 15…MAY…96
BRYAN 11。00 01…JUN…96
MARY 17。50 01…JAN…96
ELAINE 14。20 01…FEB…97
7 rows selected。
准备好了吗 现在是给在 PAY 表中的每个人长工资的时候了 如果某个人上次长工资
的时间是 1997 年 那么将他的工资上浮 10% 如果他上次长工资是在 1996 年 那么将他
的工资上浮 20% 此外 还要显示在这两种情况下工资上调的百分率
输入
SQL》 col new_pay hea 'NEW PAY' for 99。00
SQL》 col hour_rate hea 'HOURLY|RATE' for 99。00
463
…………………………………………………………Page 464……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 col date_last_raise hea 'LAST|RAISE'
SQL》 select name; hour_rate; date_last_raise;
2 decode(substr(date_last_raise;8;2);'96';hour_rate * 1。2;
3 '97';hour_rate * 1。1) new_pay;
4 decode(substr(date_last_raise;8;2);'96';'20%';
5 '97';'10%';null) increase
6 from pay;
输出
HOURLY LAST
NAME RATE RAISE NEW PAY INC
JOHN 12。60 01…JAN…96 15。12 20%
JEFF 8。50 17…MAR…97 9。35 10%
RON 9。35 01…OCT…96 11。22 20%
RYAN 7。00 15…MAY…96 8。40 20%
BRYAN 11。00 01…JUN…96 13。20 20%
MARY 17。50 01…JAN…96 21。00 20%
ELAINE 14。20 01…FEB…97 15。62 10%
7 rows selected。
分析
根据输出情况 除了 JEFF 和 ELAINE 每个人的工资都上涨了 20% 他们在今年已经
涨过工资了
日期转换
如果你想对日期的显示加一些附加的格式 那么你可以使用 TO_CHAR 来改变日期的
显示方式 例子中首先得到的是今天的日期
输入
SQL》 select sysdate from dual
输出
SYSDATE
08…MAY…97
当将日期转换为字符串时 你可以使用 TO_CHAR 函数功能的下列语法
464
…………………………………………………………Page 465……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
语法
TO_CHAR(sysdate;'date picture')
Date picture 是你想要看到的日期形式 最常见的日期形式如下
Mon 当前月简写
Day 当前日期是本周中的第几天
mm 当前的月份
yy 当前年的最后两位数
dd 当前日期是当前月的第几天
Yyyy 当前年
ddd 当前日期是当前年中的第几天
hh 当前时间是当前天的第几小时
mi 当前时间是当前小时的第几分钟
ss 当前时间是当前分钟的第几秒
a。m。 显示 PM 或 AM
在 date picture 中的引号中也可以包括逗号和其它的文本字符
输入
SQL》 col today for a20
SQL》 select to_char(sysdate;'Mon dd; yyyy') today from dual;
输出
TODAY
May 08; 1997
分析
注意在 COLUMN 列中如何使用 today 的别名
输入
SQL》 col today hea 'TODAYs JULIAN DATE' for a20
SQL》 select to_char(sysdate;'ddd') today from dual;
输出
TODAYs JULIAN DATE
128
分析
有一些公司更喜欢使用乌利尤斯 恺撒日期并带有两位年份数字的写法 你的日期看
465
…………………………………………………………Page 466……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
起来就是’yyddd’的样子
假定你已经写了一个小脚本并假定它的名字为 day 下边的例子将打开这个文件 查
看它的内容 并执行它以获得不同格式的日期转换信息
输入
SQL》 get day
输出
line 10 truncated。
1 set echo on
2 col day for a10
3 col today for a25
4 col year for a25
5 col time for a15
6 select to_char(sysdate;'Day') day;
7 to_char(sysdate;'Mon dd; yyyy') today;
8 to_char(sysdate;'Year') year;
9 to_char(sysdate;'hh:mi:ss a。m。') time
10* from dual
现在 运行一下这个脚本
输入
SQL》 @day
输出
SQL》 set echo on
SQL》 col day for a10
SQL》 col today for a25
SQL》 col year for a25
SQL》 col time for a15
SQL》 select to_char(sysdate;'Day') day;
2 to_char(sysdate;'Mon dd; yyyy') today;
3 to_char(sysdate;'Year') year;
4 to_char(sysdate;'hh:mi:ss a。m。') time
466
…………………………………………………………Page 467……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
5 from dual;
DAY TODAY YEAR TIME
Thursday May 08; 1997 Nineteen Ninety…Seven 04:10:43 p。m。
分析
因为ECHO 设置为ON 所以在这个例子中运行之前会显示整个的语句 此外 SYSDATE
会被填入到四列中并被转换为四种格式
TO_DATE 函数还可以将文本转换为日期格式 基本的语法与 TO_CHAR 类似
语法
TO_DATE(expression;'date_picture')
Try a couple of examples:
输入
SQL》 select to_date('19970501';'yyyymmdd') 〃NEW DATE〃 from dual
输出
NEW DATE
01…MAY…97
输入
SQL》 select to_date('05/01/97';'mm〃/〃dd〃/〃yy') 〃NEW DATE〃 from dual
输出
NEW DATE
01…MAY…97
分析
注意 这里的字符串用引号括起来了
运行一系列的 SQL 文件
一个 SQL 脚本文件可以包括你在 SQL 提示下输入到缓冲区中的任何内容 甚至可以
是运行其它 SQL 脚本的命令 也就是说你可以从一个 SQL 脚本中执行另一个 SQL 脚本
下图显示了使用 EDIT 命令创建的脚本 这个文件中包括了多条的 SQL 语句和运行其它的
SQL 脚本的命令
输入
SQL》 edit main。sql
467
…………………………………………………………Page 468……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输出
SQL》 @main
分析
在启动 main。sql 以后 你可以运行在这个文件中的每一个 SQL 命令 query1 到 query5
将会被执行 次序如下图所示
在你的 SQL 脚本中加入注释
SQL*PLUS 为你提供了三种在脚本文件中加入注释的方法
………一次可以注释一行语句
REMARK 也可以一次注释一行语句
/* */可以注释多行语句
请学习下边的例子
输入
SQL》 input
1 REMARK this is a ment
2 …this is a ment too
3 REM
4 … SET MANDS
468
…………………………………………………………Page 469……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
5 set echo on
6 set feedback on
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!