oracle procedure

2014-04-16

PL/SQL块最大优点:降低网络开销,提高应用程序性能。

1.procedure语法:

create or replace procedure procedure_name

(argu1 datatype,argu2 datatype...)

is [as]

PL/SQL Block;

procedure_name:存储过程名称

argu1,argu2...:参数名称,也可以指定输入参数(IN),也可以指定输出参数(OUT),也可以指定输入输出参数(IN OUT)

datatype:参数数据类型,不能指定长度。

is [as]:开始一个PL/SQL块

2.输出当前系统日期和时间的过程

create or replace PROCEDURE pro_output_time

is

begin

dbms_output.put_line(systimestamp );

end;

##调试方法

SQL> set serveroutput on;

1)方法一

SQL> exec pro_output_time;

16-APR-14 08.42.33.678767000 AM +08:00

2)方法二

SQL> call pro_output_time();

16-APR-14 08.42.47.881928000 AM +08:00

3)方法三

SQL> begin

  2  pro_output_time();

  3  end;

  4  /

3.获取雇员编号为7788的雇员名

create or replace procedure pro_emp_name

is

v_name emp.ename%type;    //v_name varchar2(50);

begin

select ename into v_name from emp where empno=7788;

DBMS_OUTPUT.put_line(v_name);

end;

4.雇员编号重复,deptno不存在

create or replace procedure pro_add_emp(v_empno number,v_ename varchar2,

v_sal number,v_deptno number,v_job varchar2 default 'CLERK')

is

v_no_deptno exception;

pragma exception_init(v_no_deptno,-2291);

begin

insert into emp(empno,ename,sal,deptno,job) 

values (v_empno,v_ename,v_sal,v_deptno,v_job);

commit;

EXCEPTION

when v_no_deptno then

RAISE_APPLICATION_ERROR(-20001, 'deptno is not exist.');

when dup_val_on_index then

RAISE_APPLICATION_ERROR(-20002, 'empno is duplicat.');

end;

##用异常函数

create or replace procedure pro_add_emp(v_empno number,v_ename varchar2,

v_sal number,v_deptno number,v_job varchar2 default 'CLERK')

is

v_error_code number;

v_error_message varchar2(100);

begin

insert into emp(empno,ename,sal,deptno,job) 

values (v_empno,v_ename,v_sal,v_deptno,v_job);

commit;

EXCEPTION

when others then

v_error_code :=sqlcode;

v_error_message :=SUBSTR(SQLERRM, 1, 100);

insert into errors(error_id,program_name,error_code ,error_message)

values(seq_errors.nextval,'pro_add_emp',v_error_code,v_error_message);

end;

##查看异常

select * from errors;

5.根据雇员编号获取雇员名称和薪水

create or REPLACE PROCEDURE pro_output_emp(v_empno number,

v_ename out varchar2,v_sal out number)

is

v_error_code NUMBER;

v_error_message varchar2(100);

begin

select ename,sal into v_ename,v_sal from emp where empno=v_empno;

exception

when others then

v_error_code :=sqlcode;

v_error_message :=substr(sqlerrm,1,100);

insert into errors(error_id,program_name,error_code,error_message)

values(seq_errors.nextval,'pro_output_emp',v_error_code,v_error_message);

end;

##查看存储过程

select * from user_source where name='PRO_OUTPUT_EMP'; --注意要大写

##删除存储过程

drop PROCEDURE procedure_name;

6.函数

函数用于返回特定值。

1)函数语法:

create or replace function function_name(argu1 datatype,argu2 datatype...)

return datatype

is [as]

PL/SQL Block;

function_name:函数名称

argu1,argu2...:参数名称,也可以指定输入参数(IN),也可以指定输出参数(OUT),也可以指定输入输出参数(IN OUT)

datatype:参数数据类型,不能指定长度。

is [as]:开始一个PL/SQL块

2)在建立函数时,在函数头部必须要带有RETURN语句,在函数体内至少要包含一条RETURN语句。

AA:不带任何参数

//查看当前用户

create or replace FUNCTION fun_user

RETURN VARCHAR2

is

v_user varchar2(50);

begin

select username  into v_user from user_users;

RETURN v_user;

end;

BB:带IN参数

//通过雇员名获取员工薪水

create or replace FUNCTION fun_get_sal(v_ename varchar2)

RETURN number

is

v_sal number;

v_error_code number;

v_error_message varchar2(100);

begin

select sal  into v_sal from emp where upper(ename)=upper(v_ename) ;

RETURN v_sal;

EXCEPTION

when others then

v_error_code :=sqlcode;

v_error_message :=substr(sqlerrm,1,100);

insert into errors(error_id,program_name,error_code,error_message)

values(seq_errors.nextval,'fun_get_sal',v_error_code,v_error_message);

end;

CC:带OUT参数

如果要同时返回多个数据,需要使用输出参数

//返回雇员名所在的部门名和岗位

create or replace function fun_ename_info(v_ename varchar2,v_job out varchar2)

return varchar2

is

v_deptname dept.dname%type;


begin

select b.dname,a.job into  v_deptname,v_job from emp a 

join dept b on a.deptno=b.deptno

where upper(a.ename) = upper(v_ename);

return v_deptname;

end;

##调试

SQL> var job varchar2(50);

SQL> var dname varchar2(50);

SQL> exec :dname :=fun_ename_info('scott',:job);

SQL> print dname job;

3)函数调试

##方法一

SQL> select fun_user from dual;

##方法二

SQL> var v_res varchar2(100);

SQL> exec :v_res :=fun_user;

SQL> print v_res;

//扩展:

主机名.IP地址存放位置

C:\Windows\System32\drivers\etc ---windows

 /etc/hosts                     ---ubuntu

远程桌面的端口3389

WIN7运行输入:

windows+r     ---打开运行

mstsc         ---显示远程连接桌面

taskmgr.exe   ---打开任务管理器

services.msc  ---打开系统服务

eventvwr      ---打开事件查看器


你可能感兴趣的:(procedure,fuction)