儲存過程,游標,觸發器

2021-08-21 07:19:04 字數 4106 閱讀 1439

-- 語法

/*create [or replace] procedure 儲存過程名稱(引數名1 in|out 資料型別,引數名2 in|out 

資料型別,...)

as|is

-- 宣告變數

begin

-- 過程化語句

end;

*/--- 根據員工編號得到員工的年薪

create or replace procedure getyearsal(eno in number , yearsal out number)

asbegin

select sal * 12 + nvl(comm,0) into yearsal from emp where empno = eno;

end;

-- 訪問儲存過程

declare

ys number;

begin

getyearsal(7788, ys);

dbms_output.put_line('年薪'||ys);

end;

--- 給某員工漲工資(列印漲前的工資和漲後的工資)

create or replace procedure updatesal(eno in number ,psal in number)

isoldsal number;

newsal number;

begin

-- 列印漲前的工資

select sal into oldsal from emp where empno = eno;

dbms_output.put_line('漲前的工資:'||oldsal);

-- 漲工資

update emp set sal = sal + psal where empno = eno;

commit;

-- 列印漲後的工資

select sal into newsal from emp where empno = eno;

dbms_output.put_line('漲後的工資:'||newsal);

end;

-- 訪問只有輸入引數的儲存過程

call updatesal(7788,100);

---- 舉例:返回游標的儲存過程

-- 得到某部門所有的員工資訊

create or replace procedure getemps(dno in number ,emps out sys_refcursor)

asbegin

-- 給動態的游標賦值

open emps for select * from emp where deptno = dno;

end;

-- 訪問帶有輸出引數為游標的儲存過程

declare

emps sys_refcursor;

prow emp%rowtype;

begin

getemps(20, emps);

loop

fetch emps into prow;

exit when emps%notfound;

dbms_output.put_line(prow.empno||','||prow.ename);

end loop;

close emps;

end;

游標## 四、游標&例外

```--- 游標(集合): 用來處理返回多行記錄的問題

-- select into 語句只能解決返回一行記錄的問題

declare

pname emp.ename%type;

begin

select ename into pname from emp where deptno = 40;

dbms_output.put_line(pname);

end;

--- 宣告游標

-- cursor 游標名 is sql查詢語句;

-- 遍歷游標的過程

-- 開啟游標

-- 提取游標中的一行內容: fetch 游標名 into 變數名;

-- 迴圈語句, exit when 游標名%notfound;

-- 關閉游標

-- 舉例: 使用游標列印20號部門的員工姓名和工作

declare

cursor cur is select ename ,job from emp where deptno = 20;

pname emp.ename%type;

pjob emp.job%type;

begin

-- 開啟游標

open cur;

loop

fetch cur into pname,pjob;

-- 當游標中沒有記錄時退出

exit when cur%notfound;

dbms_output.put_line(pname || ','|| pjob);

end loop;

-- 關閉游標

close cur;

end;

-- 舉例

-- 使用游標對20號部門的員工漲工資(100)

-- 找出20號部門的員工編號,更新工資

declare

cursor cur is select empno from emp where deptno = 20;

begin

-- for 迴圈:自動開啟,關閉游標

for c in cur loop

update emp set sal = sal + 100 where empno = c.empno;

end loop;

end;

update emp set sal = sal +100 where deptno = 20;

### 八、觸發器

```---- 觸發器(***): 監聽表中的資料是否發生了改變

/*create or replace trigger 觸發器名稱

before |after -- 改變之前執行觸發器還是之後執行

insert|update|delete

on 表 -- 修改的是哪一張表

[觸發器的級別:表級的觸發器,行級觸發器]

declare

begin

end;

*/-- 舉例 : 新增一條記錄(列印新增了一條記錄)

create or replace trigger insertemp

after

insert

on emp

declare

begin

dbms_output.put_line('新增了一條記錄');

end;

insert into emp(empno ,ename) values(1002,'zhangfei');

-- 不能給員工降薪

create or replace trigger notupdatelowersal

before

update

on emp

for each row -- 行級的觸發器:只要使用new,old 就必須使用行級觸發器

declare

begin

if :new.sal < :old.sal then

-- p1 : 錯誤的編號:- 20001 ~ -20999

-- p2 :錯誤的資訊

end if;

end;

update emp set sal = sal - 1 where empno = 7788;

-- 使用觸發器來模擬mysql中自增的效果

create sequence tseq;

create or replace trigger autoincrement

before

insert

on emp

for each row

declare

begin

select tseq.nextval into :new.empno from dual;

end;

insert into emp(empno,ename) values(100,'lisi');

select * from emp;

包 儲存過程 觸發器 游標

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 j...

觸發器 儲存過程 游標等

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

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

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