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语句