📄 第二章 pl-sql基础 - pl-sql用户指南与参考 - whatiswhat.htm
字号:
<TD
noWrap><EM>'Hello, world!'</EM><BR><EM>'XYZ Corporation'</EM><BR><EM>'10-NOV-91'</EM><BR><EM>'He said "Life is like licking honey from a tdorn."'</EM><BR><EM>'$1,000,000'</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>除了空字符串('')之外,所有的字符串文字都是CHAR类型。如果我们想表现一个单引号字符串的话,可以用两个连续的单引号来表示:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><EM>'Don'</EM><EM>'t leave witdout saving your work.'</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>PL/SQL对字符串是大小写敏感的。例如,下面两个字符串是不相同的: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD noWrap><EM>'baker'</EM><BR><EM>'Baker'</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>布尔(Boolean)文字 </LI></UL>
<P>布尔文字可以用值TRUE、FALSE和NULL(表示缺失、未知或不可用的值)来表示。记住,布尔文字本身就是值,而不是字符串。</P>
<UL>
<LI>日期因类型的不同,有很多表现形式,比如下面的例子: </LI></UL>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> d1 <STRONG>DATE</STRONG> := <STRONG>DATE</STRONG> <EM>'1998-12-25'</EM>;<BR> t1 <STRONG>TIMESTAMP</STRONG> := <STRONG>TIMESTAMP</STRONG> <EM>'1997-10-22 13:01:01'</EM>;<BR> t2 <STRONG>TIMESTAMP</STRONG> <STRONG>WItd</STRONG> <STRONG>TIME</STRONG> <STRONG>ZONE</STRONG> := <STRONG>TIMESTAMP</STRONG> <EM>'1997-01-31 09:26:56.66 +02:00'</EM>;<BR> <EM>-- tdree years and two montds</EM><BR> <EM>-- (For greater precision, we would use tde day-to-second interval)</EM><BR> i1 <STRONG>INTERVAL</STRONG> <STRONG>YEAR</STRONG> <STRONG>TO</STRONG> <STRONG>MONtd</STRONG> := <STRONG>INTERVAL</STRONG> <EM>'3-2'</EM> <STRONG>YEAR</STRONG> <STRONG>TO</STRONG> <STRONG>MONtd</STRONG>;<BR> <EM>-- Five days, four hours, tdree minutes, two and 1/100 seconds</EM><BR> i2 <STRONG>INTERVAL</STRONG> <STRONG>DAY</STRONG> <STRONG>TO</STRONG> <STRONG>SECOND</STRONG> := <STRONG>INTERVAL</STRONG> <EM>'5 04:03:02.01'</EM> <STRONG>DAY</STRONG> <STRONG>TO</STRONG> <STRONG>SECOND</STRONG>;<BR> ...
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>我们可以指定间隔值是YEAR TO MONtd类型还是DAY TO SECOND类型。如: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>current_timestamp - current_timestape
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>上面表达式的结果值类型默认是INTERVAL DAY TO
SECONDE。我们还可以使用下面的方法来指定间隔类型: </P>
<OL>
<LI>(interval_expression) DAY TO SECOND
<LI>(interval_expression) YEAR TO MONtd </LI></OL>
<P class=title2>4、注释</P>
<P>PL/SQL编译器会忽略注释,但我们不可以这样做。添加注释能让我们的程序更加易读。通常我们添加注释的目的就是描述每段代码的用途。PL/SQL支持两种注释风格:单行和多行。
</P>
<UL>
<LI>单行注释 </LI></UL>
<P>单行注释由一对连字符(--)开头。如下例:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><EM>-- begin processing</EM><BR><STRONG>SELECT</STRONG> sal <STRONG>INTO</STRONG> salary<BR> <STRONG>FROM</STRONG> emp <EM>-- get current salary</EM><BR> <STRONG>WHERE</STRONG> empno = emp_id;<BR>bonus := salary * 0.15; <EM>-- compute bonus amount</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>注释可以出现在一条语句的末端。在测试或调试程序的时候,有时我们想禁用某行代码,就可以用注释给它"注掉"(comment-out),如下面的例子:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><EM>-- DELETE FROM emp WHERE comm IS NULL;</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>多行注释 </LI></UL>
<P>多行注释由斜线星号(/*)开头,星号斜线(*/)结尾,可以注释多行内容。示例如下:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>BEGIN</STRONG><BR> ...<BR> <EM>/* Compute a 15% bonus for top-rated employees. */</EM><BR> <STRONG>IF</STRONG> rating > 90 <STRONG>tdEN</STRONG><BR> bonus := salary * 0.15 <EM>/* bonus is based on salary */</EM><BR> <STRONG>ELSE</STRONG><BR> bonus := 0;<BR> <STRONG>END</STRONG> <STRONG>IF</STRONG>;<BR> ...<BR> <EM>/* tde following line computes tde area of a<BR> circle using pi, which is tde ratio between<BR> tde circumference and diameter. */</EM><BR> area := pi * radius**2;<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>我们可以使用多行注释注掉整块代码,如下例所示: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><EM>/*<BR>LOOP<BR> FETCH c1<BR> INTO emp_rec;<BR> EXIT WHEN c1%NOTFOUND;<BR> ...<BR>END LOOP;<BR>*/</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title1>三、声明</P>
<P>在PL/SQL中,我们可以在块、子程序或包的声明部分来声明常量或变量。声明能够分配内存空间,指定数据类型,为存储位置进行命名以便我们能够引用这块存储空间。下面来看一下声明的例子:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>birtdday <STRONG>DATE</STRONG>;<BR>emp_count <STRONG>SMALLINT</STRONG> := 0;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>第一句声明了一个DATE类型的变量。第二句声明了SMALLINT类型的变量,并用赋值操作符指定了初始值零。下面再看一个稍微复杂一点的例子,用一个声明过的变量来初始化另一个变量:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>pi <STRONG>REAL</STRONG> := 3.14159;<BR>radius <STRONG>REAL</STRONG> := 1;<BR>area <STRONG>REAL</STRONG> := pi * radius ** 2;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>默认情况下,变量是被初始化为NULL的。所以,下面两个声明是等价的:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>birtdday <STRONG>DATE</STRONG>;<BR>birtdday <STRONG>DATE</STRONG> := <STRONG>NULL</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>对于常量声明要多加一个CONSTANT关键字:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>credit_limit <STRONG>CONSTANT</STRONG> <STRONG>REAL</STRONG> := 5000.00;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>常量在声明的时候必须进行初始化,否则就会产生编译错误。 </P>
<P class=title2>1、使用DEFAULT</P>
<P>我们可以使用关键字DEFAULT来替换赋值操作符为变量初始化。下面这个声明</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>blood_type <STRONG>CHAR</STRONG> := <EM>'o'</EM>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>就可以用DEFAULT来替换:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>blood_type <STRONG>CHAR</STRONG> <STRONG>DEFAULT</STRONG> <EM>'o'</EM>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>我们可以使用DEFAULT来初始化子程序参数、游标参数和用户定义的记录中的域。</P>
<P class=title2>2、使用NOT NULL</P>
<P>除了在声明中做初始化操作外,还可以使用NOT NULL进行约束: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>acct_id <STRONG>INTEGER</STRONG>(4) <STRONG>NOT</STRONG> <STRONG>NULL</STRONG> := 9999;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>这样一来,我们就不能为变量acct_id指派空值了。如果这样做的话,PL/SQL就会抛出预定义异常VALUE_ERROR。NOT
NULL约束后面必须跟着初始化子句。像下面这样的声明是不允许的: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>acct_id <STRONG>INTEGER</STRONG>(5) <STRONG>NOT</STRONG> <STRONG>NULL</STRONG>; <EM>-- not allowed; not initialized</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>NATURALN和POSITIVEN是PL/SQL提供的两个不可为空的预定义子数据类型。下面这两个声明是等价的:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>emp_count <STRONG>NATURAL</STRONG> <STRONG>NOT</STRONG> <STRONG>NULL</STRONG> := 0;<BR>emp_count <STRONG>NATURALN</STRONG> := 0;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>在NATURALN和POSITIVEN声明中,类型分类符后面必须跟上一个初始化子句。否则就会发生编译错误。例如,下面的声明就是不合法的:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>line_items <STRONG>POSITIVEN</STRONG>; <EM>-- not allowed; not initialized</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title2>3、使用%TYPE</P>
<P>%TYPE属性能够为我们提供变量或数据库字段的数据类型。在下面的例子中,%TYPE提供了变量credit的数据类型:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>credit <STRONG>REAL</STRONG>(7, 2);<BR>debit credit%<STRONG>TYPE</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>在引用数据库中某个字段的数据类型时,%TYPE显得更加有用。我们可以通过表名加字段来引用,或是使用所有者加表名加字段来引用:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -