Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92177513
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-09 21:15:01

   来源:IT专家网    作者:korn

 

案例二:置换变量

  我才刚开始使用Oracle的产品,我在执行下面两条命令的时候遇到了问题:ACCEPT 和PROMPT。我已经更改了行的顺序,有时候放在CHAR中,有时候删除,有时候放在PROMPT中,有时候删除。无论我怎么做还是收到错误信息。我甚至试过把ACCEPT 和PROMPT放在BEGIN的前后。
我想做的事情是这样的。在脚本的开始,我从键盘读取开始和结束日期,然后在程序的主要部分,我从一个表中使用SELECT读取,并测试看日期是否在键盘输入的两个日期之间。现在当我在SQL*Plus中执行/编译脚本的时候,我得到的错误信息是ORA-00922。

PROMPT
ACCEPT in_beg_date  PROMPT 'Enter beginning extract date mm/dd/yy '
PROMPT
ACCEPT in_end_date  PROMPT 'Enter ending extract date mm/dd/yy '
DECLARE
   beg_date VARCHAR2(8) := &in_beg_date;
   end_date VARCHAR2(8) := &in_end_date;
   beg_dte  DATE;
   end_dte  DATE;
...
BEGIN
   beg_dte := TO_DATE (beg_date, 'MM/DD/YY');
   end_dte := TO_DATE (end_date, 'MM/DD/YY');
...
   IF (outrec_abs_date >= beg_dte and <= end_dte) THEN
...

  说实话,看起来你对PROMPT 和 ACCEPT 有一个很好的理解。PROMPT 告诉SQL*Plus 在屏幕上书写一行文字。你在这里使用了两个PROMPT命令;每个命令都在屏幕上打印一个空行,这对于垂直间距很有好处。ACCEPT命令是等待用户输入一个置换变量的值。ACCEPT命令中可选的PROMPT 子句在用户输入数值的同一行中显示了一条信息。你在PL/SQL 块的外面放置PROMPT 和 ACCEPT 是正确的:他们是SQL*Plus 命令,不是PL/SQL 。

  你可能注意到当你运行这个脚本的时候,每一个拥有置换变量的行都引起了屏幕上的两行输出,例如:
old   3:    beg_date VARCHAR2(8) := &in_beg_date;
new   3:    beg_date VARCHAR2(8) := 09/01/03;

  这就显示了SQL*Plus 在看到一行包括了置换变量的代码的时候所作的工作:他用变量的数值(以&开头)置换了变量的名字。这就像你在文本编辑器,例如记事本中,用查找和置换一样,将一个字符串的每个出现(这里是&in_beg_date)都替换成了另一个字符串(09/09/03)。“原来”的行就是在代码中的样子。“新”的行是将要执行的样子。如果你执行了"beg_date VARCHAR2(8) := 09/01/03;"语句,会发生什么?SQL*Plus 会创建一个字符串变量并且用":="右侧的数值来进行初始化。在这个案例中,它是一个数字表达式,那么SQL*Plus 就会检测"(9/1) / 3"这个表达式,并将答案写为'3'。你实际的意思是:

  beg_date VARCHAR2(8) := '&in_beg_date';
  end_date VARCHAR2(8) := '&in_end_date';
  单引号是至关重要的。

  本文国际来源:

阅读(188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~