定义函数
CREATE OR REPLACE FUNCTION function_name
[(part_name datatype [...])]
RETURN datatype
IS|AS
BEGIN
function_body
return value
END;
RETURN datatype 不需要精确指定,如 number 就不需要写成 number(5,2),只写成 number就可以了
例:定义一个函数,返回一个指定部门的平均工资
CREATE OR REPLACE FUNCTION disp_dept_sal3(d_no scott.emp.deptno%type)
RETURN scott.emp.sal%type
AS
avg_sal scott.emp.sal%type;
BEGIN
select avg(sal) into avg_sal from scott.emp where deptno=d_no;
return avg_sal;
EXCEPTION
when no_data_found then
return -1;
END;
/
函数调用:
直接在表达式中使用,即可
函数加密
1、把创建过程用脚本保存,不要直接在sqlplus 去建
2、用wrap对创建过程的脚本加密
wrap iname=create_pro.sql name=aa.sql
原始文件名 加密后的文件名
3、拿这个加密后的脚本去运行,来创建存储过程
与函数相关的数据字典:
dba_source
dba_objects
参数传递方式
与过程相同
函数删除
DROP FUNCTION function_name
SQL> drop function disp_dept_sal3;
包
包是将一些plsql对象,如过程、函数封装在一起
包的构成:
包由两个部分构成:
包头
对包的声明,说明包中有哪些对象,至于对象的实现不管
包体
对包头声明对象的实现,只要包头声明过的对象,包体都要有相应的实现代码
包头创建:
CREATE OR REPLACE PACKAGE package IS|AS
包对象声明
END
例:
CREATE OR REPLACE PACKAGE mytest AS
procedure disp_dept_sal(d_no scott.emp.deptno%type);
function disp_dept_sal2(d_no scott.emp.deptno%type) return scott.emp.sal%type;
END;
/
包体的创建:
CREATE OR REPLACE PACKAGE BODY package IS|AS
包头声明的每个对象的代码,每个对象完了以后,要有END结束,如
FUNCTION ....
END;
PROCEDURE ...
END;
END;
/
例:
CREATE OR REPLACE PACKAGE BODY mytest AS
procedure disp_dept_sal(d_no scott.emp.deptno%type)
as
v_sal scott.emp.sal%type;
begin
select avg(sal) into v_sal from scott.emp where deptno=d_no;
dbms_output.put_line(d_no||' avg sal: '||v_sal);
exception
when no_data_found then
dbms_output.put_line('No data found!');
end;
function disp_dept_sal2(d_no scott.emp.deptno%type)
return scott.emp.sal%type
as
v_sal scott.emp.sal%type;
begin
select max(sal) into v_sal from scott.emp where deptno=d_no;
return v_sal;
end;
END;
/
包的使用:
与单独对象相似,但具体指明哪个包,包中的哪个对象,如:
exec 包名.包中对象名
exec mytest.disp_dept_sal(10);
select mytest.disp_dept_sal2(20) from dual;
与包相关的数据字典:
dba_objects
dba_source
包加密
与过程一样
删除包
包的删除可以只删除包体,保留包头,但不能只删除包头,保留包体
删除包体
DROP PACKAGE BODY package_name
包头包体一起删:
DROP PACKAGE package_name
包的重载:
包中包含多个同名的对象,对象名相同,但参数个数或参数数据类型不一样
CREATE OR REPLACE FUNCTION function_name
[(part_name datatype [...])]
RETURN datatype
IS|AS
BEGIN
function_body
return value
END;
RETURN datatype 不需要精确指定,如 number 就不需要写成 number(5,2),只写成 number就可以了
例:定义一个函数,返回一个指定部门的平均工资
CREATE OR REPLACE FUNCTION disp_dept_sal3(d_no scott.emp.deptno%type)
RETURN scott.emp.sal%type
AS
avg_sal scott.emp.sal%type;
BEGIN
select avg(sal) into avg_sal from scott.emp where deptno=d_no;
return avg_sal;
EXCEPTION
when no_data_found then
return -1;
END;
/
函数调用:
直接在表达式中使用,即可
函数加密
1、把创建过程用脚本保存,不要直接在sqlplus 去建
2、用wrap对创建过程的脚本加密
wrap iname=create_pro.sql name=aa.sql
原始文件名 加密后的文件名
3、拿这个加密后的脚本去运行,来创建存储过程
与函数相关的数据字典:
dba_source
dba_objects
参数传递方式
与过程相同
函数删除
DROP FUNCTION function_name
SQL> drop function disp_dept_sal3;
包
包是将一些plsql对象,如过程、函数封装在一起
包的构成:
包由两个部分构成:
包头
对包的声明,说明包中有哪些对象,至于对象的实现不管
包体
对包头声明对象的实现,只要包头声明过的对象,包体都要有相应的实现代码
包头创建:
CREATE OR REPLACE PACKAGE package IS|AS
包对象声明
END
例:
CREATE OR REPLACE PACKAGE mytest AS
procedure disp_dept_sal(d_no scott.emp.deptno%type);
function disp_dept_sal2(d_no scott.emp.deptno%type) return scott.emp.sal%type;
END;
/
包体的创建:
CREATE OR REPLACE PACKAGE BODY package IS|AS
包头声明的每个对象的代码,每个对象完了以后,要有END结束,如
FUNCTION ....
END;
PROCEDURE ...
END;
END;
/
例:
CREATE OR REPLACE PACKAGE BODY mytest AS
procedure disp_dept_sal(d_no scott.emp.deptno%type)
as
v_sal scott.emp.sal%type;
begin
select avg(sal) into v_sal from scott.emp where deptno=d_no;
dbms_output.put_line(d_no||' avg sal: '||v_sal);
exception
when no_data_found then
dbms_output.put_line('No data found!');
end;
function disp_dept_sal2(d_no scott.emp.deptno%type)
return scott.emp.sal%type
as
v_sal scott.emp.sal%type;
begin
select max(sal) into v_sal from scott.emp where deptno=d_no;
return v_sal;
end;
END;
/
包的使用:
与单独对象相似,但具体指明哪个包,包中的哪个对象,如:
exec 包名.包中对象名
exec mytest.disp_dept_sal(10);
select mytest.disp_dept_sal2(20) from dual;
与包相关的数据字典:
dba_objects
dba_source
包加密
与过程一样
删除包
包的删除可以只删除包体,保留包头,但不能只删除包头,保留包体
删除包体
DROP PACKAGE BODY package_name
包头包体一起删:
DROP PACKAGE package_name
包的重载:
包中包含多个同名的对象,对象名相同,但参数个数或参数数据类型不一样
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21175589/viewspace-755685/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21175589/viewspace-755685/