一、动态Sql
在PL/Sql中DML和事务控制语句可以使用,然而DDL和会话控制语句却不能使用,只有通过动态Sql可以实现。
Execute Imediate ' strCmd' [using argsList]
二、异常
有三种类型的异常。
1、预定义异常---由数据库系统触发
2、非预定义异常---可以把自定义异常注册为预定义级别的或系统级的异常。
Declare
Exception myEpt;
Pragma Exception_Init(myEpt,-1);//-1或者别的数字特指系统预定义异常
Begin
----
Exception
when myEpt then
-----;
End
3、自定义异常
注意:用户自定义错误信息Raise_Applicion_Error(-20000- -20999,'自定义错误信息');
三、游标管理---数据库的任何操作都离不开游标的使用。
游标的属性:%Found、%NotFound、% RowCount、%IsOpen
1、游标类型:
静态游标:分为隐式游标和显式游标。
隐式游标指Dml语句执行时数据库系统所使用的游标。游标的属性加‘SQL’前缀
显式游标----
A、声明:Cursor cursor_name [params...] [Return return_type]
is/as selectstr
B、打开:open cursor_name ;
C、提取:Fetch cursor_name into ...
D、Close cursor_name ;
注意:select 语句只能包括一个表(指更新时),而且update和Delete 语句只能在打开游标并提取特定行后才能使用。
在plSql中利用游标使用where current of cursor_name 字句进行每行记录的更新或修改。
游标是可以带参数的。Sql中不行。
ref游标:动态游标或引用游标。
A、Type ref_type is Ref Cursor定义游标类型
B、ref_type VariantName声明游标变量
C、open VariantName for 'selectStr' [using argsList]打开游标运行时获得结果集
D、Close VariantName;关闭游标
注意:Execute Imediate 只能返回单行或不返回,而ref游标可以返回任何结果集合。
注意它是一个引用,可以返回到客户端程序。在存储过程中不允许出现select * from tb语句,只能出现select into 语句。只能使用ref 游标返回结果集。这与sqlServer是不同的。
不能在程序包中声明游标变量,但是可定义游标类型。
不能null
不能使用比较运算
不能在数据库列中存储游标变量。
四、子程序和程序包
1、子程序包括存储过程和函数。
存储过程不能有返回值,但可以有输入输出参数。而函数有返回值,只有输入数据库类型参数。
存储过程中可以有return 语句。
2、程序包是子程序和变量、常量的集合,它更象是一个包含了数据成员和成员方法的类。
性能上包内的成员同时加载性能更优。
3、独立事务的声明---- PragMa Autonomous Transaction在begin之前。
4、函数和过程的纯度级别--
WNDS|RNDS|WNPS|RNPS(不允许写数据库、不允许读数据库、不允许写程序包变量、不允许读程序包变量)
语法:pragma restrict_references(函数过程名字,纯度级别)
5、程序包中的游标。游标必须要有返回类型
五、触发器
当在插入数据时,用before 触发器,当审计数据时用after触发器。注意when字句的使用,设计触发的条件
触发器类型:
1、行级触发器for each row
2、语句触发器
3、before/after/instead of(视图触发器)
4、模式触发器(ddl 触发器)
5、数据库触发器