1. 程式人生 > >Oracle資料庫——基本使用《下》

Oracle資料庫——基本使用《下》

1、【檢視】
--查詢語句建立表
	create table emp as select * from  scott.emp;
--建立檢視(需要有dba許可權)
	create view v_emp as select ename,job from emp;
--查詢檢視
	select * from v_emp;
--修改檢視
	update v_emp set job='CLERK' where ename = 'ALLEN';
	commit;
--建立只讀檢視
	create view v_empl as select ename ,job from emp with
read only; --檢視的作用 --1.檢視可以遮蔽掉一些敏感欄位 --2.保證總部和分佈資料及時統一

2、【索引】

--索引的概念:索引就是在表的列上構建一個二叉樹
--達到大幅度提高查詢效率的目的,但是索引不會影響增刪改的目的
--建立單列索引
	create index idx_ename on emp(ename);
--單列索觸發規則,條件必須是索引列中原始值
--單列函式,模糊查詢,都會影響索引的觸發
	select * from emp where ename = 'SCOTT';
--複合索引
--建立複合索引
	create index idx_enamejob on
emp(ename,job); --複合索引第一列為有限檢索列 --如果要出發複合索引,必須包含有優先檢索列中的原始值 select * from emp where ename='SCOTT' and job='ANALYST';--觸發複合索引 select * from emp where ename='SCOTT' or job='ANALYST';-- 不觸發索引 select * from emp where ename='SCOTT';--觸發單列索引

3、【pl/sql 程式語言】

--宣告方法
--賦值操作可以使用:=也可以使用into查詢語句賦值
--編碼塊的結果--開啟命令列視窗->執行set serveroutput on;->程式碼塊編寫完畢輸入“/”
declare i number(2) :=10; s varchar(10) :='小明'; ena emp.ename%type;--引用型變數 emprow emp%rowtype;--記錄型變數 begin dbms_output.put_line(i); dbms_output.put_line(s); select ename into ena from emp where empno = 7788; dbms_output.put_line(ena); select * into emprow from emp where empno = 7788; dbms_output.put_line(emprow.ename||'的工作為:'|| emprow.job); end; ---pl/sql中的if判斷 ---輸入小於18的數字,輸出未成年 ---輸入大於18小於40的數字,輸出中年人 ---輸入大於40的數字,輸出老年人 declare i number(3) := &ii; begin if i<18 then dbms_output.put_line('未成年'); elsif i<40 then dbms_output.put_line('中年人'); else dbms_output.put_line('老年人'); end if; end; --pl/sql中的loop迴圈 --用三種方式輸出1到10個數字 --while迴圈 declare i number(2) :=1; begin while i<11 loop dbms_output.put_line(i); i :=i+1; end loop; end; --exit迴圈 declare i number(2) :=1; begin loop exit when i>10; dbms_output.put_line(i); i:=i+1; end loop; end; --for迴圈 declare begin for i in 1..10 loop dbms_output.put_line(i); end loop; end; --遊標:可以存放多個物件,多行記錄 --輸出emp表中所有員工的姓名 declare cursor c1 is select * from emp; emprow emp%rowtype; begin open c1; loop fetch c1 into emprow; exit when c1%notfound; dbms_output.put_line(emprow.ename); end loop; close c1; end; --給指定部門員工漲工資 declare cursor c2(eno emp.deptno%type) is select empno from emp where deptno = eno; en emp.empno%type; begin open c2(10); loop fetch c2 into en; exit when c2%notfound; update emp set sal = sal+100 where empno = en; commit; end loop; close c2; end; --查詢10號部門員工資訊 select * from emp where deptno = 10; --儲存過程:編譯好的sql語句集合,可以直接呼叫 --栗子:給指定員工漲100塊錢 create or replace procedure p1(eno emp.empno%type) is begin update emp set sal=sal+100 where empno = eno; commit; end; select * from emp where empno = 7788; --測試 declare begin p1(7788); end; --儲存函式 --儲存過程無返回值 儲存函式帶返回值的 --%type:獲取欄位型別/ %notfound結束標誌 --栗子:儲存函式計算指定員工的年薪 create or replace function f_yearsal(eno emp.empno%type) return number is s number(10); begin select sal*12+nvl(comm,0) into s from emp where empno = eno; return s; end; --測試f_yearsal --儲存函式在呼叫的時候,返回值需要接受。 declare s number(10); begin s := f_yearsal(7788); dbms_output.put_line(s); end; --out型別引數如何使用 --使用儲存過程計算年薪 create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number) is s number(10); c emp.comm%type; begin select sal*12,nvl(comm,0) into s,c from emp where empno = eno; yearsal := s+c; end; --測試p_yearsal declare yearsal number(10); begin p_yearsal(7788,yearsal); dbms_output.put_line(yearsal); end; --in和out型別引數的區別是什麼? --凡是涉及到into查詢語句賦值或者:=賦值操作的引數,都 必須使用out來修飾 --儲存過程和儲存函式的區別 --語法區別:關鍵字不一樣 -------儲存函式比儲存國車給多了兩個return --本質區別:儲存函式有返回值,而儲存過程沒有返回值 -------如果儲存過程想實現有返回值的業務,我們就必須使用out型別的引數 -------即便是儲存過程使用了out型別的引數,其本質也不是真的有了返回值 -------而是在儲存過程內部給out引數引數賦值,在執行完畢後,我們直接拿到輸出型別引數的值 ---我們可以使用儲存函式有返回值的特性,來自定義函式 --而儲存過程不能用來自定義函式 --案例需求:查詢出員工姓名,員工所在部門名稱 --案例準備工作:把scott使用者下的dept表賦值到當前使用者下 create table dept as select * from scott.dept; --使用傳統方式來實現案例需求 select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno; --使用儲存函式來實現提供一個部門編號,輸出一個部門名稱 create or replace function fdna(dno dept.deptno%type) return dept.dname%type is dna dept.dname%type; begin select dname into dna from dept where deptno = dno; return dna; end; --使用fdna儲存函式來實現案例需求:查詢出員工姓名,員工所在部門名稱 select e.ename,dna(e.deptno) from emp e; --觸發器,就是制定一個規則,在我們做增刪改 操作的時候, --只要滿足該規則,自動觸發,無需呼叫。 --語句級觸發器:不包含有for each row的觸發器 --行級觸發器:包含有for each row的就是行級觸發器 ----加for each row是為了使用:old 或者:new物件或者一行記錄 --語句級觸發器 --插入一條記錄,輸出一個新員工入職 create or replace trigger t1 after insert on tab_user declare begin dbms_output.put_line('一個新員工入職'); end; --觸發t1 insert into tab_user values(1,'小紅'); commit; select * from tab_user; --行級別觸發器 --不能給員工降薪 --raise_application_error(-20001~-20999之間,‘錯誤提示資訊’) create or replace trigger t2 before update on emp for each row declare begin if :old.sal>:new.sal then raise_application_error(-20001, '不能給員工降薪'); end if; end; --觸發t2 select * from emp where empno = 7788; update emp set sal = sal-1 where empno =7788; commit; --觸發器實現主鍵自增【行級觸發器】 --分析:在使用者做插入操作之前,拿到即將插入的資料 --給該資料中的主鍵列賦值。 create sequence s_iuser; create or replace trigger auid before insert on tab_user for each row declare begin select s_iuser.nextval into :new.id from dual; end; --查詢tab_user表資料 select * from tab_user; --使用auid實現主鍵自增 insert into tab_user(uname) values('a'); commit; insert into tab_user values(1,'b'); commit; --java 呼叫儲存過程 ---oracle10g ojdbc14.jar ---oracle11g ojdbc6.jar