官方文档
Database PL/SQL Language Reference
PL/SQL Packages and Types Reference
所有文档位置Oracle Database Documentation
可选择对应版本的数据库并查看对应BookShelf
简介与HelloWorld
Procedure Language/SQL是Oracle对SQL语言的过程化扩展,是面向过程的语言。
不同数据库的SQL扩展:Oracle: PL/SQL;DB2: SQL/PL;SQL Server: Transac-SQL(T-SQL)
1 | set serveroutput on |
Oracle默认事务级别是read Only所以需要在更改完成后commit;
回滚使用rollback;
可以在SQL Plus中使用命令desc 程序包名
查看各个函数如:
1 | SQL> desc dbms_output |
基础语法
PL/SQL的程序结构
1 | declare |
定义基本变量类型:char,varchar2,date,number,boolean,long
赋值运算:=
和into
(查询语句中使用)
引用型变量var1 table.column%type
记录型变量var2 table%rowtype
,变量分量的引用var2.column
if语句
1 | IF 条件 THEN 语句;语句; END IF; |
1 | set serveroutput on |
循环语句
while循环while 条件 loop 循环体 end loop;
loop循环loop EXIT when 条件1;[EXIT when 条件2;] 循环体 end loop;
(常用,易于控制光标)
for循环for I in m..n loop 循环体 end loop;
如for p in 1..10 loop dbms_output.put_line(p) end loop;
光标Cursor
相当于集合,因为Oracle没有数组集合
语法CURSOR 光标名 [(参数名 数据类型[,参数名 数据类型]...)] IS SELECT 语句;
打开光标open 光标名;
取值fetch 光标名 into 变量名;
关闭释放close 光标名;
光标的属性:%found
,%notfound
,%isopen
,%rowcount
(影响的行数)
光标数限制:默认一个会话300个show parameter cursor
修改光标数alter system set open_cursors=400 scope=both
(scope:both,memroy,spfile-数据库需重启)
带参数的光标:相当于高维数组的一维选择,定义和打开的时候带参数,定义带参数名,打开带具体参数。
例外Exception
系统例外:no_data_found, too_many_rows, zero_divide, value_error, timeout_on_resource
1 | exception |
自定义例外
定义类型是exception
的变量然后用raise
抛出
Oracle的一些函数:
NVL(expr1,expr2)
如果expr1和expr2的数据类型一致,则:
如果expr1为空(null),那么显示expr2,
如果expr1的值不为空,则显示expr1。NVL2(expr1,expr2, expr3)
如果expr1不为NULL,返回expr2; expr1为NULL,返回expr3。
expr2和expr3类型不同的话,expr3会转换为expr2的类型,转换不了,则报错。NULLIF(expr1,expr2)
如果expr1和expr2相等则返回空(NULL),否则返回expr1。coalesce(expr1, expr2, expr3,…,exprn)
返回表达式中第一个非空表达式,如果都为空则返回空值。
所有表达式必须是相同类型,或者可以隐式转换为相同的类型,否则报错。