《oracle pl/sql程序设计》学习笔记一

↘锁芯ラ 提交于 2019-12-03 02:08:03

本篇主要是记录一些容易混淆或者以前理解不够清楚的知识点,只选择常用知识点。

一、case语句和case表达式
1、case语句和case表达式都有两种模式:简单型和搜索型。
    简单型:case exp when res1 then ... res2 then ... [else ...]  (end case |end);
    搜索型 :case when exp1 then ... exp2 then ... [else ...]  (end case |end).
2、区别
    case语句没有匹配项会报错;case表达式不会,返回null。
    case语句以end case结尾;case表达式以end结尾。

二、for循环只有数值型下标和游标两种方式循环,数值型的上下标只在第一次循环前求值(包括表达式计算和四舍五入)。

三、11g以后新增了continue [label1] [when exp1]语句,用于执行下一个循环。

四、异常处理
1、sqlcode
    获取当前异常号,正常为0.
2、sqlerrm
    最原始的异常信息获取方式,最大512字节。不带参数时返回当前sqlcode对应的信息。带参数时返回指定sqlcode的信息。
3、dbms_utility.format_error_stack
    比sqlerrm可容纳字节多,达1899字节,只能返回当前sqlcode对应的信息。
4、dbms_utility.format_error_backtrace
    10G以后新增,返回当前异常栈,从最开始异常的过程名和代码行号,一直回溯到当前调用块。可以快速定位异常位置。

为了获取最全的异常信息,建议使用dbms_utility.format_error_stack||dbms_utility.format_error_backtrace的方式输出,如果是调用的过程中有异常处理,那么应该把需要继续抛出的异常以下列两种方式抛出:
raise_application_error(-20008,dbms_utility.format_error_stack||dbms_utility.format_error_backtrace);--重建异常栈
raise_application_error(-20008,'当前添加的信息',true) ;--只是添加到当前异常栈,不会重建。
其他的方式都会使异常栈重建,而丢失之前的异常信息,所以不要用raise [...]抛出异常,除非你已经处理了之前的异常。

五、字符型
1、varchar2,推荐所有的字符型都使用此类型,pl/sql中最长32767字节,db中8i以后4000字节。
2、nvarchar2,和varchar2类似,只是使用国家字符集,且定义长度时默认以字符为单位,pl/sql中最长32767字节,db中8i以后4000字节。
3、char,不推荐使用,因为填充空格会带来很多意想不到的问题,且浪费空间,pl/sql中最长32767字节,db中8i以后2000字节。
4、nchar,和char类似,只是使用国家字符集,且定义长度时默认以字符为单位,pl/sql中最长32767字节,db中8i以后2000字节。
5、其他的字符类型都是为了兼容ansi sql定义的子类型。
6、char类型和“非varchar2类型”(如字面值、char)比较,先用空格填充到一样的长度再比较,如果和varchar2类型比较,不填充直接比较。
7、字面值,oracle默认当做char类型,plsql最多32760字节,db最多4000字节。

六、数值型
1、number,最基础的类型,金融类精确数据必须选择,number(p,s),p (1~38), s (-84~127).
2、pls_integer,binary_integer,simple_integer。pl/sql专用,二进制计算模式,10g以后不推荐使用binary_integer,用pls_integer代替,simple_integer是11g新增类型,简化pls_integer,不能为null,不检查溢出,不支持特殊谓词,速度非常快。因为pl/sql中基本不需要上述支持。
3、binary_float,binary_double。二进制计算模式,单精度浮点数和双精度浮点数,字面值后面加f或d。
4、simple_float,simple_double。pl/sql专用,二进制计算模式,11g以后新增类型,也是简化binary系列类型,高效率。

七、日期类型
1、date,精确到秒
2、timestamp,精确到9位小数秒,默认为6位小数秒。
3、timestamp with time zone,固定时区的timestamp
4、timestamp with local time zone,在客户端和服务器之间转换时区的timestamp.
5、interval year[0~4] to month,默认year是2
6、interval day[0~9] to second[0~9],默认day是2,second是6
7、yminterval_unconstrained,dsinterval_unconstrained使用在过程的参数和返回值中,不再使用默认精度,不损失精度。

八、其他类型
1、raw,不做字符集转换,pl/sql最大32767,db最大2000字节。
2、long ,long raw,pl/sql最大32760,db最大2GB-1字节。不推荐使用,以大对象代替。
3、urowid,rowid,使用urowid代替rowid,用来储存数据库的各种rowid。
4、记录类型,pl/sql专用,基于游标、表类型或者自定义的记录类型,type ... is record (...,...,).
5、关联数组,pl/sql专用,type .. is table of ... index by pls_integer / varchar2(..).类似java中的map
6、嵌套表,type ... is table of ...  ,可以作为db的列。列在表外。类似数据库表,索引值类似rowid
7、varray , type ... is varray of ... ,可以作为db的列。列在表内。类似java中的数组,保留顺序,固定长度。
8、集合类型的使用:嵌套表和varray需要初始化和extend扩展才能使用,但是初始化可以用(..,..,..)值列表的方式一次性赋值多个值;还可以和数据库中的嵌套表或varray进行转换而隐式初始化;select * bulk collect into ...也可以隐式初始化。关联数组不用初始化和extend扩展。varray不能delete某一行,只能trim掉最后一行或者全部delete,保证它是一个紧凑的集合。
9、bfile,blob,clob,nclob,大对象,bfile只读,文件在数据库外,lob可读写,文件在数据库内,数据库列中只存定位器。11g后,lob类型引入SecureFiles代替原来的baseFiles,改进lob的效率,需要初始化参数db_securefile=permitted,并且lob数据的表空间是ASSM。 
10、bolean,pl/sql专用。

九、子类型定义
子类型定义可以直接在基础类型上做特殊限制,也可以锚定类型。
锚定的子类型不会继承父类型的not null和缺省值。
锚定的类型也不会继承被锚定的数据库列上的not null和缺省值。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!