PLSQL重头戏来了,前期介绍的四种变量,游标,集合,都是为后续的子程序服务的,子程序包括两类一个是函数,一个是存储过程,
1)建立和调用过程
2)建立和调用函数
3)管理PLSQL子程序
sqlplus中调用过程有两种一种call out_time() 而是exec out_time
【过程】
过程是执行特定的操作,建立一个特定的过程,语法如下比较简单,
create [or replace] procedure procedure_name
(argument1 [model] datatype1,..)
is [as]
pl/sql block;
可以带参数 带参数就是IN 或者OUT 或者 INOUT 带参数就指定类型即可
eg1)建立一个不带参数的过程
create or replace procedure out_time
is
begin
dbms_output.put_line(systimestamp);
end;
eg2)带参数的
create or replace procedure add_employee(eno number,name varchar2)
is
e_integrity exception;
pragma exception_init(e_integrity,-2291);
begin
inter into emp(empno,ename) values(eno,name);
执行 exec add_employee(1111,'Mary');
eg3)带out参数
create or replace procedure query_employee
(eno number,name out varchar2)
is
begin
select ename into name from emp where empno=eno;
var name varchar2(10) 带了输出参数的一定要提前定义一个变量接收输出的参数
exec query_employee(7788,:name);
print name ;
eg4)带有IN OUT参数
create or replace procedure compute
(num1 IN OUT number)
eg5)给子程序传递变量和数据
create or replace procedure add_dept
(dno number,dname varchar2 default null,loc varchar2 default null)
is
begin
insert into dept values(dno,dname,loc);
传递变量
exec add_dept(50,'sales','new youk');
exec add_dept(60);
exec add_dept(70,'add');
exec add_dept(dname=>'sals',dno=>50);
exec add_dept(dno=>60);
exec add_dept(70,dname=>'dsldsf');
【过程函数的维护 】user_source;
建立了过程之后,Oracle会将过程名,源代码及其执行代码存放到数据字典中,当调用过程时,应用程序会按照其执行代码直接执行,而不需要重新解析过程代码,所以子程序优于执行直接sql语句
select text from user_source where name ='ADD_DEPT';
drop procedure add_dept;
select object_name ,created,status from user_objects where object_type in ('PROCEDURE','FUNCTION'); user_objects包含了当前用户的所有对象。
【编译的排错】USER_ERRORS维护此用户当前的错误
show errors procedure procedure_name;
select line||'/'||position ,text from user_errors where name='XXXNAME';
【函数和过程有个依赖关系】
依赖关系有直接还有间接,间接就是隔山打牛,直接你就懂了,引用了哪个对象,哪个对象就叫做被引用对象,两种方法确定关系,数据字典user_dependencies 和deptree ideptree后者可以确定直接还是间接依赖,唯一需要注意的是当修改了被引用对象的结构时,相关依赖对象就会变成无效状态,需要重新编译这些存储对象
alter procedure add_employee complie;
alter view dept10 complie;
alter function get_info complie;
http://aklaus.blog.51cto.com/9724632/1950055 这个说明替代变量的使用
【函数】用于返回特定的数据,语法如下
create or replace function function_name
(argument1 [model1] datatype1,
argument2 [model2] datatype2,
...)
return datatype
is|as
plsql block;
注意的是 函数的头部必须带有return字句,在函数体内至少存在一条return语句。
eg1)最简单的函数
SQL> create or replace function get_user
2 return varchar2
3 is
4 v_user varchar2(10);
5 begin
6 select username into v_user from user_users;
7 return v_user;
8 end;
9 /
SQL> var v1 varchar2(100);
SQL> exec :v1:=get_user; 利用替代变量及调用使用方法,有歧义的是exec :v1:get_user为什么执行完之后就显示了结果,有可能是环境变量问题
v1
---------
SCOTT
SQL> print v1
v1
---------
SCOTT
SQL> select get_user from dual;
GET_USER
--------------------------------------------------------------------------------
SCOTT
SQL> set serveroutput on;
SQL> exec dbms_output.put_line(get_user);
SCOTT
PL/SQL procedure successfully completed
之后的就是带参数IN OUT之类的用法 注意如果带了out参数,那么必须定义变量接收out参数的输出值,不能在sql语句中调用该函数。
【函数的使用限制】
函数必须返回数据,只能作为表达式的一部分调用,函数可以使用以下地方调用:
select命令
where跟having字句
connect by startwith order by 以及group by
insert values中
update set 中
sql语句中只能调用存储函数(服务器端的) 调用的函数只能带有输入参数,函数类型不能是plsql特有的数据类型如boolean table record 调用的函数不能包含insert update delete语句
本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1954699