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 ---打开事件查看器