最近因为对Oracle比较感兴趣,所以打算深入学习一下PL/SQL,后期打算再学习一下Oracle ERP,正好有机会进到这个项目团队,正好可以跟老鸟门学习一下,下面是我的学习经历和笔记
PL/SQL块结构
DECLARE
/*
* 定义部分-定义常量、变量、复杂数据类型、游标、例解
*/
BEGIN
/*
* 执行部分-PL/SQL语句和SQL语句
*/
EXCEPTION
/*
* 例外处理部分-处理运行错误
*/
END; /* 块结束标记*/
定义部分DECLARE是可选的,执行部分以BEGIN开始,是必须的,例外处理部分以EXCEPTION开始,该部分是可选的,而END是PL/SQL块的结束标记
PL/SQL块分类 :可以分为匿名块和命名块,匿名块可以内嵌到应用程序中,也可以在交互环境使用。命名块是具有特定标识的PL/SQL块,命名块和匿名块非常相似,只不过在PL/SQL块前加以<<>>标记,当使用嵌入时,为了区分多级嵌套曾次关系,可以使用命名块加以区分。
子程序
子程序包括过程,函数,包。既可以开发客户端的子程序,也可以开发服务器端的子程序,客户端主要用在Developer中,而服务器子程序可以用在任何应用程序中,通过将商业逻辑和企业规则集成到PL/SQL子程序中。
过程 :是用于执行特定操作,当建立过程时,既可以指定输入参数(IN),也可以指定输出参数(OUT)。通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在SQL*PLUS中可以使用CREATE PROCEDURE命令建立过程。
eg:
CREATE PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal = newsal
WHERE lower(ename) = lower(name);
END;
SQL>exec update_sal('scott',2000);
SQL>call update_sal('scott',2000);
函数 :用于返回特定数据,当建立函数时,在函数头部必须包含RETURN子句,而在函数体内必须要包含RETURN语句返回数据。在SQL*PLUS中可以使用CREATE FUNCTION命令建立函数。
eg:
CREATE FUNCTION annual_income(name VARCHAR2)
RETURN NUMBER IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comm,0) INTO annual_salary
FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
SQL>VAR income NUMBER
SQL>CALL annual_income('scott') INTO :income
SQL>PRINT income
包 :用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数,在SQL*PLUS中可以使用CREATE PACKAGE命令建立包规范,使用CREATE PACKAGE BODY命令建立包体。
eg:
CREATE PACKAGE emp_pkg IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER);
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER;
END;
CREATE PACKAGE BODY emp_pkg IS
CREATE PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal = newsal
WHERE lower(ename) = lower(name);
END;
CREATE FUNCTION annual_income(name VARCHAR2)
RETURN NUMBER IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comm,0) INTO annual_salary
FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
END;
调用包的过程和函数时,在过程和函数名之前必须要带有包名作为前缀(包名.子程序名),如果要访问其他方案的包,还必须加方案作为前缀(方案名.包名.子程序名)
SQL>call emp_pkg.update_sal('scott',1500);
SQL>VAR income NUMBER;
SQL>call emp_pkg.annual_income('scott') INTO :income;
SQL>PRINT income
触发器 :是用于隐含执行的存储过程,当定义触发器时,必须要触发事件和触发操作,常用的触发事件包括INSERT、UPDATE、DELETE语句,而出发操作实际是一个PL/SQL块,在SQL*PLUS中,可以使用CREATE TRIGGER命令来完成。
PL/SQL数据类型:在编写PL/SQL程序时,可以使用标量类型、复合类型、参照类型、LOB类型。