按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
语句中 如果在你的语句中返回了 100 条记录 那么你就会得到 100 条语句 如果你成功
地从数据库中生成了这些 SQL 代码 那么你还可以对数据库来应用这些 SQL 语句 它们
将对数据库执行一系列的查询工作
今天剩下来的时间我们主要集中于向你讲解如何从一个 SQL 语句中生成其它的 SQL
语句的例子 你的大多数的信息将来源于数据字典 所以你应该回想一下你昨天所学习的
内容 见第 16 天 使用视图从数据字典中获得有用的信息
注 在今天的例子中我们使用 PERSONAL ORACLE7 与以往一样 你应该将在今天所讲
座的内容与你所使用的数据库解释器的语法结合起来
几个 SQL*PLUS 命令
在今天的例子中我们要使用几个新的命令 也就是 SQL*PLUS 命令 — — 针对 PERSONAL
ORACLE 的用以对输出的格式进行控制的命令 见第 20 天的 SQL*PLUS 这些命令
也是在 SQL》提示符下运行的 它们也可以在文件中使用
注 尽管这些命令是针对 PERSONAL ORACLE7 的 但是在其它的数据库解释器中也有类
似的命令 例如 在 Transact…SQL 中就有 参见第 19 天 Transact…SQL 简介
354
…………………………………………………………Page 355……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SET ECHO ON/OFF
当你 set echo on 时 你会在执行的时候看到你的 SQL 语句 set echo off 的意思就是你
不想在执行的时候看到 SQL 语句 — — 你只想看到输出的结果
SET ECHO ' ON | OFF '
SET FEEDBACK ON/OFF
FEEDBACK 就是你的查询所输入的行数 例如 如果你运行的 SELECT 语句返回 30
行数据 那么你的 FEEDBACK 将会是
30 rows selected
SET FEEDBACK ON 会显示对行的计数 SET FEEDBACK OFF 则在你的结果输出时
不会对行进行计数
SET FEEDBACK ' ON | OFF '
SET HEADING ON/OFF
HEADING 就是指你的 SELECT 语句的输出结果的头部 储如 LAST_NAME 或
CUSTOMER_ID 的就是 SET HEADING ON 是默认的 当然 OFF 的时候就是在输出的
时候不输出列标头
SET HEADING ' ON | OFF '
SPOOL FILENAME/OFF
SPOOL 可以将你的查询结果直接地输入到一个文件中 要想打开 SPOOL 文件 你需
要输入
spool filename
如果想关掉 SPOOL 文件 你应该输入
spool off
355
…………………………………………………………Page 356……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
START FILENAME
大多数的我们所学习的 SQL 命令都是在 SQL》下运行的 另外的一种运行 SQL 语句的
方法是创建 SQL 执行文件 在 SQL*PLUS 中 运行 SQL 文件的命令是 START FILENAME
START FILENAME
ED FILENAME
ED 是 ORACLE 7 的用以打开文件 文件是已经存在的 的命令 当你使用 ED 打开
一个文件以后 你就进入了一个全屏幕的编辑环境 它的使用要比在 SQL 提示符下输入 SQL
语句更容易 你可以使用它来修改你的 SPOOL 文件 你将会发现当你在创建 SQL 脚本的
时候你会非常频繁地使用它 因为你出于定制的目的你不得不经常地修改脚本的内容 但
是 你的大多数定制工作是用 SQL*PLUS 来完成的
ED FILENAME
计算所有的表中的行数
在第一个例子中我们会向你演示如何去除你的 SPOOL 文件中的不正确的行 这样你
的 SQL 脚本在运行的时候就不会返回错误了
注 请注意在本例中我们所使用的编辑技术 因为我们在之后的例子中将不再进行这一步
工作的演示 我们假定到目前为止你已经掌握了基本的 SQL 语法 此外 你也可以使
用不同的编辑方法来编辑你的 SPOOL 文件
现在回想一下对一个表中的所有行进行计数的函数 COUNT * 你应该已经知道了如何
对一个表中的所有行进行计数 例如
INPUT
SELECT COUNT(*) FROM TBL1
OUTPUT
COUNT(*)
29
实现的方法很容易 可是如果你想对你的工程中所有属于你的表的行数进行计数时呢
例如 属于你的表如下表所列
356
…………………………………………………………Page 357……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
INPUT/OUTPUT
SELECT * FROM CAT;
TABLE_NAME TABLE_TYPE
ACCT_PAY TABLE
ACCT_REC TABLE
CUSTOMERS TABLE
EMPLOYEES TABLE
HISTORY TABLE
INVOICES TABLE
ORDERS TABLE
PRODUCTS TABLE
PROJECTS TABLE
VENDORS TABLE
10 rows selected。
分析
如果你想知道你的表有几行 你可能会对每一个表使用 COUNT * 函数 FEEDBACK
的结果如下
10 rows selected
下边的 SELECT 语句将会生成更多的 SELECT 语句来得到上表中的每一个表的行数
INPUT/OUTPUT
SQL》 SET ECHO OFF
SQL》 SET FEEDBACK OFF
SQL》 SET HEADING OFF
SQL》 SPOOL CNT。SQL
SQL》 SELECT 'SELECT COUNT(*) FROM ' || TABLE_NAME || ';'
2 FROM CAT
3 /
SELECT COUNT(*) FROM ACCT_PAY;
SELECT COUNT(*) FROM ACCT_REC;
SELECT COUNT(*) FROM CUSTOMERS;
SELECT COUNT(*) FROM EMPLOYEES;
SELECT COUNT(*) FROM HISTORY;
SELECT COUNT(*) FROM INVOICES;
357
…………………………………………………………Page 358……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SELECT COUNT(*) FROM ORDERS;
SELECT COUNT(*) FROM PRODUCTS;
SELECT COUNT(*) FROM PROJECTS;
select count(*) FROM VENDORS;
分析
在上例中的第一个动作使用了 SQL*PLUS 中的命令 设置 echo off feedback off 和
heading off 是将实际的输出结果加以简化 然后使用 SPOOL 命令来把输出的结果重定位到
一个叫 CNT。SQL 的文件中 最后的工作是执行这个 SELECT 语句 它将会生成其它形式
的 SQL 语句 注意在需要生成的 SELECT 语句上要使用单引号 成对的单引号和联接符
可以让你把实际的数据和字符串结合在一起成为一个新的 SQL 语句 本例中从数据字典中
选择了数据 命令 SPOOL OFF 则关闭了输出文件
技巧 在你创建了文件并把你的文件提交运行之前一定把编辑它以使它的语法更加符合你
的要求
INPUT
SQL》 SPOOL OFF
SQL》 ED CNT。SQL
OUTPUT
SQL》 SELECT 'SELECT COUNT(*) FROM '||TABLE_NAME||';' FROM CAT;
SELECT COUNT(*) FROM ACCT_PAY;
SELECT COUNT(*) FROM ACCT_REC;
SELECT COUNT(*) FROM CUSTOMERS;
SELECT COUNT(*) FROM EMPLOYEES;
SELECT COUNT(*) FROM HISTORY;
SELECT COUNT(*) FROM INVOICES;
SELECT COUNT(*) FROM ORDERS;
SELECT COUNT(*) FROM PRODUCTS;
SELECT COUNT(*) FROM PROJECTS;
SELECT COUNT(*) FROM VENDORS;
SQL》 SPOOL OFF
分析
358
…………………………………………………………Page 359……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SPOOL OFF 命令关闭了输出的文件 然后我们使用 ED 来编辑这个文件 这时你就会
进行你所创建的文件的内部了 你应该从这个文件中去掉不必要的行 例如已经知道了结
果的 SELECT 语句以及在文件末尾的 SPOOL OFF 命令
你的文件在编辑完之后应该如下所示 注意 其中的每一行都是一个完整的 SQL 语句
SELECT COUNT(*) FROM ACCT_PAY;
SELECT COUNT(*) FROM ACCT_REC;
SELECT