分类: Oracle
2009-09-08 01:22:23
2.1.2 充分利用PL/SQL 变量
变量可以被用来保存临时值。变量的语法为:
请注意,标识符v_last_name 和V_LAST_NAME 被认为是相同的,因为PL/SQL 是不区分大小写的。
接下来,考虑如下非法标识符范例:
标识符X+Y 是非法的,因为它包含一个加号。加号是PL/SQL 预留使用的,以表示一个加法操作。由于标识符必须以字母开头,所以1st_year 也是非法的。最后,student ID 中包含空格,所以也是非法的标识符。
接下来,考虑另一个例子:
考虑所产生的输出。由于& 出现在?rst&last_names 变量中,变量的一部分被认为是替代变
量(本书第1 章已经讨论过替代变量)。换句话说,PL/SQL 编译器会把变量名中& 号之后的部分(last_names)视为替代变量。结果是,每当编译器遇到& 符号,都会提示用户输入last_names 变量的值。
要特别注意,尽管这个例子不会导致任何语法错误,但是?rst&last_names 仍旧是一个无效的标识符,因为& 被预留用于替代变量。为避免这个问题,可以把?rst&last_names 变量名修改为?rst_and_last_names 。因此,只有当需要在程序中把& 符号用作替代变量时,才会在变量中使用它。同时,考虑所开发和运行PL/SQL 语句的程序类型也很重要。如果程序(或者PL/SQL 语句块)被SQL *Plus 执行,确实就是如此。当编写存储代码时,不要使用& 符号,但是也许会使用参数。
提示如果使用Oracle SQL Developer,需要在运行这个脚本之前,单击最左边的按钮“Enable DBMS Output”。
A)如果在SQL *Plus 或者Oracle SQL Developer 中运行这个范例,会得到什么结果呢?
答案:假设执行SET SERVEROUTPUT ON,只会得到输出‘born on’。原因是v_name 和v_dob 变量没有值。
B)运行这个程序,查看运行结果。当焦点从一行切换到另一行时,解释所发生的事情。
答案:3 个变量被声明。当每个变量被声明时,其初始值为null 。v_name 变量被定义为VARCHAR2,长度是30;v_dob 变量被定义为字符类型日期;v_us_citizen 变量被定义为BOOLEAN 。当可执行部分开始时,这些变量没有值。因此,当使用DBMS_OUTPUT 来输出这些变量的值时,结果为空。
如果按照下面的样子替换这些变量,就可以看到具体值:使用COALESCE(v_name,'No Name')替代v_name,使用COALESCE(v_dob,'01-Jan-1999')替代v_dob 。
COALESCE 函数会把表达式列表中每个表达式与NULL 进行比较,并返回第1 个非NULL 表达式的值。在此情况下,会比较v_name 变量和‘No Name’字符串,并返回值‘No Name’。这是因为v_name 变量尚未被初始化,因此其值还是NULL 。本书第5 章会讨论COALESCE 函数。
运行这个语句块,会得到如下结果: