_過程_函數_觸發器_遊標

1:存儲過程 就是一個PL/SQL塊的名稱。經過這個名稱來調用過程。sql

存儲過程,保存在服務器上,之後經過名稱來調用,而後由服務來執行的代碼塊。 1:不接收參數的過程 (略) Create or replace procedure p1 As Age int; Begin …. End;服務器

2:接收參數的存過程函數

參數的聲明: p2(參數名稱 [輸入in或是輸出out類型默認是輸入的參數] 參數類型 , 。。。。)oop

--開發一個過程,接收name,age兩個參數,保存到數據表中去 create or replace procedure p2(nm in varchar,ag in int) as begin insert into person values(sys_guid(),nm,ag); end;fetch

3:返回參數的值
--開發一個過程,接收name,age兩個參數,保存到數據表中去 - 只要out類型的,則pid在傳遞時,必須是一個變量 create or replace procedure p2(nm in varchar,ag in int,pid out varchar) as begin select sys_guid() into pid from dual;--給返回類型的值賦值 insert into person values(pid,nm,ag); end;ui

--調用這個過程,保存數據 --在另外一個pl/塊中來調用 declare vpid varchar(32); begin p2('李四',99,vpid); dbms_output.put_line('新的id是'||vpid); end;指針

select * from person;開發

能夠省去一些參數,聲明參數爲 輸入+輸出類型的:it

--開發一個過程,接收name,age兩個參數,保存到數據表中去 - 只要out類型的,則pid在傳遞時,必須是一個變量 create or replace procedure p2(nm in out varchar,ag in int,cnt out int) as vpid varchar(32); begin select sys_guid() into vpid from dual; insert into person values(vpid,nm,ag); nm:=vpid; select count(1) into cnt from person; end;io

--調用這個過程,保存數據 --在另外一個pl/塊中來調用 declare vpid varchar(32):='趙七'; vcnt int; begin p2(vpid,99,vcnt); dbms_output.put_line('新的id是'||vpid||' 記錄的數量是:'||vcnt); end;

select * from person;

參數的順序:

=> 相似於 C++

2:存儲函數 – 用戶自定義的函數

函數與過程的區別: 函數必需要至少返回一個值。 1~N 過程能夠返回0~N 函數能夠用於查詢或是賦值。 Selectd f1(..) from …; Nm:=f1(…); 而過程只能是調用。

實現+操做: create or replace function f1(a int,b int) return number as vsum int; begin vsum:=a+b; return vsum; end;

select f1(1,4) from dual;

select f1(age,100),name,age from person;

declare aa int; begin aa:=f1(4,55); dbms_output.put_line(aa); end;

3:觸發器 trigger 函數,過程 – 都是讓用戶能夠調用 的。

觸發器- 保存在服務器上的一段pl/sql塊 與 表相關。當達到某個條件時,由服務器來調用的代碼塊。

功能: 1:實現更加嚴格的約束 。 2:實現表之間數據的自動維護。

3.一、建立一個觸發器的示例 當向person表中寫入一行記錄之後,就輸出一個句,說 一行記錄成功了。

3.二、分類 按影響的行數 表級觸發器- 默認的。 與行數無關,只觸發一次。 create or replace trigger t1 after delete on person declare begin dbms_output.put_line('數據已經刪除了'); end;

行級觸發器

在行級的觸發器上,能夠使用兩個隱藏變量:

變量 insert Update Delete :NEW 可用 可用 不可用 :OLD 不能用 可用 可用

要求當修改記錄時,檢查,新修改的年齡是否大於當前的年齡:

分析:在 person表上添加 before update約束。

列級的的觸發器 – 按是否指定列 – 列級的觸發器只能用於update

指定只是修改age時才觸發:

按是否有條件,能夠分爲條件觸發器 當達到某個條件時,纔會觸發

3.3 使用原則

4:應用 限制一個表在上班時能夠寫入,下班之後,就不能再寫入了: 8:00 ~ 17:00

表之間的自維護: 班級與學生的關係。

一個班有不少的學生。

create table cls( id varchar(32) primary key, name varchar(30), cnt int );

create table studs( id varchar(32) primary key, name varchar(30), clsid varchar(32) , constraint fk1 foreign key(clsid) references cls(id) );

create or replace trigger t2 after insert on studs FOR EACH ROW declare begin update cls set cnt=cnt+1 where id=:NEW.clsid; end;

insert into cls values('C001','一班',0);

insert into studs values('S002','Mary','C001');

select * from cls;

做業: 請實現學生刪除時,修改學生班級維護。

5:遊標 cursor(光標)

遊標是指向記錄集的一個指針。 一次,只能指向一行記錄。

遊標的分類: 1:隱式的遊標 – 》Oracle在執行DML操做時使用的遊標。 - 》 隱式的遊標的名稱叫:SQL 2:顯式的遊標 – 》 用戶本身定義的遊標。 1:靜態遊標。 2:動態遊標。

遊標屬性: 變量 功能 SQL%rowCount 返回當前影響的行數。 SQL%notFound 沒有指到記錄的行上,即指到了行首或是行尾 SQL%isOpen 遊標是打開的嗎

對遊標的操做: 顯示遊標的 定義遊標 打開遊標 遍歷執行 關閉遊標

1:查看隱式的遊標 declare vrow int; begin update person set age=age+1; vrow:=SQL%rowCount; dbms_output.put_line('影響了幾行呀'||vrow); if not SQL%isOpen then dbms_output.put_line('已經關了 '); end if; end;

2:自定義的遊標 定義遊標 打開遊標 遍歷執行 關閉遊標

1:靜態的遊標

declare cursor cur is select id,name,age from person; --定義遊標 vid varchar(30); vname varchar(30); vage int; begin --打開遊標 open cur; --遍歷遊標 loop fetch cur into vid,vname,vage; --先作判斷有數據 exit when cur%notFound; dbms_output.put_line(vid||','||vname||','||vage); end loop; --關閉遊標 close cur; --用異常處理遊標的必須關閉 exception when others then if cur%isOpen then close cur; end if; end;

select * from person;

靜態遊標的變體:參數遊標 declare cursor cur(nm varchar)[] is select id,name,age from person where name like '%'||nm||'%[]'; --定義遊標 vid varchar(30); vname varchar(30); vage int; begin --打開遊標 open cur('a');[] --遍歷遊標 loop fetch cur into vid,vname,vage; --先作判斷有數據 exit when cur%notFound; dbms_output.put_line(vid||','||vname||','||vage); end loop; --關閉遊標 close cur; --用異常處理遊標的必須關閉 exception when others then if cur%isOpen then close cur; end if; end;

declare cursor cur(nm varchar) is select id,name,age from person where name like '%'||nm||'%'; --定義遊標 vperson person%rowType; begin --打開遊標 open cur('%'); --遍歷遊標 loop fetch cur into vperson; --先作判斷有數據 exit when cur%notFound; dbms_output.put_line(vperson.id||','||vperson.name||','||vperson.age); end loop; --關閉遊標 close cur; --用異常處理遊標的必須關閉 exception when others then if cur%isOpen then close cur; end if; end;

2:動態的遊標 在定義時,不指定查詢的語句,而是在打開遊標時才指定執行哪個查詢語句。

在定義時,先定義一個自定義的數據類型: declare --定義一個數據類型,這個類型是動態的遊標類型,即定義一個類 type ref_cur is ref cursor; --再根據上面的類型,定義一個變量 cur ref_cur; vperson person%rowType; begin --打開遊標 時指定SQL open cur for 'select * from person'; --遍歷遊標 loop fetch cur into vperson; --先作判斷有數據 exit when cur%notFound; dbms_output.put_line(vperson.id||','||vperson.name||','||vperson.age); end loop; --關閉遊標 close cur; --用異常處理遊標的必須關閉 exception when others then if cur%isOpen then close cur; end if; end;

6:請開發一個PL/SQL塊,刪除某個用戶的全部表 就遍歷 user_tables表,查詢這個用戶的全部表,組成SQL語句(drop語句),執行 Drop就能夠了。

declare cursor cur is select table_name from user_tables; cursor cur2 is select constraint_name,table_name from user_constraints where constraint_type='R'; tname varchar(30); cname varchar(30); vsql varchar(100); begin open cur2; loop fetch cur2 into cname,tname; exit when cur2%notfound; vsql:='alter table '||tname||' drop constraint '||cname; dbms_output.put_line(vsql); EXECUTE IMMEDIATE vsql; end loop; close cur2; open cur; loop fetch cur into tname; exit when cur%notfound; vsql:='drop table '||tname; dbms_output.put_line(vsql); --執行上面的vsql,將這個vsql語句讓Oracle數據來執行 EXECUTE IMMEDIATE vsql; end loop; close cur; end;

select constraint_name,table_name from user_constraints where constraint_type='R';

請實現刪除裏面的全部 view,triiger,procedure

create or replace procedure p1 as cursor cur is select table_name from user_tables; cursor cur2 is select constraint_name,table_name from user_constraints where constraint_type='R'; tname varchar(30); cname varchar(30); vsql varchar(100); begin open cur2; loop fetch cur2 into cname,tname; exit when cur2%notfound; vsql:='alter table '||tname||' drop constraint '||cname; dbms_output.put_line(vsql); EXECUTE IMMEDIATE vsql; end loop; close cur2; open cur; loop fetch cur into tname; exit when cur%notfound; vsql:='drop table '||tname; dbms_output.put_line(vsql); --執行上面的vsql,將這個vsql語句讓Oracle數據來執行 EXECUTE IMMEDIATE vsql; end loop; close cur; end;

exec p1;

7:表空間 查看錶空間及對應的文件:

查詢某個用戶保存數據用的是哪個表空間:

建立一個新的表空間

建立一個新的用戶,這個用戶使用qlc作爲表空間

alter TABLESPACE qlu add datafile 'C:\qlu3.dbf' size 128K AUTOEXTEND off;

相關文章
相關標籤/搜索