存儲過程:
--修改存儲過程
create or replace procedure emp_proc(
findname varchar2,
salary1 number
)is
begin
update employees set salary=salary1 where last_name=findname;
end;
//調用存儲過程,可以傳參數(id,name)
exec emp_proc();
call emp_proc();
--輸入員工名字,如果獎金不是0.15就加0.1,其他加0.3 if/else;
create or replace procedure emp_upCommis(findname varchar2)is
v_comm employees.commission_pct%type;
begin
select distinct nvl(commission_pct,0) intov_comm from employees where last_name=findname;
if v_comm<>0.15 then
update employees set commission_pct=commission_pct+0.1 wherelast_name = findname;
else
update employees set commission_pct=commission_pct+0.3 wherelast_name = findname;
endif;
end;
--輸入輸出參數
create or replace procedure dept_pro(deptno number,dname outvarchar2)
is
begin
select department_name into dname fromdepartments where department_id = deptno;
end;
--寫個塊檢測
declare
name2 varchar2(50);
begin
dept_pro(10,name2);
dbms_output.put_line('deptname:'||name2);
end;
異常例外,處理
> declare
2 v_namevarchar2(10);
3 v_sal number(8,2);
4 begin
5 select last_name,salary intov_name,v_sal from employees whereemployee_id=&empno;
6 dbms_output.put_line('ename:'|| v_name||'sal'||v_sal);
7 exception
8 when no_data_foundthen
9 dbms_output.put_line('youerror,zhoabudao .sdfjasjf ^^');
10 end;
11 /
-------------------函數//select 函數即可:
create function emp_fun(ename varchar2)
return number
is
yearSal number(8,2);
begin
selectsalary*12+nvl(commission_pct,0)*12 into yearSal from employeeswhere last_name=ename;
return yearSal;
end;
包:
create or replace package emp_package is
procedure update_sal(ename varchar2,newsal number );
function a_i(ename varchar2) return number;
end;
----包體
create or replace package body emp_package is
procedure update_sal(ename varchar2,newsal number )
is
begin
update employees set salary=newsal where last_name=ename;
end;
function a_i(ename varchar2)
return number
is
yearsal number(8,2);
begin
select salary*12+nvl(commission_pct,0)*12 into yearsal fromemployees where last_name=ename;
return yearsal;
end;
end;
三種循環:常見語法 is begin end;
--循環 loop / end loop 循環
create or replace procedure deptno_pro(dname varchar2)
is
v_num number:=2;
begin
loop
exit when v_num = 6;
insert intodepartments(department_id,department_name)values(v_num,dname||v_num);
v_num:=v_num+1;
end loop;
end;
--循環 while條件 loop / end loop
create or replace procedure deptno_pro(dname varchar2)
is
v_num number:=2;
begin
while v_num<=6
loop
insert intodepartments(department_id,department_name)values(v_num,dname||v_num);
v_num:=v_num+1;
end loop;
end;
--循環 for 變量 in reverse 1..10 loop/end loop 1到10循環
for i in reverse 1..10 loop
(department_id,department_name) values(i,dname||i);
endloop; goto
--輸入員工姓名,員工工工資
create or replace procedure emp_upCommisTwo(findname varchar2)is
v_job employees.job_id%type;
begin
select nvl(job_id,'null') into v_job fromemployees where last_name=findname;
if v_job='FI_MGR' then
update employees set salary=salary+1000 where last_name =findname;
elsif v_job='IT_PROG' then
update employees set salary=salary+500 wherelast_name=findname;
else
update employees set salary=salary+100 where last_name=findname;
end if;
end;
--輸入一個部門編號,顯示這個部門下面的員工信息
create or replace package dept_package is
type test_cursor is ref cursor;
end dept_package;
--遊標輸出一個對象,爲一個數據堆
create or replace procedure deptt_pro(deptno number,dept_cursor outdept_package.test_cursor) is
begin
open dept_cursor for select *from employees where department_id = deptno;
end;
分頁:
--如何篩選
select * from (select ee.*,rownum rn (select * from employees eorder by e.employee_id)ee where rn<10) where rn>6;
--分頁過程實現 首先數據存在哪裏我輸入的table名數據存在遊標中,遊標在包裏定義
--1,先寫包 //遊標存儲一堆數據返回對象
create or replace package page2_package
as
type test_cursor is ref cursor;
end;
--2,再寫分頁細節 存儲過程方便調用和重複利用
create or replace procedure page2_proc(
tablename varchar2,//表名
pagesize number,//一頁多少條記錄
pagecurrent number,//當前頁數
rowtotal out number,//總記錄
pagetotal out number,//總頁數
emp_cursor out page2_package.test_cursor
)is
V_SQLvarchar2(1200);
v_beginnumber:=(pagecurrent-1)*pagesize+1;
v_endnumber:=pagecurrent*pagesize;
begin
v_sql:='select * from (select e.*,rownum rn from (select * from'||tablename||') e where rownum<='||v_end||') wherern>='||v_begin;
openemp_cursor forv_sql; //注意了表數據存於遊標中
v_sql:='select count(*) from '||tablename;
executeimmediate v_sql into rowtotal;
ifmod(rowtotal,pagesize)=0 then
pagetotal:=rowtotal/pagesize;
else
pagetotal:=rowtotal/pagesize+1;
endif;
end;
攔截器:
視圖
視圖和表的區別
表需要佔用空間,視圖不需要
視圖不能添加索引.(視圖要比錶慢一點)
使用視圖可以簡化複雜的查詢.
視圖可以提高安全性(不同的用戶可以看到不同的視圖)
觸發器. //注意所操作的數據將存於old或new特定表中等待觸發
創建,使用,級聯(刪除,插入,更新)
觸發器像一個特殊的存儲過程.
1,問題:刪除作者,級聯刪除這個作者出版的書籍.
create or replace trigger del_trigger
after delete on AUTHOR
for each row
begin
delete fromBOOK where AUTHORid=:old.AUTHORid;
end;
2,問題:增加作者,給一個提示顯示在控制檯
create or replace trigger del_trigger
after delete on AUTHOR
for each row
begin
delete fromBOOK where AUTHORid=:old.AUTHORid;
end;
--create insert
create or replace trigger save_trigger
after insert on AUTHOR
for each row
begin
dbms_output.put_line('author:'||:new.aname||'insert...success :)');
end;
上.
//開啓輸出流 set serveroutput on;
oracle 存儲過程,包,方法,觸發器,過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章