Oracle基础(摘)

来源:互联网 发布:天津菜鸟网络招聘 编辑:程序博客网 时间:2024/05/17 06:30

一,简单介绍


-- 表
create table test (names varchar2(12),
                   dates date,
                   num   int,
                   dou   double);
-- 视图
create or replace view vi_test as
select * from test;

-- 同义词
create or replace synonym aa
for dbusrcard001.aa;

-- 存储过程
create or replace produce dd(v_id in employee.empoy_id%type)
as
begin
  
end
dd;

-- 函数
create or replace function ee(v_id in employee%rowtype) return varchar(15)
is
var_test varchar2(15);
begin
  return var_test;
exception when others then
  
end

-- 三种触发器的定义
create or replace trigger ff
alter delete
on test
for each row
declare
begin
   delete from test;
   if sql%rowcount < 0 or sql%rowcount is null then
      rais_replaction_err(-20004,"错误")
   end if
end


create or replace trigger gg
alter insert
on test
for each row
declare
begin
   if :old.names = :new.names then
      raise_replaction_err(-2003,"编码重复");
   end if
end


create or replace trigger hh
for update
on test
for each row
declare
begin
  if updating then
     if :old.names <> :new.names then
 reaise_replaction_err(-2002,"关键字不能修改")
     end if
  end if
end

-- 定义游标
declare
   cursor aa is
      select names,num from test;
begin
   for bb in aa
   loop
        if bb.names = "ORACLE" then
       
        end if
   end loop;
  
end

-- 速度优化,前一语句不后一语句的速度快几十倍
select names,dates
from test,b
where test.names = b.names(+) and
      b.names is null and
      b.dates > date('2003-01-01','yyyy-mm-dd')

 
select names,dates
from test
where names not in ( select names
                       from b
                      where dates > to_date('2003-01-01','yyyy-mm-dd'))
                      

-- 查找重复记录
select names,num
from test
where rowid != (select max(rowid)
                 from test b
                where b.names = test.names and
                      b.num = test.num)


-- 查找表TEST中时间最新的前10条记录
select * from (select * from test order by dates desc) where rownum < 11

-- 序列号的产生
create sequence row_id
minvalue 1
maxvalue 9999999999999999999999
start with 1
increment by 1

insert into test values(row_id.nextval,....)

 二,Oracle PL/SQL游标的学习
一 游标是什么 1I/W__[:  
j8"5 h  
游标字面理解就是游动的光标。 A =E|1<|  
/{aar'D0f  
用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等。 14VBcs)~Lp  
P}f?TN0{  
二 游标的分类 gj%{Hg~   
Y0h oUd  
显式游标和隐式游标 A%lO/ 8  
%}r Y[h  
显式游标的使用需要4步: hHZe7WH<  
K/toVwv:R  
1. 声明游标 f4A(uyI  
|E-UKi1]  
CURSOR mycur(vartype number) is eDsSSUEGV  
select emp_no,emp_zc from cus_emp_basic 2SC1OI _E+  
where com_no = vartype; ='g p_j<  
WO{:-WP  
Qt?Yw]m FJ  
 lQ=[#  
2. 打开游标 c?~$;!(pd  
~{0q,  
open mycur(000627) *u.B)n3  
Z6p"cu0:  
注:000627是参数 snF x"?y2  
"LZtNSJne  
3. 读取数据 $q@#ne  
UQWkmQ/  
fetch mycur into varno, varprice; r w:P+r .  
j"Y./2@?  
4. 关闭游标 FC1?Ev_  
D&Vc-O $  
close mycur; 0?2C]9p3A^  
3d}*y<{  
三 游标的属性 ws%5]$fj5  
9 Uhp  
U}*O-yZ- oracle 游标有4个属性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。  
_tf i X 7  
C]7Mk(#xEp %ISOPEN判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false;  
uco u{a  
)e=(eW %FOUND %NOTFOUND判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false;  
sR,R,*~  
%ROWCOUNT返回当前位置为止游标读取的记录行数。 c83LVm  
Dug)j1Ce  
四 示例 hNI:u7UU{3  
6(ZW&A-  
set serveroutput on; _9=?9,7  
declare "cB,6P:7/  
varno varchar2(20); _whr{  
varprice varchar2(20); &uXL | T  
XWA.M'w  
CURSOR mycur(vartype number) is N$]/I#  
select emp_no,emp_zc from cus_emp_basic fVrYma]  
where com_no = vartype; S)ej} I9  
begin -Hj<[qN   
?/%-xp~lr  
if mycur%isopen = false then $YDC   
open mycur(000627); fMm& `lm87  
end if; &< fys3  
I`B5:Og<<  
fetch mycur into varno,varprice; ds./OLzIT  
while mycur%found v38xUt^K3  
loop 2P%fs  
dbms_output.put_line(varno||','||varprice); [J.Y`lOGP  
if mycur%rowcount=2 then H-8"Rep6  
exit; JIIT%  
end if; { 1t-n*a  
fetch mycur into varno,varprice; $5;Rl8E&9  
end loop; C2/bw U*  
0 cgQ [r2>  
close mycur; zvaKt>  
end; ife9+l`^7  
F&dX1os  
f8W|:O1r  
W9W!).;Yz  
PL/SQL记录的结构和C语言中的结构体类似,是由一组数据项构成的逻辑单元。 0JOsSs   
N/f.H^i  
PL/SQL记录并不保存在数据库中,它与变量一样,保存在内存空间中,在使用记录时候,要首先定义记录结构,然后声明记录变量。可以把PL/SQL记录看作是一个用户自定义的数据类型。 IM"% .]#  
TRT $-  
set serveroutput on; |4CSy!ED  
declare BWMa8? $  
@ kG&`AD  
type person is record MGi?I/'  
( ^tFi=F?mt  
empno cus_emp_basic.emp_no%type, 4.6#O~7  
empzc cus_emp_basic.emp_zc%type); .g:c' 9-I  
a egrY:_*  
person1 person; p,|xqB9  
$IG2F4T  
cursor mycur(vartype number)is XU WU/  
select emp_no,emp_zc from cus_emp_basic m238P4N ]  
where com_no=vartype; 5}OB[Fgf  
NHCLARY}b  
begin B|qg_,5T$m  
if mycur%isopen = false then gum: R p  
open mycur(000627); 3d*kc2J  
end if; f%!CE+dGB  
&A}1)^ N  
loop U9T+1]NEdo  
fetch mycur into person1; Qe-VveG8  
exit when mycur%notfound; Y /)I  
dbms_output.put_line('雇员编号:'||person1.empno||',地址:'||person1.empzc); V~my.:a2  
end loop; V8{/d{  
-?/A ,l  
close mycur; zpiA]Q{/r  
end; aJ@%pXKzI  
8CHO-6?3  
b|kXD6  
! :vv)EM:t  
典型游标for 循环 sE<vivS4  
: GDrnfm3  
游标for循环示显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)。使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。 @" #b }"z  
*|&v~7* C  
set serveroutput on; 6 e= oC  
declare ):<58uv|G-  
>qh-5S/R  
cursor mycur(vartype number)is 6A/N1O}7gr  
select emp_no,emp_zc from cus_emp_basic tgN@#Yb*  
where com_no=vartype; m:x+F6+e  
7G4n>bm  
begin wfM2 _W  
for person in mycur(000627) loop *sZv W 9  
dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc); dr(*N|r@  
end loop; */WXt   
end;

三,使用游标复制table的内容
QxnrFn --利用游标复制表(效率不高) 
57S[+55| declare  
~t[~_a/" cursor csr_1 is 
7_`YH/   select ks_xm,ks_zkz,bk_cj from ahzk_all_cj; 
b2*GA 33 i number; 
fdl Q@kwa begin 
T|!b-+W8^N for idx in csr_1 loop 
!_ *F-~y   insert into tmp values(idx.ks_xm,idx.ks_zkz,idx.bk_cj); 
b,i.[M^z   i:=csr_1%rowcount; --获取当前记录数 
."]jvc   if(i mod 1000=0) then 
p"Ff|H4+Z9     dbms_output.put_line(i); 
Tx% j!3     commit; 
'ZX[5"-   end if;    
K[%TPOp{q2 end loop; 
pKS ga)9= commit; 
f 5JM'&/ end; 
w64m)!D  
vB <z"+ --附:高效复制表  
tt5"!] declare  
Ea&BIe ;  
fUB}Vy4 begin 
TZSY:#6;   insert into tmp  
m9.PQBpXQ     select ks_xm,ks_zkz,bk_cj from ahzk_all_cj; 
CMmc-4   if(sql%found) then 
kBay>?k      dbms_output.put_line('插入' || sql%rowcount || '行记录'); 
jA"'f, Z   end if; 
^UEYI   commit; 
9 9QbL%@ end;

三,怎样看oracle查询语句执行计划
SQLPLUS的AutoTrace是分析SQL的执行计划,执行效率的一个非常简单方便的工具,在绝大多数情况下,也是非常有用的工具。 s<_a>]y  
  1。如何设置和使用AUTOTRACE UbDwak9  
7xM0h<  
SQL> connect / as sysdba c[F }M@c  
1//25OVa  
SQL> @?/rdbms/admin/utlxplan.sql #d2z?"g!  
q~L*Tm/n  
Table created. 9ul..:L  
"J|wkf(J  
SQL> create public synonym plan_table for plan_table; y'T{o  
_W#*m>6) g  
Synonym created. Zq;UQ  
y;4'Uc @h  
SQL> grant select,update,insert,delete on plan_table to public; fJ[o8-  
w(b/#2v  
Grant succeeded. F/B(PGR  
;m/:UgOy  
SQL> @?/sqlplus/admin/plustrce.sql |kTTT2_5  
aYrjyb)Y  
SQL>grant plustrace to public. '/8|b4J.i  
TR "S'"mm  
  2. 理解和使用AutoTrace ?Q;bp&.7i  
TUSZwhNGkm  
  对于SQL 调整,使用Autotrace是最简单的方法了,我们只需要做: 5{&B.&fQ  
(% SoDt)U  
SQL>SET AUTOTRACE ON  @#/3Z=,  
=v{j27kp  
  我们就可以看到我们SQL的执行计划,执行成本(PHYSICAL READ/CONSISTENT READ...) #8b}k@lly  
p/Z0^z ^d  
  加上SET Timing On或者Set Time On,我们可以得到很多我们需要的数据。 -laB4U   
Y_ra (I  
  然后在toad里面对某一条sql语句按下Ctrl+e就可以看到这条语句的执行计划了。