包 儲存過程 觸發器 游標

2021-06-10 03:29:02 字數 4269 閱讀 4828

create or replace package emp_package as

v_pi constant number:=3.14;--定義常量

type v_cur is ref cursor;--引用游標定義

--定義過程

procedure emp_insert(p_ename varchar2,

p_job varchar2,

p_mgr number,

p_hiredate date,

p_sal number,

p_comm number,

p_deptno number,

p_empno out number);

procedure emp_update(p_empno number,

p_ename varchar2,

p_job varchar2,

p_mgr number,

p_hiredate date,

p_sal number,

p_comm number,

p_deptno number);

procedure emp_delete(p_empno number);

procedure emp_load(p_empno number,p_cur out v_cur);

procedure emp_list(p_cur out v_cur);

end;

b、按照規範完成包主體的書寫,必須實現規範中的crud操作【此題6分】

create or replace package body emp_package as

--定義過程

procedure emp_insert(p_ename varchar2,

p_job varchar2,

p_mgr number,

p_hiredate date,

p_sal number,

p_comm number,

p_deptno number,

p_empno out number)

is begin

select seq_emp.nextval into p_empno from dual;

insert into emp

(empno,ename, job, mgr, hiredate, sal, comm, deptno)

values

(p_empno,p_ename, p_job, p_mgr, p_hiredate, p_sal, p_comm, p_deptno);

commit;

exception

when others then

rollback;

end emp_insert;

procedure emp_update(p_empno number,

p_ename varchar2,

p_job varchar2,

p_mgr number,

p_hiredate date,

p_sal number,

p_comm number,

p_deptno number)

is begin

update emp set emp.ename=p_ename,emp.job=p_job,emp.mgr=p_mgr,emp.hiredate=p_hiredate,emp.sal=p_sal,emp.comm=p_comm,emp.deptno=p_deptno where emp.empno=p_empno;

commit;

exception

when others then

rollback;

end emp_update;

procedure emp_delete(p_empno number)

isbegin

delete emp where empno=p_empno;

commit;

exception

when others then

rollback;

end emp_delete;

procedure emp_load(p_empno number,p_cur out v_cur)

isbegin

open p_cur for select * from emp where emp.empno=p_empno;

--select empno,ename,job, mgr, hiredate, sal, comm, deptno into v_1,v_2,v_3,v_4,v_5,v_6,v_7,v_8 from emp where empno=p_empno;

--dbms_output.put_line(to_char(v_5,'yyyy-mm-dd'));

end emp_load;

procedure emp_list(p_cur out v_cur)

is begin

open p_cur for select * from emp;

end emp_list;

end emp_package;

觸發器

create or replace trigger tr_t_insert

before insert or update or delete on t

for each row

declare

v_key number;

begin

if inserting then

select seq_t.nextval into v_key from dual;

:new.tid:=v_key;

dbms_output.put_line('insert');

elsif updating then

if :new.tname='****' then --映像

:new.tname:='***';

dbms_output.put_line('update');

end if;

elsif deleting then

if to_char(sysdate,'d')='7' then

dbms_output.put_line('disable');

--insert into t(tname)values(:old.tname);

else

dbms_output.put_line('delete.....');

end if;

end if;

end;

-游標只是方便使用者對資料庫中的資料一條一條的進行處理,pl/sql中,select 語句返回多條記錄時,必須用到游標. -游標的型別有兩種:隱式和顯式
declare

cursor c1 is

select empno, ename, job

from emp

where deptno = 20;

再open,fetch,close pl/sql包含隱式游標和顯式游標等兩種游標型別,其宗隱式游標用於處理select into和dml語句,而顯示游標則專門用於處理select語句返回的多行資料。

使用顯式游標

為了處理select語句返回的多行資料,可以使用顯式游標,使用顯式游標包括定義游標,開啟游標,提取資料和關閉游標四個階段。

例子:declare

curosr emp_cursor is

select ename,sal from emp

where deptno=10;

v_ename emp.ename%type;

v_sal emp.sal%type;

begin

open emp_cursor;

loop

fetch emp_cursor into v_ename,v_sal;

exit when emp_cursor%notfound;

dbms_output.put_line(v_name||': '||v_sal);

end loop;

close emp_cursor;

end;

比如說你需要把某一張或者幾張表的資料遍歷一邊。才會用到游標。只是單純的邏輯判斷及處理的話,就不需要了。

儲存過程,游標,觸發器

語法 create or replace procedure 儲存過程名稱 引數名1 in out 資料型別,引數名2 in out 資料型別,as is 宣告變數 begin 過程化語句 end 根據員工編號得到員工的年薪 create or replace procedure getyearsa...

觸發器 儲存過程 游標等

觸發器有兩種after和before,區別在於每次提交事務觸發一次和每一行資料的更新都觸發一次,使用時候要注意,以免達不到目的 oracle產生資料庫觸發器的語法為 create or replace trigger 觸發器名 觸發時間 觸發事件 on 表名 for each row pl sql ...

MYSQL 儲存過程,游標和觸發器

1.儲存過程 procedure mysql 儲存過程是從 mysql 5.0 開始增加的新功能。儲存過程的優點有一籮筐。不過最主要的還是執行效率和sql 封裝。特別是 sql 封裝功能,如果沒有儲存過程,在外部程式訪問資料庫時 例如 php 要組織很多 sql 語句。特別是業務邏輯複雜的時候,一大...