1.Oracle中function和procedure的区别:
1).可以理解函数是存储过程的一种
2).函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
3).函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
4).在sql数据操纵语句中只能调用函数而不能调用存储过程,
5).function必须有返回值,并且只能有一个返回值;
6).procedur不叫返回值,叫带出,可以带出多个值;
7).packages、package bodies是同时存在的,packages可包括function,procedure
2.FUNCTION语法:
查询数据库中函数:select * from dba_objects where object_type='FUNCTION';
CREATE OR REPLACE FUNCTION 函数名 --参数:IN、OUT、IN OUT,当参数未指定时,表示为IN
RETURN 返回值类型 -用于指定函数返回值的数据类型,不能指定其长度
IS
声明部分;
BEGIN
函数体;
RETURN 变量;
END;
3.PROCEDURE语法:
查询数据库中存储过程:select * from dba_objects where object_type='PROCEDURE';
create or replace procedure 存储过程名(param1 in type,param2 out type) as
变量1 类型(值范围);
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
If (判断条件) then
Select 列名 into 变量2 from 表A where列名=param1;
Dbms_output.Put_line(‘打印信息’);
Elseif (判断条件) then
Dbms_output.Put_line(‘打印信息’);
Else
Raise 异常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
注意事项:
1, 存储过程参数不带取值范围,in表示传入,out表示输出
2, 变量带取值范围,后面接分号
3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录
4, 用select 。。。into。。。给变量赋值
5, 在代码中抛异常用 raise+异常名
4.PACKAGE语法
包的作用 : 包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 变量 ) 放于包中 , 相当于一个容器 。 将声明语句放入包中的好处是 : 用户可以从其他 PL/SQL 块中对其进行引用 , 因此包为 PL/SQL 提供了全程变量 。
包分为两部分 : 包头和包体。
如何创建包
1) 包头 :
语法格式 :
CREATE OR REPLACE PACKAGE package_name /* 包头名称 */
IS|AS pl/sql_package_spec /* 定义过程 , 函数以及返回类型 , 变量 , 常量及数据类型定义 */
定义包头应当遵循以下原则 :
1) 包元素位置可以任意安排 。然而在声明部分 , 对象必须在引用前进行声明 。
2) 包头可以不对任何类型的元素进行说明 。 例如 , 包头可以只带过程和函数说明语句 , 而不声明任何异常和类型 。
3) 对过程和函数的任何声明都必须只对子程序和其参数进行描述 , 不能有任何代码的说明 , 代码的实现只能在包体中出现 。 它不同于块声明 , 在块声明中 , 过程和函数的代码可同时出现在声明部分 。
2. 包体 :
语法格式 :
CREATE OR REPLACE PACKAGE BODY package_name/* 包名必须与包头的包名一致 */
IS | AS pl/sql_package_body /* 游标 , 函数 , 过程的具体定义 */
包体是与包头相互独立的 , 包体只能在包头完成编译后才能进行编译 。 包体中带有包头中描述的子程序的具体实现的代码段 。 除此之外 , 包体还可以包括具有包体人全句属性的附加声明部分 , 但这些附加声明对于包头是不见的 。