版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/第一章Oracle入门1.1安装1.2系统服务图1-SEQ图\*ARABIC\s11Oracle数据库系统服务1.3数据库和实例1.3.1数据库数据库是磁盘上存储的数据集合。每个数据库都有自己的名字,数据库名是用于区分数据库的一个内部标识,是以二进制方式存储在数据库控制文件中的参数。数据库创建之后不能再修改这个参数。它被写入数据库参数文件p中。1.3.2数据库实例 实例是一组后台进程和共享内存。数据库实例是操作数据库的实体,用户通过实例与数据库交互。每个数据库实例都有自己的名字,实例名用来标识这个数据库实例。数据库创建后,实例名可以被修改。它也被写入数据库参数文件p中。1.3.3两者关系 数据库是磁盘上存储的数据集合。� 数据库可以由一个或多个实例(使用RAC)装载和打开。 实例是一组后台进程和共享内存。 实例“一生”只能装载并打开一个数据库。数据库名与实例名可以相同。一个数据库对应一个实例的情况下设置成相同的便于标识数据库。但是在8i,9i的并行服务器中,数据库与实例不存在一一对应关系,而是一对多关系,一个数据库对应多个实例。不过一个用户只能与一个实例相连。1.3.4数据库物理结构图1-SEQ图\*ARABIC\s12Oracle数据库的物理结构►参数文件数据库参数文件并不是数据库文件系统中的有效组成部分,因为在启动数据库的时候,参数文件并不直接参与工作。但是数据库参数文件中,记录着数据库控制文件的物理地址,所以要靠它来寻找控制文件。图1-3数据库参数文件►文件系统图1-4Oracle数据库的文件系统*.CTL表示控制文件*.DBF表示数据文件*.LOG表示日志文件控制文件用来管理和控制数据文件和日志文件。在启动数据库的时候,启动实例之后,就启动对应的控制文件,接着由控制文件打开数据文件。databaseamount就是打开控制文件,databaseopen是打开数据文件。在Oracle中,有两种类型的日志文件:图1-4中的REDO*.LOG称为联机日志文件,也成为重做日志文件。如果REDO01.LOG写满则写REDO02.LOG,REDO02.LOG写满了写REDO03.LOG,而REDO03.LOG写满了又会重新写入REDO01.LOG,这是联机日志文件中的非归档方式。还有一种称为归档日志文件,是在备份尤其是热备份的时候,一定要选择的一种归档方式。1.4内存结构当一个Oracle实例启动之后,它分配了一个称为SGA(系统全局区)的内存块图1-5Oracle数据库内存结构1.4.1缓冲区►DBbuffer(数据库高速缓冲区)如果每次执行sql语句,都要对磁盘数据进行读写,则效率会非常慢。内存中被用来频繁读取数据的部分就称为数据库高速缓冲区。DBbuffer是SGA中最大的部分。它又分为以下三个部分:保持缓存池再生缓存池默认缓存池►共享池1.4.2Oracle相关进程1.5逻辑结构1.5.1表空间1.5.2段1.5.3盘区1.5.4数据块第二章SQL/PLUS基础1.1登录账户用sys/system账户,以sysdba的方式登录,可以解锁其他账户,如:alteruserscottaccountunlock;alteruserscottidentifiedbyaaaaa;connscott/aaaaa;注意:密码是纯数字,如123456是不对的1.2帮助SQL>helpindexSQL>?SET1.3替代变量和执行计划A:SQL>select*fromdeptwheredeptno=10;SQL>select*fromdeptwheredeptno=20;B:SQL>select*fromdeptwheredeptno=&tt;SQL>10SQL>select*fromdeptwheredeptno=&tt;SQL>20A和B得到的结果一样,但A中启动两个执行计划,B中只有一个给用户授权:Grantconnettoaaa;第三章SQL语言基础1.3.1语言的分类DDL:数据定语言Create实例:createtableabc(avarchar2(10),bchar(10));创建表 altertableChinaCitymodifyCitySimplenull;修改表字段为空grodtableChinaCity删除表Alter实例:altertableabcaddcnumber;添加表字段Drop实例:droptableabc;删除表,altertableabcdropcolumnc;删除表中的某一字段DCL:数据控制语言Grant实例:grantselectondepttott;授权给tt用户有查询的权限Revoke实例:revokeselectondeptfromtt;收回tt用户的查询权限DML:数据操纵语言Select实例:select*fromabc;查询abc表的值Insert实例:insertintoabc(a,b)values(‘abc’,’xy’);为abc表赋值Update实例:updateabcsetb=’ttt’;修改abc表中所有的b改为tttupdateabcsetb=’yyy’wherea=’abc’;把abc表中a为abc的b改为yyyDelete实例:deletefromabc;把表里面的所有数据都情空deletefromabcwherea=’abc’;把表里面a为abc的删除1.3.2常用的系统函数字符:length查字符,lengthb差字节,trim,ltrim和rtrim截掉空格和左右两边空格,substr(’abcdefj’,2,3)截取字符串,从第二个开始取三个,substr(‘abcdefg’,length(‘abcdefg’)-3+1,3)答案efg可变长(varchar2(10))的存多少字符长度就为多少,对于不可变长的(char(10)),没有存满也是原本定的长度所以为了避免不必要的浪费,一般定义为可变长日期:sysdate当前时间,current_date查询当前时间,altersessionsetnls_date_format=’dd-mon-yyyyhh:mi:ss’;设定时间的格式next_day指定的某个星期几是几号selectnext_day(sysdate,’星期三’)fromdual;转换:To_char(sysdate,’yyyy-mm-ddhh24:mi:ss’)把日期型传唤出字符型,24小时制To_date(’12-3月-04’)把字符型转换成日期型To_number(‘333’)字符型转换成整型聚集函数:Sum()总数,max()最大值,min()最小值,avg()平均值,count()总记录数其他:selectuserfromdual;查询当前的登录帐号selectsum(decode(sex,’男’,1,0)),sum(decode(sex,’女’,1,0))from表;统计男为几个,女为几个selecta1,nvl(a2,’为输入’)a2from表;如果为空值就表面为输入select*from表面orderbya1asc;升序排列select*from表面orderbya1desc;降序排列selectdistincta1from表面;去除重复数据分组语句:selectpub,sum(price)frombooksgroupbypub;使用groupby分组查询各出版社的图书价格selectpub,sum(price)frombooksgroupbypubhavingsum(price)>50;groupby结合having查询总金额大于50的出版社名称selecta1,count(a1)fromaagroupbya1havingcount(a1)>1;查询a1字段重复出现的次数模糊查询:select*fromaawherea1like‘a_’;使用通配符(like)查询a1字段中以a开头,任意多个字符结尾的数据select*fromaawherea1like‘%a%’;查询表中a1有a字符的数据表连接:selecte.eid编号,姓名,e.sex性别,所在部门fromeinnerjoindone.id=d.id;内链接selecte.eid编号,姓名,e.sex性别,所在部门frome,dwheree.id=d.id(+);左链接selecte.eid编号,姓名,e.sex性别,所在部门frome,dwheree.id(+)=d.id;右链接子查询:(无关子查询,相关子查询)select*fromewhereidin(selectidfromdwhereid=e.idandid=’03’);select*fromewhereidnotin(selectidfromdwhereid=e.idandid=’03’);select*fromewhereexists(selectidfromd);判断是否存在结果集select*fromewherenotexists(selectidfromd);判断是否不存在结果集selecteid,namefromeunionselectid,namefromd;把两张表合并成一张,去除重复数据selectidfromeintersectselectidfromd;返回两个sql语句中都出现的行insertintoe(eid,ename)selectid,namefromd; 一次从别的表中插入多条记录createtabletttas(select*frome);创建表是复制别的表中的数据进入新表createtabletasselecteid,enamefromewhereeid=’001’;选择001的数据复制到新的表里面第四章PL/SQL基础PL/SQL的结构:Declare..声明变量,赋予初值,可选项Begin…具体的操作Exception…声明,实现异常处理部分end;/实例:dclarexvarchar2(10);yinteger:=123;zstring(10):=’123’;beginx:=’thisis…’;dbms_output.put_line(‘x的值为:’||x);--||表示连接字符,dbms_output是一个包,实现与外部的交互,put_line打印输出;end;/setserveroutputonsize10000;设置显示输出信息,默认的是不输出,设置字节大小为10000;量声明:变量声明的内容:赋予变量适当的名称,适当的数据类型,定义变量(标准变量,复合变量),控制变量范围命名规则:变量由字符开头,可以包含数字,下划线,$,#等,变量长度范围1~30,大小写不区分,变量名不能是系统关键字存储:savec:\plsql_01.text;执行:@c:\plsql_01.text;修改:editc:\plsql_01.text;dbms_output.new_line表示在新行里面打印输出;和dbms_output.put一起使用,也就是dbms_output.put_line分支语句:if分支语法:if…then….elsif….then….else…endif实例:declareanumber;bvarchar2(10);begina:=2;Ifa=1thenb:=’a’;elsifa=2thenb:=’B’;elseb:=’c’;endif;dbms_output.put_line(‘b的值是:’||b);输出end;/case分支语法:casewhen…thenelseendcase实例:declareanumber;bvarchar2(10);begina:=2;casewhena=1thenb:=’A’;whena=2thenb:=’B’;whena=3thenb:=’C’;elseb:=’abc’;endcase;dbms_output.put_line(‘b的值是:’||b);输出end;/循环语句:基本循环(loop)语法:Loop…Endloop实例:DeclareXnumber;BeginX:=0;LoopX:=x+1;Ifx>=3thenExit;Endif;Dbms_output.put_line(‘内:x=’||X);Endloop;Dbms_output.put_line(‘外:x=’||X);End;/while循环语法:whileexpressionloop…Endloop;实例:DeclareXnumber;BeginX:=0;Whilex<=3loopX:=X+1;Dbms_output.put_line(‘内:x=’||X);Endloop;Dbms_output.put_line(‘外:x=’||X);End;/for循环语法:forcounterin[reverse]start_value起始…end_valueLoop结束…Endloop;实例:BeginForiIN1..5loop希望由大到小,在IN后面加上REVERSEDBMS_output.put_line(‘i=’||i);Endloop;DBMS_OUTPUT.PUT_LINE(‘endofforloop’);End;/goto语句实现循环:实例:DeclareXnumber;BeginX:=0;<<repeat_loop>>设置标记X:=x+1;Dbms_output.put_line(x);Ifx<3thenGotorepeat_loop;如果x小于3就goto到之前的标记位置Endif;End;/异常处理:异常分类系统异常DUP_VAL_ON_INDEX向有唯一约束的表中插入重复行NO_DATE_FOUND在一个selectinto语句中无返回值TOO_MANY_ROWSselectinto语句返回了多行VALUE_ERROR一个算法,转换截断或大小约束发生错误ZERO_DIVIDE发生呗零除自定义异常异常结构ExceptionWhen…. Then….复合变量:记录记录的声明:Typetype_nameisrecord(Variable_namedatatype[,Variable_namedatatype[,…..);Real_nametype_name;实例:DeclareTypemyrecordISrecord(Idvarchar2(10);idemp.eid%type;表示id变量的长度与emp表的id长度相同,也可以整张表的字段长度与某某表相同Namevarchar2(10);Real_recordmyrecord;BeginSelectemp_id,emp_nameintoreal_recordfromempwhereemo_id=’001’;Dbms_output.put_line(real_record.id||’,’||real_);End;/第五章PL/SQL高级应用一、游标(执行效率不高,消耗资源严重)1.1游标的概念:游标一种PL/SQL控制结构,可以对sql语句的处理进行显示控制,便于对表的行数据逐条进行处理。1.2游标的分类显示,隐式1.3游标的属性%FOUND,boolean型的判断有数据可取%ISOPEN,查看游标是否打开,如:ifcur%isopenthen%NOTFOUND,boolean型的判断没有数据可取,和found相反%ROWCOUNT用来返回迄今为止已经从游标中取出的数据数目显示游标实例:DeclareCursormycuris创建游标Select*frombooks;Myrecordbooks%rowtype;声明变量,与books表的类型相同BeginOpenmycur;Fetchmycurintomyrecord;把游标mycur里的数据放到变量myrecord里面,首先取的是第一条Whilemycur%foundloop循环去游标里面的数据Dbms_output.put_line(myrecord.books_id||’,’||myrecord.books_name);Fetchmycurintomyrecord;Endloop;Closemycur;End;/Oracle中游标可以带参数实例:DeclareCursorcur_para(idvarchar2)is常见带参数的游标Selectbooks_namefrombookswherebooks_id=id;t_namebooks.books_name%type;--声明变量BeginOpencur_para(‘001’);传入参数Loop--进入循环Fetchcur_paraintot_name;--把游标的内容放入到变量里面Exitwhencur_para%notfound;--游标中没有数据可取的时候退出Dbms_output.put_line(t_name);Endloop;Closecur_para;End;/以for循环的形式:不需要open和closeDeclareCursorcur_para(idvarchar2)isSelectbooks_namefrombookswherebooks_id=id;BeginDbms_output.put_line(‘结果集为’);Forcurincur_para(‘0001’)loop;Dbms_output.put_line(cur.books_name);Endloop;End;/ROWCOUNT的使用方法:Declaret_namevarchar2(10);cursormycurisselectnamefromdeptment;beginopenmycur;loopfetchmycurintot_name;exitwhenmycur%notfoundormycur%notfoundisnull;dbms_output.put_line(‘游标mycur的rowcount是:’||mycur%rowcount);endloop;closemycur;end;/利用游标修改数据:DeclareCursorcuris--=-创建游标Selectnamefromdeptmentforupdate;加上forupdate选项才能利用游标修改数据textvarchar2(10);定义变量beginopencur;fetchcurintotext;--把游标中的数据放入变量里面whilecur%foundloop当有数据可取的时候进入while循环updatedeptmentsetname=name||’_t’wherecurrentofcur;currentofcur判断游标的当前行fetchcurintotext;endloop;closecur;end;/隐式游标的实例:BeginForcurin(selectnamefromdeptment)loopDbms_output.put_line();Endloop;End;/4.1.1无参过程createorreplaceprocedureproc_test1isbegin dbms_output.put_line(systimestamp);end4.1.2带输入参数createorreplaceprocedureproc_test2(p_tempvarchar2)isbegin insertintoscott.test1values(p_temp);end4.1.3带输出参数createorreplaceprocedureproc_test3(p_tempvarchar2,p_countoutnumber)isbegin insertintoscott.test1values(p_temp); selectcount(a)intop_countfromscott.test1;endvarp_countnumberexecproc_test3('c',:p_count)printp_count4.1.4参数的几种传递方式--位置传递--名称传递--组合传递4.1.4查看过程的源代码selecttextfromuser_sourcewherename='PROC_TEST3';【注意】过程的名字一定要大写4.2过程实例4.2.1过程说明过程实现的功能是:接收一个关键字,根据关键字查询各个品牌中,包含该关键字的包包数量在Oracle过程中查询出来的东西都要放入变量(各种类型,如果是结果集则使用游标)游标类型要临时定义,且必须在过程之前,这就需要将类型定义和过程放在同一个包中4.2.2建包--首先,创建包规范createorreplacepackagemypkgistypemycursorisrefcursor;procedureproc_countBrandbagByKeyword(p_tempvarchar2,cur_brandbagcountinfooutmycursor);end;4.2.3建过程--其次,创建包体(主要是过程)createorreplacepackagebodymypkgisprocedureproc_countBrandbagByKeyword(p_tempvarchar2,cur_brandbagcountinfooutmycursor)isbeginopencur_brandbagcountinfoforselecta.*,(selectcount(bagid)fromscott.T_Bagwherebagbrandid=a.brandidandbagnamelike'%'||p_temp||'%')bagcountfromscott.T_BagBrandaorderbybagcountdesc;endproc_countBrandbagByKeyword;endmypkg;4.2.4在Oracle中调用过程--在匿名块中调用setserveroutputondeclaretypemycurtypeisrefcursor;cur_countinfomycurtype;v1number(18);v2varchar2(50);v3varchar2(20);v4number(5);beginc_countBrandbagByKeyword('11',cur_countinfo);loop fetchcur_countinfointov1,v2,v3,v4; exitwhencur_countinfo%notfound; dbms_output.put_line('品牌名称:'||v2||'包包数量:'||v4);endloop;end;4.2.5用JAVA调用oracle过程一无输出参数的过程表:TESTTB,里面两个字段(I_ID,I_NAME)。过程:CREATEORREPLACEPROCEDURETESTA(PARA1INVARCHAR2,PARA2INVARCHAR2)ASBEGININSERTINTOHYQ.B_ID(I_ID,I_NAME)VALUES(PARA1,PARA2);ENDTESTA;java代码:importjava.sql.*;publicclassTestProcedureOne{publicstaticvoidmain(String[]args){Stringdriver="oracle.jdbc.driver.OracleDriver";StringstrUrl="jdbc:oracle:thin:@:1521:hyq";hyq是指哪个数据库Connectionconn=null;CallableStatementproc=null;try{Class.forName(driver);conn=DriverManager.getConnection(strUrl,"hyq","hyq");proc=conn.prepareCall("{callHYQ.TESTA(?,?)}");proc.setString(1,"100");proc.setString(2,"TestOne");proc.execute();}catch(SQLExceptionex2){ex2.printStackTrace();}catch(Exceptionex2){ex2.printStackTrace();}finally{//......}}}二有输出参数的过程(非列表)存储过程为:CREATEORREPLACEPROCEDURETESTB(PARA1INVARCHAR2,PARA2OUTVARCHAR2)ASBEGINSELECTINTOPARA2FROMTESTTBWHEREI_ID=PARA1;ENDTESTB;在java里调用时就用下面的代码:packagecom.hyq.src;publicclassTestProcedureTWO{publicTestProcedureTWO(){}publicstaticvoidmain(String[]args){Stringdriver="oracle.jdbc.driver.OracleDriver";StringstrUrl="jdbc:oracle:thin:@:1521:hyq";Statementstmt=null;ResultSetrs=null;Connectionconn=null;try{Class.forName(driver);conn=DriverManager.getConnection(strUrl,"hyq","hyq");CallableStatementproc=null;proc=conn.prepareCall("{callHYQ.TESTB(?,?)}");proc.setString(1,"100");proc.registerOutParameter(2,Types.VARCHAR);proc.execute();StringtestPrint=proc.getString(2);System.out.println("=testPrint=is="+testPrint);}catch(SQLExceptionex2){ex2.printStackTrace();}catch(Exceptionex2){ex2.printStackTrace();}finally{try{if(rs!=null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch(SQLExceptionex1){}}}}}注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。三输出参数为游标的过程(列表)由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。如下:CREATEORREPLACEPACKAGETESTPACKAGEASTYPETest_CURSORISREFCURSOR;endTESTPACKAGE;2,建立存储过程,存储过程为:CREATEORREPLACEPROCEDURETESTC(p_CURSORoutTESTPACKAGE.Test_CURSOR)ISBEGINOPENp_CURSORFORSELECT*FROMHYQ.TESTTB;ENDTESTC;可以看到,它是把游标(可以理解为一个指针),作为一个out参数来返回值的。在java里调用时就用下面的代码:packagecom.hyq.src;importjava.sql.*;importjava.io.OutputStream;importjava.io.Writer;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importoracle.jdbc.driver.*;publicclassTestProcedureTHREE{publicTestProcedureTHREE(){}publicstaticvoidmain(String[]args){Stringdriver="oracle.jdbc.driver.OracleDriver";StringstrUrl="jdbc:oracle:thin:@:1521:hyq";Statementstmt=null;ResultSetrs=null;Connectionconn=null;try{Class.forName(driver);conn=DriverManager.getConnection(strUrl,"hyq","hyq");CallableStatementproc=null;proc=conn.prepareCall("{callhyq.testc(?)}");proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);proc.execute();rs=(ResultSet)proc.getObject(1);while(rs.next()){System.out.println("<tr><td>"+rs.getString(1)+"</td><td>"+rs.getString(2)+"</td></tr>");}}catch(SQLExceptionex2){ex2.printStackTrace();}catch(Exceptionex2){ex2.printStackTrace();}finally{try{if(rs!=null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch(SQLExceptionex1){}}}}在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。四:函数基本语法:Createorreplacefunctionfunction_name(argument1mode1datatype1,参数argument2mode2datatype2,参数…….)参数Returndatatype返回值类型Is|asPl/sqlblock;语句块4.1创建无参函数:CreateorreplacefunctioncountBagReturnnumberIsNnumber;BeginSelectcount(*)intonfromT_Bag;Returnn;End;4.2调用函数:方法一(sql语句中直接调用):SelectcountBagfromdual;无参调用SelectcountBagByBrand(3)fromdual;有参调用方法二(使用变量接受函数返回值):Varn1numberExec:n2:=countBagPrintn1Varn1numberExec:n2:=countBagByBrand(3)Printn1方法三(使用包DBMS_OUTPUT调用函数):SetserveroutputonExecdbms_output.put_line(‘使用dbms_output函数调用’||countBag);SetserveroutputonExecdbms_output.put_line(‘使用dbms_output函数调用’||countBagByBrand(3));4.3创建带参函数CreateorreplacecountBagByBrand(brandidnumber)ReturnnumberIsN2numberBeginSelectcount(*)inton2fromT_Bagwherebagbrandid=brandid;Returnn2;End;4.4java中调用:第六章视图、同义词、序列一:视图1.视图的概念:视图实际上是一条查询语句,是数据的显示方式,降低语句的复杂性,使语句可读性更强,不占用实际空间。2.视图的作用:安全性(利用视图限制用户访问表中行列的权利,限制用户向表中插入数据的权利)方便性(利用视图封装更为复杂的查询语句,生成报表更为简单)一致性(提高效率的作用)3.创建视图的语法:实例:CreateorreplaceviewmyviewAsSelect*frombooks;/创建带条件的视图:CreateorreplaceviewmyviewAsSelect*frombookswhereprice>30Withcheckoption;--表示检查视图的选项,也就是where条件,如果大于30的话就插入数据,小于就不行/往视图中插入数据:实例:Insertintomyviewvalues(‘0007’,’sdfdf’,23,5,’df’);如果组成视图的表是两个或者两个以上的话,不能更新视图,需要更新的话要满足一定的条件。(解决办法要等到替代触发器),如果视图中包含聚合函数也是不可以更新的创建只读视图:Createorreplaceview_read之前存在就删除AsSelect*fromempWithreadonly;视图为只读二:同义词(公共同义词,私有的专用的同义词)概念:语法:Createsynonymdeptforscott.dept;默认的是私有的专有的同义词,只能当前用户使用Createpublicdeptsynonymdeptforscott.dept;创建公共的同义词,都可以使用Dropsynonymdept;删除同义词三:序列(相当于SQLSERVER中的自增长)语法:CreatesequencemyscqStartwith1希望从几开始Incrementby1递增几个Order排序Nocycle;不循环,避免相同,但会影响性能Selectmyscq.nextvalfromdual;序列的下一个值Selectmyscq.curruvalfromdual;当前的值把序列应用到某个表里面:Createtableauto(anumber,bvarchar2(10));Insertintoautovalues(myscq.nextval,’adf’);对auto表中的a列加入序列,实现自增修改当前序列的递增量AlertsequencemyscqIncrementby3;序列只能修改递增量,不能修改当前值查询当前用户的序列:Selectsequence_namefromuser_sequence;查询某个用户的序列:selectSEQUENCE_OWNER,SEQUENCE_NAMEfromdba_sequenceswheresequence_owner='SCOTT';创建用户语法:CREATEUSERusernameIDENTIFIEDBY密码;修改密码:alteruserscottidentifiedbyscott11;修改用户帐号为锁定:Alteruserscottaccountlock;解锁unlockSysdba给test授予对scott.dept的查询的功能,同时test也可以把对scott.dept的查询功能授权给别的用户:grantselectonscott.depttotestwithgrantoption;第七章触发器1、触发器的概述、分类需要触发事件,触发对象,触发条件,执行触发的语句体2、事务2.1什么是事务?事务是数据库中重要的机制,用于确保数据完整性和并发处理的能力,它将一条/一组SQL语句当作成一个逻辑上的单元,用于保障这些语句都成功/失败。2.1事务的特性?事务具有ACID四大特性:A(Atomicity)原子性:是一个逻辑的单元,不可分割的,只有成功和失败两种可能,如果一方失败就都失败。(手段)C(Consistency)一致性:操作的前后让数据保持一致。(目的,也就是以原子性的手段达到一致性的目的)I(Isolation)隔离性:以加锁的方式保证数据的完整。(隔离性越强并发性就越弱)D(Durability)永久性:对同一个事务而言,一旦提交就不能回滚,一旦回滚就不能提交。行级触发器工作原理和设计应用实例:Createorreplacetriggerdel_deptid创建一个触发器Afterdeleteondeptment删除动作,对deptment做触发器Foreachrow循环,对每一行做触发BeginDeletefromempwhereid=:old.id;Enddel_deptid;/触发器创建完成后,再删除Deletefromdeptmentwhereid=’01’;这样两张表都删除了数据增加:Createorreplacetriggerinsert_deptid创建一个触发器Afterinsertondeptment增加动作,对deptment做触发器Foreachrow循环,对每一行做触发BeginInsertintoemp(eid,ename,id)values(‘121’,’dffd’,:new.id);End;/创建完后,增加:Insertintodeptmentvalues(‘77’,’dfd’);这样两张表都插入了数据修改:Createorreplacetriggerupdate_deptid创建一个触发器Afterupdateondeptment增加动作,对deptment做触发器Foreachrow循环,对每一行做触发BeginUpdateempsetid=:new.idwhereid=:old.id;End;/创建完后,修改:Updatedeptmentsetid=’yy’whereid=’01’;这样两张表都插入了数据判断删除:Createorreplacetriggerbooks_deleteAfterdeleteonbooksForeachrowBeginIf:old.books_id=’0001’then设置0001不能呗删除Raise_applichtion_error(-20000,’不允许删除!’);只能写-20000~-20999别的不可以Endif;End;/创建完后,删除:Deletefrombookswherebooks_id=’0001’;不能呗删除,别的编号可以语句级触发器的设计应用实例:先创建表:(创建一个特殊表,记录哪个用户在哪个时间做了哪个动作)Createtablemylog(curr_uservarchar2(100),curr_datedate,actchar(1));再创建触发器:Createorreplacetriggerdml_aaAfterinsertordeleteorupdateonaa在aa表上做的记录,后触发BeginIfinsertingthenInsertintomylogvalues(user,sysdate,’I’);ElsifdeleteingthenInsertintomylogvalues(user,sysdate,’D’);ElseInsertintomylogvalues(user,sysdate,’U’);Endif;End;/显示转换(时间转换成字符串):Selectcurr_user,to_char(curr_date,’yyyy-mm-ddhh24:mi:ss’)dfrommylog;结合触发器利用序列实现自增:Createorreplacetriggerset_noBeforeinsertonauto对auto做触发器ForeachrowDeclareSnnumber(5);定义变量BeginSelectmyseq.nextvalintosnfromdual;myseq.nextval是一个序列,把它放到变量里面:new.a:=sn;End;/创建完后,增加数据:Insertintoautovalues(32,’dfg’);32是无效的,会被序列中的数据替代替换触发器应用使用替换触发器解决视图中多张表的数据更新实例:Createorreplacetriggertr_v_e_dInsteadofinsertonv_emp_dept针对v_emp_dept视图的增加触发器ForeachrowBeginInsertintodeptmentvalues(:new.id,:);分别操作两个基表,首先是deptment,使用new这个表Insertintoemp(eid,ename,sex,id)values(:new.eid,:new.ename,:new.sex,:new.id);再针对emp表,由于两个表里面都要deptment编号,作为连接条件,为了公共匹配,向emp中插入数据时也要不过来End;/创建完后,插入数据:Insertintov_emp_deptvalues(‘456’,’test’,’r’,’33’,’gh’第八章安全管理8.1用户管理8.1.1创建CREATEUSER"test"PROFILE"DEFALUT"IDENTIFIEDBY"test12345"DEFAULTTABLESPACEttACCOUNTUNLOCK;8.1.2授权前提:登录到具备权限的账户下才能做以下授权GRANTconnectTOtest;►对象授权GRANTSELECTONscott.deptTOtest[WITHGRANTOPTION];[]为可选部分,如果省略,则test只能查询scott.dept,如果不省略,则test还可以将对scott.dept的查询授权给其他账户。一般来讲,这个选项不建议使用。如果是表,SELECT部分还可以使用INSERTDELETEUPDATEALL如果是过程,SELECT部分要改成EXECUTE►系统授权GRANTCREATEUSERTOtest[WITHADMINOPTION];GRANTDROPUSERTOtest;►解除授权REVOKESELECTONscott.deptFROMtestREVOKECREATEUSERFROMtest8.1.3管理前提:登录到具备权限的账户下才能做管理更改默认表空间:ALTERUSERtestDEFAULTTABLESPACEtt;更改密码:ALTERUSERtestIDENTIFIEDBYtest54321;锁定/解锁:ALTERUSERtestACCOUNTLOCK/UNLOCK;8.2角色管理8.2.1创建CREATEROLEmyrole;8.2.2授权GRANTSELECTONscott.deptTOmyrole[WITHGRANTOPTION];8.2.3将角色分配给账户GRANTmyroleTOtest;8.3概要文件概要文件主要是账户登录时的一些配置信息,比如:口令的有效期CPU会话并行会话数……主要是影响性能和安全的一些配置。下午作业:创建一个账户,只授权了connect,没有授权dba看是否可以assysdba登录?可以登录某个用户有insert和select权限,创建一个角色有select和insert功能,把这个角色分配给用户,查看把角色移除了,这个用户是否还有insert和select权限?还存在insert和select权限,因为即使删除了角色,但用户当前的insert和select功能还存在两个用户分别建同名的表放在同一个表空间,是否可以?可以,和表空间没有关系,不会有阻碍一个用户能不能在两个不同的表空间建两个表A?不可以用户的默认表空间是tabsA的时候,建了10个表,这10个表在tabsA对应的数据文件上;用户的默认表空间是tabsB的时候,建了5个表,这5个表在tabsB对应的数据文件上,假设我们将tabsA对应的数据文件导到另一台电脑的toracle,能看到几张表?用户的默认表空间是tabsA的时候,建了1个表并插入10条数据,;更改用户的默认表空间是tabsB的时候,还在这个表里插入5条数据,假设我们将tabsB对应的数据文件导到另一台电脑的toracle,能看到这张表吗?如果能看到,有几条数据呢?自增长:自增长怎么做、创建一个序列:CreatesequencemyscqStartwith1希望从几开始Incrementby1递增几个Order排序Nocycle;不循环,避免相同,但会影响性能Selectmyscq.nextvalfromdual;序列的下一个值Selectmyscq.curruvalfromdual;当前的值创建表:Createtableauto(anumber,bvarchar2(10));把表中的a列加入序列:Insertintoautovalues(myscq.nextval,’a’);对auto表中的a列加入序列,实现自增约束:只能是指定的一些值?Check约束:Altertableempaddconstraintck_emp_sexCHECK(sex=’男’orsex=’女’);只能是某个范围的值?Check约束:Altertableempaddconstraintck_emp_ageCHECK(age>18orsex<150);只能是某个样子的值(Email)?默认值?外键引用?Altertablemmaddconstraintfk_mnforeignkey(n1)referncesnn(n1);nn表中的n1和mm表中的n1是主外键索引:什么样的表上需要索引?数据量很大的时候,需要索引来提高查询速度什么样的列上面需要建索引?列的唯一值很少的时候,需要建索引,如性别在什么情况下该建什么样的索引?一般情况下:Createindexmy_mm_idxonmm(m1);唯一值很少的情况下,如性别)Createbitmapindexbit_emponemp(sex);需要唯一索引的情况下:Createuniqueindexmyidxonmm(m2);将一个表空间分配给某个用户后,如果不授权,那么这个用户能在该表空间里干什么呢?不能在此表空间里面建表第九章表空间的管理1、创建表空间(表空间就相当于SQLServer的数据库)语法:Createtablespacetabsdatafile‘c:\oracle\product\10.1.1\oradata\test\tabs.dbf’size10m;某个用户的默认表空间:Alteruserscottdefaulttablespacetabs;授予操作表空间权限:grantunlimitedtablespace,dbatoscott;把dba的权限给scott创建表放置到指定表空间:(不指定的话就放到默认表空间)Createtablety(tchar(10),yvarchar2(10))tablespacetabs;添加dbf文件到test用户的表空间Altertablespacetestadddatafile‘d:\iracke\test1.dbf’size10m;收回对表空间的操作权限:Revokeunlimitedtablespacefromscott;如果要限制某个用户对该表空间的使用,在此可以设置为0Alterusertestquota10M/0ontt;
resource中包含有unlimitedtablespace的权限即对任何一个表空间的使用权限grantconnect,sourcetotest;导出表空间数据文件:Expscott/wayactionfile=’f:oracle\tabs.dmp’tablespaces=(tabs);查询表所在的表空间:Selectt.tablespace_name,t.table_namefromall_tablestwheret.table_name=’TBLMATERIAL’;凡是在oracle中查找的东西name后面的名称必须是大写查询某个用户的默认表空间:select
default_tablespacefromdba_userswhereusername='SCOTT';(引号内区分大小写)查看当前oracle的默认实例名:SELECThost_name,instance_name,versionFROMv$instance;修改当前oracle的实例名要去修改注册表运行下面的regedit创建临时表空间:Createtemporarytablespacetemp2;查询当前的字符集:Select*fromnls_database_parameterswhereparameter=’nls_characterset’;清屏:hocls块的概念:匿名块和命名块(需要再深入了解),命名分为子程序(过程,函数,包,触发器)第十章表的管理1、表的完整性与约束完整性:实体完整性(主键唯一值),域完整性(类型长度),参照完整性(外键约束)添加主键:语法:Altertablennaddconstraintpk_nnprimarykey(n1);主键nn施加到n1列上添加外键约束:语法:Altertablemmaddconstraintfk_mnforeignkey(n1)referencesnn(n1);nn表中的n1和mm表中的n1是主外键注意:主外键引用的话,主键列必须是唯一或主键列Check约束:语法:Altertableempaddconstraintck_emp_sexCHECK(sex=’男’orsex=’女’);emp表中的sex列只能为男或女查看一个表的约束:descdba_constrains(由管理员),descall_constrains,descuser_constrains(当前用户模式下的)Selectconstraint_name,constraint_typefromuser_constraintwheretable_name=’EMP’;当前用户下emp表的所有约束Boolean值:isCheckEmailchar(1)default0notnull;oracle中没有boolean类型,所以可以用char(1)和number(1)来表示,但是相对来说char(1)比number(1)要好,但是char(1)不能为空插入日期(到毫秒):注意(为了储存毫秒,所以建表的时候,registertime要用timestamp)如registertiemtimestampdefaultcurrent_timestampnotnull;--因为sysdate没有毫秒,所以取值要用current_timestampInsertintoscott.t_user(to_timestamp(’2011-12-1110:34:32.3434’,‘yyyy-mm-ddhh24:mi:ss.ff3’));分:Insertintoscott.t_user(to_timestamp(’2011-12-1110:34:32.3434’,‘yyyy-mm-ddhh24:mi:ss’));查询的时候要转换:selectto_char(registertime,’yyyy-mm-ddhh24:mi:ss:ff3’)fromscott.t_user;有主外键的情况下,并不知道约束名称,删除表:droptabletablenamecascadeconstraints查询当前用户下所有的表:selecttable_namefromuser_tables;修改列的类型:Altertablescott.bagmodify(bagNamevarchar2(20));把bag表中id列原本是10的改为202、管理索引(当表的数据量很大的时候,为了提高查询速度,所以要建索引)索引的三个级别:根级索引,中间级索引,页级索引创建索引:语法:Createindexmy_mm_idxonmm(m1);Oracle中特殊的索引:语法:(解决唯一值很少的索引,如性别)Createbitmapindexbit_emponemp(sex);单独创建唯一索引:语法:Createuniqueindexmyidxonmm(m2);分页中Rownum的使用(伪列):select*from(selecta.*,rownumrfrom(select*frombag)a);在使用Rownum的时候,需要三层嵌套,最里面和最外面的查询都不涉和rownum,Rownum针对<符号没有问题,但>和=就不行,例如:select*,rownumrfrombagwhererownum>10;这句查询语句首先查询出rownum大于10的数据,但是rownum会对大于10的数据重新从一排序,所以就无法找到大于10的数据,=也是一样,=1可以查询出来,后面的就不行;rownum筛选后都会重新排序,所以需要三层嵌套Select*from(selecta.*,rownumrfrom(select*frombag)awhererownum<=5)bwherer>=1;3、过程创建无参过程语法:Create
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙人承包合同范例
- 内销服装加工合同范例
- 林地赠予合同范例
- 数学好玩 有趣的推理 教学设计(教案)2024-2025学年数学 三年级下册
- 欠款 车辆质押合同范例
- 沪科版八年级物理下册教案 9.2阿基米德原理
- 房屋律师见证合同范例
- 借款房租抵押合同范例
- 二年级上册数学教案-4.2玩一玩做一做 北师大版
- 网络采购轮胎合同范例
- 雍琦版-《法律逻辑学》课后习题答案(共78页)
- 咸水沽污水厂生物池清淤施工组织方案
- 二甘醇二苯甲酸酯(DEDB)
- 数字化变电站的IEC61850建模
- 管道闭水试验记录表自动计算软件
- 学校综合督导汇报ppt课件
- 人流咨询话术
- 铁路建设征地拆迁补偿标准(附表)
- 农村祠堂上梁说辞
- GB31644-2018食品安全国家标准复合调味料
- 建筑施工现场安全检查的程序及要点
评论
0/150
提交评论