--存儲過程
--建立存儲過程
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;sql
--調用存儲過程
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;app
COMMIT;debug
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;it
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;io
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;select
--調試存儲過程受權
grant debug CONNECT SESSION to scottexception
-----------------------------------------------------------------------------------------------------------------------------bug
--建立存儲過程 帶異常處理
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;error
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