数据库存储过程示例
存儲過程
- 使用存儲過程來解決漲工資
- 漲工資,總裁漲1000,經理漲800,其他人漲400。
偽代碼:
ResultSet rs = “select empno,job from emp”;
While(rs.next()){
Int eno = rs.getInt(“empno”);
String job = rs.getString(“job”);
If(“PRESIDENT”.equals(job))
{
?????? update emp set sal = sal+1000;
}else if(“Manager”.equals(job))
{
?????? update emp set sal = sal+800;
}else
{
?????? update emp set sal = sal+400;
}
}
分析:那么上面這樣的一個過程,使用存儲過程(PL/SQL)就可以輕松解決。可以寫很少的java代碼。
①.查詢emp表:7839的姓名和薪水并打印.
declare
pename emp.ename%type;
psal emp.sal%type;
begin
--得到7839的姓名和薪水
select ename,sal into pename,psal from emp where empno = 7839;
dbms_output.put_line(pename||'的薪水是'||psal);
end;
運行結果:KING的薪水是5000
②.使用記錄型變量
記錄型變量:取這個表里面的一行作為我們的這個類型,那么一行有多個列,那么就有多個類型,相當于一個數組。
多個數據類型作為的我們的數據類型。
set serveroutput on
declare
? emp_rec emp%rowtype;
? begin
? select * into? emp_rec from emp where empno=7839;
? dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);
? end;
?/
③.從鍵盤接收一個數字(使用PL/SQL判斷輸入輸出數字)
set serveroutput on
accept num prompt '請輸入一個數字';
declare
? pnum number :=#
? begin
? if pnum = 0 then dbms_output.put_line('你輸入的數字是0');
? elsif pnum = 1 then dbms_output.put_line('你輸入的數字是1');
? else dbms_output.put_line('其他數字');
? end if;
? end;
? /
運行結果:你輸入的數字是1
④.輸出1~10的數字
set serveroutput on
?declare
?? pnum number :=1;
?? begin
?loop
? exit when pnum>10;
?dbms_output.put_line(pnum);
? pnum := pnum+1;
? end loop;
end;
- 光標的使用
光標的作用:用于存儲一個查詢返回的多行數據。
①.查詢所有人的薪水:
set serveroutput on
declare
cursor cemp is select ename,sal from emp;
pename emp.ename%type;
psal emp.sal%type;
begin
? open cemp;
? loop
? fetch cemp into pename,psal;?
? exit when cemp%notfound;
? dbms_output.put_line(pename||'的薪水是'||psal);?
? end loop;
end;
運行結果:
SMITH的薪水是800
ALLEN的薪水是1600
WARD的薪水是1250
JONES的薪水是2975
MARTIN的薪水是1250
BLAKE的薪水是2850
CLARK的薪水是2450
SCOTT的薪水是3000
KING的薪水是5000
TURNER的薪水是1500
ADAMS的薪水是1100
JAMES的薪水是950
FORD的薪水是3000
MILLER的薪水是1300
②.使用光標:漲工資,總裁漲1000,經理漲800,其他人漲400
set serveroutput on
declare
cursor cemp is select empno,job[h1]? from emp;
pno emp.empno%type;
pjob emp.job%type;
begin
? open cemp;
? loop
??? fetch cemp into pno,pjob;
??? exit when cemp%notfound;?
???? -- 判斷職位
? if pjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pno;
? elsif pjob='MANAGER' then update emp set sal=sal+800 where empno=pno;
? else update emp set sal = sal +400 where empno=pno;
? end if;
? end loop;
? close cemp;
end;
③.定義帶參數的光標(查詢并打印某個部門中員工的姓名)
set serveroutput on
declare
?cursor cemp(dno number) is select ename from emp where empno = dno;
?pname emp.ename%type;
begin
open cemp(7369);//傳遞參數7369
loop
? fetch cemp into pname;
? exit when cemp%notfound;?
? dbms_output.put_line(pname);
end loop;
close cemp;
end;
運行結果:
SMITH
④.查詢并打印30號部門員工姓名。
? declare
? cursor cemp(dno number) is select ename from emp where deptno = dno;
? dename emp.ename%type;
? begin
??? open cemp(30);
??? loop
????? fetch cemp into dename;
????? exit when cemp%notfound;
????? dbms_output.put_line(dename);
??? end loop;
??? close cemp;
??? end;
?
⑤.為部門號為10的員工漲工資
declare
? cursor cemp(dno number) is select deptno from emp where deptno = dno;
? dempno emp.deptno%type;
? begin
??? open cemp(10);
??? fetch cemp into dempno;
??? update emp set sal= sal*1.1 where deptno=dempno;
??? close cemp;
? end;
- 例外的使用
- 被0除例外
declare
? pnum number;
? begin
??? pnum := 1/0;
??? exception
????? when zero_divide then dbms_output.put_line('1:0不能做被除數');
????? dbms_output.put_line('2:0不能做被除數');
????? when value_error then dbms_output.put_line('算數或者替換錯誤');
????? when others then dbms_output.put_line('其他例外');
? end;
運行結果:
1:0不能做被除數
2:0不能做被除數
- 查詢并打印50號部門的員工姓名(測試異常:原因:數據表里面沒有50號部門)
declare
? cursor cemp is select ename from emp where deptno=50[h2]?;
? pename emp.ename%type;?
? no_emp_found[h3]? exception;
? begin
??? open cemp;
??? fetch cemp into pename;
??? if cemp%notfound then????
???? ?raise no_emp_found[h4]?;
??? end if;
??? close cemp;???
??? exception
? ????when no_emp_found[h5]? then dbms_output.put_line('沒有找到員工');
????? when others then dbms_output.put_line('其他例外');
end;
運行結果:
沒有找到員工
- 存儲過程存儲函數
?
?[h1]必須是數據庫的字段列名。
?[h2]由于數據庫沒有部門號50這個部門,那么就會拋出異常,我們這里手動自定義一個異常,然后拋出,然后再下面捕獲。
?[h3]定義異常
?[h4]拋出異常
?[h5]捕獲異常
?
總結
- 上一篇: 两矩阵相乘的秩的性质_矩阵分析与应用(一
- 下一篇: ArcGIS应用视频教程(视频+PPT+