plsql中的procedure和function程式設計
阿新 • • 發佈:2019-01-28
procedure:儲存過程
eg:
create or replace procedure p --這兒是和plsql的區別
is
cursor c
is
select * from emp2 for update;
--v_temp c%rowtype;
begin
for v_temp in c
loop
if(v_temp.sal< 2000) then
update emp2 set sal=sal*2 where current of c ;
elsif(v_temp.sal = 5000) then
delete from emp2 where current of c;
end if;
end loop;
commit;
end; 執行過程的命令:exec p; begin p end;
帶引數的儲存過程;
create or replace procedure p --in表示傳入引數 out傳出引數,
(v_a in number,v_b number ,v_ret out number,v_temp in out number)
is begin if(v_a > v_b) then
v_ret :=v_a;
else
v_ret:=v_b;
end if;
v_temp := v_temp+1;
end; 呼叫過程: declare v_a number := 3;
v_b number := 4;
v_ret number ;
v_temp number := 5;
begin p(v_a,v_b,v_ret,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end; 函式:function create or replace functionsal_tax (v_sal number) --聲明瞭一個函式
return number
is begin if(v_sal < 2000) then
return 0.10;
elsif(v_sal < 2750) then
return 0.15;
else
return 0.20;
end if;
end; 函式的呼叫::select lower(ename),sal_tax(sal) from emp; 觸發器:trigger 不能直接執行,依賴於表 create table emp2_log ( uname varchar2(20),
action varchar2(10),
atime date ); 建立觸發器 create or replacetrigger trig after insert or delete or update on emp2 for each row
begin ifinserting then
insert intoemp2_log values (USER,'insert',sysdate);
elsifupdating then
insert into emp2_log values(USER,'update',sysdate);
elsif deleting then
insert into emp2_log values (USER,'delete',sysdate);
end if;
end; update emp2 set sal=sal*2 where deptno = 30; drop triggle trig;(刪除) create or replace trigger trig after update on dept for each row begin update emp set deptno =:NEW.deptno where deptno =:OLD.deptno;
end; update dept set deptno = 99 where deptno = 10; 樹狀結構的儲存於顯示: create table ariticle ( id number primary key,
cont varchar2(4000),
pid number,
isleaf number(1), -- 0代表非葉子節點,1代表葉子節點
alevel number(2)
); insert into ariticle values(1,'ahshdhshd',0,0,0); insert into ariticle values(2,'bhshdhshd',1,0,1); insert into ariticle values(3,'chshdhshd',2,1,2); insert into ariticle values(4,dhshdhshd',2,0,2); insert into ariticle values(5,'ehshdhshd',4,1,3); insert into ariticle values(6,'fhshdhshd',10,1); insert into ariticle values(7,'ghshdhshd',6,1,0); insert into ariticle values(8,'hhshdhshd',3,0,4); insert into ariticle values(9,'ihshdhshd',7,0,0); insert into ariticle values(10,'jhshdhshd',9,0,3); commit;(提交) create or replace procudure p (v_pid ariticle.pid%type,v_level binary_integer) is cursor c is select * from ariticle where pid = v__pid; v_preStr varchar2(1024) :='';
begin for i in 0..v_level loop
v_preStr :=v_preStr || ' ';
for v_ariticle in c loop dbms_output.put_line(v_preStr || v_ariticle.cont);
if (v_ariticle.isleaf = 0) then
p(v_ariticle.id,v_level+1);
end if;
end loop;
end; exec p(0);
elsif(v_temp.sal = 5000) then
delete from emp2 where current of c;
end if;
end loop;
commit;
end; 執行過程的命令:exec p; begin p end;
is begin if(v_a > v_b) then
v_ret :=v_a;
else
v_ret:=v_b;
end if;
v_temp := v_temp+1;
end; 呼叫過程: declare v_a number := 3;
v_ret number ;
v_temp number := 5;
begin p(v_a,v_b,v_ret,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end; 函式:function create or replace functionsal_tax (v_sal number) --聲明瞭一個函式
return number
is begin if(v_sal < 2000) then
return 0.10;
elsif(v_sal < 2750) then
return 0.15;
else
return 0.20;
end if;
end; 函式的呼叫::select lower(ename),sal_tax(sal) from emp; 觸發器:trigger 不能直接執行,依賴於表 create table emp2_log ( uname varchar2(20),
action varchar2(10),
atime date ); 建立觸發器 create or replacetrigger trig after insert or delete or update on emp2 for each row
begin ifinserting then
insert intoemp2_log values (USER,'insert',sysdate);
elsifupdating then
insert into emp2_log values(USER,'update',sysdate);
elsif deleting then
insert into emp2_log values (USER,'delete',sysdate);
end if;
end; update emp2 set sal=sal*2 where deptno = 30; drop triggle trig;(刪除) create or replace trigger trig after update on dept for each row begin update emp set deptno =:NEW.deptno where deptno =:OLD.deptno;
end; update dept set deptno = 99 where deptno = 10; 樹狀結構的儲存於顯示: create table ariticle ( id number primary key,
cont varchar2(4000),
pid number,
isleaf number(1), -- 0代表非葉子節點,1代表葉子節點
alevel number(2)
); insert into ariticle values(1,'ahshdhshd',0,0,0); insert into ariticle values(2,'bhshdhshd',1,0,1); insert into ariticle values(3,'chshdhshd',2,1,2); insert into ariticle values(4,dhshdhshd',2,0,2); insert into ariticle values(5,'ehshdhshd',4,1,3); insert into ariticle values(6,'fhshdhshd',10,1); insert into ariticle values(7,'ghshdhshd',6,1,0); insert into ariticle values(8,'hhshdhshd',3,0,4); insert into ariticle values(9,'ihshdhshd',7,0,0); insert into ariticle values(10,'jhshdhshd',9,0,3); commit;(提交) create or replace procudure p (v_pid ariticle.pid%type,v_level binary_integer) is cursor c is select * from ariticle where pid = v__pid; v_preStr varchar2(1024) :='';
begin for i in 0..v_level loop
v_preStr :=v_preStr || ' ';
for v_ariticle in c loop dbms_output.put_line(v_preStr || v_ariticle.cont);
if (v_ariticle.isleaf = 0) then
p(v_ariticle.id,v_level+1);
end if;
end loop;
end; exec p(0);