存储过程
--存储过程
--创建存储过程
CREATE OR REPLACE PROCEDURE add_emp
(eno NUMBER,
ename VARCHAR2,
salary NUMBER,
dno NUMBER,
job VARCHAR2 DEFAULT 'clerk'
)IS
BEGIN
INSERT INTO emp
(empno,ename,sal,job,deptno)
VALUES
(eno,ename,salary,job,dno);
END;
--调用存储过程
BEGIN
--按位置
add_emp(1115,'aaaa',20000,10,'manager');
--按名字
add_emp(dno=>10,eno=>1116,ename=>'aaaa',salary=>20000,job=>'manager');
--混合
add_emp(1117,dno=>10,ename=>'aaaa',salary=>20000,job=>'manager');
END;
COMMIT;
select * from emp
--带默认参数
BEGIN
--按位置
add_emp(2221,'aaaa',20000,10);
--按名字
add_emp(dno=>10,eno=>2222,ename=>'aaaa',salary=>20000);
--混合
add_emp(2223,dno=>10,ename=>'aaaa',salary=>20000);
END;
select * from emp
-----------------------------------------------------------------------------
-- IN out in out
CREATE OR REPLACE PROCEDURE s(
A PLS_INTEGER,
B IN PLS_INTEGER,
C OUT PLS_INTEGER,
D IN OUT PLS_INTEGER
)IS
BEGIN
IF C IS NULL THEN
dbms_output.put_line('UNLL');
ELSE
dbms_output.put_line(C);
END IF;
dbms_output.put_line(D);
C:=A+1;
D:=10/B;
END;
DECLARE
aa constant PLS_INTEGER:=1;
bb PLS_INTEGER:=2;
cc PLS_INTEGER:=3;
dd PLS_INTEGER:=4;
BEGIN
s(aa,bb,cc,dd);
dbms_output.put_line('调用存储过程s之后');
dbms_output.put_line('aa:'||aa);
dbms_output.put_line('bb:'||bb);
dbms_output.put_line('cc:'||cc);
dbms_output.put_line('cc:'||dd);
END;
--调试存储过程授权
grant debug CONNECT SESSION to scott
-----------------------------------------------------------------------------------------------------------------------------
--创建存储过程 带异常处理
CREATE OR REPLACE PROCEDURE add_emp
(eno NUMBER,
ename VARCHAR2,
salary NUMBER,
dno NUMBER,
job VARCHAR2 DEFAULT 'clerk'
)IS
BEGIN
IF LENGTH(eno)<4 THEN
raise_application_error(-20000,'员工编号不能小于4位');
END IF;
INSERT INTO emp
(empno,ename,sal,job,deptno)
VALUES
(eno,ename,salary,job,dno);
EXCEPTION
WHEN others THEN
dbms_output.put_line(sqlerrm);
RAISE;
END;
DECLARE
emp_20000 EXCEPTION;
pragma exception_init(emp_20000,-20000);
emp_null_error EXCEPTION;
pragma exception_init(emp_null_error,-1400);
emp_no_depton exception;
pragma exception_init(emp_no_depton,-2291);
BEGIN
--员工编号小于4位
--add_emp(11,'aaaa',20000,10,'manager');
--部门不存在
--add_emp(3333,'aaaa',20000,100,'manager');
--部门为空
add_emp(3332,'aaaa',20000,null,'manager');
--雇员编号重复
--add_emp(1113,'aaaa',20000,10,'manager');
EXCEPTION
WHEN emp_20000 THEN
dbms_output.put_line(sqlerrm(-20000));
WHEN dup_val_on_index THEN
dbms_output.put_line('雇员编号不能重复');
WHEN emp_null_error THEN
dbms_output.put_line('部门编号不为空');
WHEN emp_no_depton THEN
dbms_output.put_line('部门编号不存在');
when OTHERS then
dbms_output.put_line('其他异常');
END;
--------------------------------------------------------------------------------------
--规范化存储过程
CREATE OR REPLACE PROCEDURE add_emp1(
eno emp.empno%TYPE,
name emp.ename%TYPE,
salary emp.sal%TYPE,
dno emp.deptno%TYPE,
job emp.job%TYPE DEFAULT 'clerk',
on_flag out NUMBER,
os_msg out VARCHAR2
)
IS
e_eno EXCEPTION;
BEGIN
IF LENGTH(eno)<4 THEN
RAISE e_eno;
END IF;
INSERT INTO emp(empno,ename,sal,job,deptno)VALUES(eno,name,salary,job,dno);
on_flag:=1;
os_msg:='成功';
EXCEPTION
WHEN e_eno THEN
on_flag:=-1;
os_msg:='编号不能小于4位';
WHEN dup_val_on_index THEN
on_flag:=-2;
os_msg:='雇员一存在';
WHEN OTHERS THEN
on_flag:=-3;
os_msg:='其他错';
END;
DECLARE
on_flag NUMBER;
os_msg VARCHAR2(100);
BEGIN
add_emp1(1115,'aaaa',20000,10,'ssss',on_flag,os_msg);
dbms_output.put_line(on_flag||os_msg);
END;
select * from emp
--删除存储过程
drop procedure s