oracle笔记大全

Oracel

用户锁:

         解锁: alter user scott account unlock;

         加锁: alter user scott account lock;

 

修改用户密码:

         alter user “用户名” identified by “新密码”;

         注意: sys这个用户要以系统管理员的身份登录 sys  /as  sysdba;

 

设置查询显示格式:

         set linesize 150; //每行显示150个字段。

         set pagesize 30; //每页显示30行。

注意:这个设置只对当前窗口起作用。

如果想对以后所有的窗口都有效,就必须修改D:\app\Administrator\product\11.2.0\dbhome_1\sqlplus\admin\glogin.sql文件,

在该文件中家加入set pagesize 30set linesize 150即可。

 

Spool c:/Note.txt; //生成一个txt文件记录你的操作。

Spool off; //闭关文件。

“/” 执行上一条语句。

Edit(修改错误的语句)修改完成输入”/”执行。

“--“ 单行注释。

/**/ 多选注释。

Desc emp; //查看表结构。

Host cls; //清屏。

Set timing on; //打开查询语句使用的时间。

Set timing off; //关闭查询语句使用的时间。

Alter session setnls_date_format = ‘yyyy-mm-dd’; //临时设置当前会话的时间格式。

设置持久化时间格式为:进入注册表 ->HKEY_LOCAL_MACHINE -> SOFTWARE –> ORACLE -> 点击KEY_OraDb11g_home1; 然后在实体内容里右键鼠标 –>新建字符串(名称为 NLS_DATE_FORMAT) –> 双击字符串在数值数据栏输入:YYYY-MM-DD-HH24:MI:SS

 

 

 

Select nvl(comm,0) from emp;//表示comm字段里把为null的值改为0,只能替换为数字。

 

Select deptno from emp wheredeptno In(10, 30); //表示匹配了in里的值就为true,相当于 or。

Not in(10, 30); //和in相反;

In() not in() 都不支持null值查询。

 

Select sal from emp wheresal between 1000 and 2000; //表示值在1000到2000之间,包括边界值。 注意参数小的要写在前面。

 

Select sysdate from dual; //查看当前系统时间。

 

oracle中判断为空用is null

Select ename from emp wherecomm is null;

 

select ename||'的工资是'||sal||'元'from emp; // “||”就是连接符。

 

select distinct id,name from aa;//排除id和name一样的值。

 

insert intoaa(id,name)values(112,'bb'); //插入值。

 

Select * from emp order bysal desc, comm desc; //排序

Order by默认排序为升序(asc, 降序为desc, 多个字段同时排序时, 排序的规则要分开写; 如果排序的字段里包含了null , 又想把null 值放在最后就在语句的最后加上 nulls last

 

select * from emp whereename like 'A%'; //模糊查询, %代表多个任意字符, _代表一个任意字符。

 

select * from emp whereename like '%/%%' escape '/';  // escape代表转义符,后面可以跟一个任意字符串。

注意:escape后面跟的字符串必须为1个字节,并且不能为Oracle里的通配符,如:% _

 

 

 

 

 

 

 

Oracle函数

select upper('dsdsdds') fromdual; // 小写转大写

 

select lower('SFSDDF') fromdual; //大写转小写

 

select substr('woshi haorena',2,7) from dual; //字符串截取

注意:Oracle的索引是从1开始的,字符串截取时包含最大索引和最小索引。最大索引是从最小索引开始计数的。如果索引为0,则返回整个字符串。如果索引为负数,则把字符串倒过来计数。如:

select substr('woshi haoren',-3)from dual; 返回 ren.

 

select length('asdfasdf')from dual; //统计字符串的长度

 

selectinstr('asdfasdf','df') from dual; //查询指定字符串是否在该字符串里,如果有,则返回第一个字符的索引,并不会在往下查询。

 

Select trim(‘hello world’)from dual; //去除开头和结尾的匹配字符。

 

Select lpad(‘aaa’,’5’,’T’)from dual; //左填充

 

Select rpad(‘aaa’,’5’,’T’)from dual; //右填充

 

Select round(167.618, 2)from dual; //四舍五入 167.62

 

Select trunc(167.618, 2)from dual; //字符小数部分截取 167.61

 

select trunc(sysdate,'yyyy')from dual; //截取日期  2014年01月01日  年的第一天

select trunc(sysdate,'mm')from dual; // 2014年12月01日  月的第一天

select trunc(sysdate,'d')from dual; // 2014年12月21日  周的第一天

select trunc(sysdate,'dd') fromdual; // 2014年12月25日  今天

select trunc(sysdate,'hh')from dual; //  小时

select trunc(sysdate,'ss')from dual; //   秒

 

selectto_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; //设置格式。

 

select sysdate+1 from dual;//时间加1

 

select last_day(sysdate)from dual; //这个月最后一天

 

selectename,months_between(sysdate,hiredate) from emp; //2个指定日期相差几个月

 

selectadd_months(sysdate,10) from dual; //当前时间加指定时间是多久,单位为月。

 

select next_day(sysdate,'星期一')from dual; //查看当前时间后面的第一个星期一是几号

 

selectename,sal*12+nvl2(comm,comm,0) from emp; // 如果comm为null取0,反之取comm

 

select nullif('aa','aa')from dual; //判断两个字符串是否相等,如果相等返回null,反之返回第一个字符串。

 

selectename,sal,comm,coalesce(comm,sal) from emp; //获取第一个不为空的值

 

select ename,job,sal,

  2         case job when 'PRESIDENT' then sal+1000

  3                  when 'MANAGER' then sal+800

  4                  else sal+400

  5         end after_sal

  6            *from emp

 

selectename,job,sal,decode(job,'PRESIDENT',nvl2(sal,sal,0)+1000,

  2                  'MANAGER',nvl2(sal,sal,0)+800,nvl2(sal,sal,0)+400

  3                  )

  4                     *  from emp

 

select count(*) from emp; //求多少条记录

 

 

--组函数具有自动滤空的功能

select sum(sal) from emp; //求和

 

selectavg(sal) from emp; //求平均数

 

--where后不能跟组函数

select deptno,job,avg(sal)from emp group by deptno,job; //分组查询

 

select deptno,avg(sal) fromemp group by deptno having avg(sal)>=2000; // having 分组后的条件查询

 

--如果既可以用where又可以用having,就用where,先筛选再分组效率高

select deptno,avg(sal) fromemp where deptno in(10,20) group by deptno;

 

select deptno,job,sum(sal)from emp group by rollup(deptno,job); //报表查询

 

break on deptno skip 2; //开启报表格式

break on null //关闭报表格式

 

select e.ename,e.job,d.dnamefrom emp e,dept d; //多表查询会产生笛卡尔集

 

//多表查询不会产生笛卡尔集

selecte.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;

 

select e.ename,e.job,s.gradefrom emp e, salgrade s where grade = 3 and e.sal >= 1401 and e.sal <=2000

 

//右连接

select e.deptno, d.dname,count(e.ename) from emp e, dept d where e.deptno+=d.deptno group bye.deptno,d.dname; //Oracle的方言

 

select e.deptno, d.dname,count(e.ename) from emp e right join dept d one.deptno=d.deptno group by e.deptno,d.dname; //通用

 

//左连接

selecte.deptno,d.dname,count(ename)  from empe,dept d where e.deptno=d.deptno(+) group bye.deptno,d.dname; //Oracle的方言

 

selecte.deptno,d.dname,count(ename)  from emp e left join dept d on e.deptno=d.deptno group bye.deptno,d.dname; //通用

 

select * from emp wheresal>any(select sal from emp where deptno=20);//大于any里的最小值

 

select * from emp where sal=any(selectsal from emp where deptno=20);//等于in函数

 

select * from emp wheresal

 

select * from emp wheresal>all(select sal from emp where deptno=20);//大于all里的最大值

 

select * from emp where sal

 

union(并集):公共部分只出现一次。

select * from emp whereename like '%A%'union select * from emp where ename like '%S%';

 

Union all(并集):公共部分出现多次。

select * from emp whereename like '%A%'union all select * from emp where ename like '%S%';

 

Intersect(交集):只出现公共部分。

select * from emp whereename like '%A%'intersect select * from emp where ename like '%S%';

 

minus(求差集):求集合A去除集合B部分的交集

select * from emp whereename like '%A%'minus select * from emp where ename like '%S%';

 

//插入操作

insert intodept(deptno,dname,loc) values(44,'huairen','xxx');

insert into deptvalues(45,'huairen1','xxx');

insertinto dept(deptno,loc) values(46,'yyy');

insert intodept(deptno,dname,loc) values(&deptno,&dname,&loc);

 

//更新

update dept setdname='haoren111' where deptno=48;

 

//删除

delete from dept wheredeptno=46;

truncate table aa;

注意:delete 删除的是被指定的记录,并且delete可以回滚和闪回。而truncate删除的是整个表(删除之后再根据原来的表结构创建一个和原来一模一样的表),truncate不能回滚和闪回。

 

 

//创建表

Create table aa(

         Id number primary key,

         Name varchar2(64) not null,

         Loc varchar2(64) not null

);

 

导入:

 

导出:

 

事务:一组DML操作的开始到结束提交算一次事务。

Commit;//提交事务

Savepoint  sp;//设置保存点

Rollback;//回滚整个事务

Rollback  to sp;//回滚到保存点

 

 

//使用查询结果创建表,使用 * 直接查询相当于复制表。

create table t_emp as select * from emp;

 

 

//使用查询结果创建表,使用 where false 查询就只有表结构。

create table t_emp1 as select * from emp where 1=0;

 

//使用查询结果插入值

insert into t_emp1 select *from emp;

 

//增加字段

alter table t_xx add addressvarchar2(20);

 

//修改字段

alter table t_xx modifyaddress varchar2(40);

 

//更改字段名

alter table t_xx renamecolumn address to my_address;

 

//删除字段

alter table t_xx drop columnaddress;

 

//删除表,普通用户删除表后表会进入回收站,管理员删除自己的表会直接删除,删除普通用户的表时表就会进回收站。

Drop table t_hehe;

 

//如果删除表时在语句后加上purge,那么该表不会进入回收站

drop table t_xxx purge;

 

//显示回收站内的内容

Show recyclebin;

 

//清空回收站

Purge recyclebin;

 

//设置字段默认值

Alter table t_test modifysal default 800000000;

 

//添加约束

Alter table t_aa add namevarchar(20) constraint t_aa_pk primary key);

 

//级联约束

alter table t_test2 adddeptno number constraint t_test2_fk references dept(deptno) on delete set null; //变为null

alter table t_test2 adddeptno number constraint t_test2_fk references dept(deptno) on delete cascade;//直接删除

 

//check约束

Alter table t_aa add gendervarchar2(20) constraint t_aa_ck check(gender in(‘男’,’女’));

 

//切换用户

Conn sys/change_in_stall assysdba; //管理员

Conn scott/123456;//普通用户

 

 

视图:

         视图是oracle又一种数据对象,视图的主要的用处是简化操作,提高安全,满足不同用户

         的查询需求,视图不是一个真正存在的物理表,他是别的表动态生成的。

 

         视图和表的区别:

1、  表占用空间,视图不需要;

2、  视图不能加索引

3、  视图可以简化操作;

                  

 

//授权scott用户可以创建视图,必须以管理员授权。

Grant create viewto scott;

 

//创建视图,通过视图可以修改表

Create view v_xxxas(select e.name,e.job,d.dname from emp e, dept d where e.deptno=d.deptno);

 

//创建视图或替换视图

Create or replaceview v_xxx as(select e.name,e.job,d.dname from emp e, dept d wheree.deptno=d.deptno);

 

//创建视图,并且该视图为只读,不能对视图进行修改。

Create view v_yyyas(select ename,sal from emp) with read only;

 

//创建视图,该视图只能修改已有的记录,不能修改视图的创建条件。

Create view v_yyyas(select ename,sal from emp) with check option;

 

 

//创建序列

Create sequence sequence;

 

//序列属性

Increment by n : 每次步长n;

Start with n : 从第n个开始使用。

Minvalue n : 最小为n。

Maxvalue n : 最大为n。

 

//使用序列,由于Oracle 11g这个版本增加了一个缓存段,所以每次在新表里使用序列时,都会比正常值多1。想要避免该情况有两种方法:1.禁用缓存段。2. 在创建序列时指定start with 这个属性为0,并且把minvalue 属性设为 0

Sequence.nextval : 生成一个连续的数字。

Sequence.currval : 查看当前的序列号,但是必须要先使用一次Sequence.nextval。

 

//创建索引,可以使用多个字段。

Create index i_ind onemp(deptno, job);

 

//删除索引

Delete index i_ind;

 

//创建同义词

Create synonym hehe for emp;

 

//查看行号rownum,该属性可以用在逻辑语句中。

Select rownum,ename from empwhere rownum=2;

 

//查看每行ID

Select rowed,ename from emp;

 

 

PL/SQL

Pl/sql块由三个部分构成:定义部分、执行部分、例外部分            

set serveroutputon

declare               --定义部分

v_enameemp.ename%type;

begin                 --执行部分

  select ename into v_ename from emp whereempno=&deptno;     --把查找的值赋给v_ename

  dbms_output.put_line(v_ename);

exception             --例外部分

whenno_data_found  then

dbms_output.put_line(‘没有这个值’);

end;

 

 

PL/SQL为变量赋值用 “:=” 赋值。

p_name  :=  'haoren';

PL/SQL为引用数据类型赋值用 into。

Select  ename,  sal  into  p_empname,  p_max  fromemp where sal=(SELECT max(sal) from emp);

 

--开启打印结果

set serveroutput on

--声明

declare

  p_name VARCHAR2(20);

  p_a NUMBER;

  p_b NUMBER;

  p_sum NUMBER;

  p_row  emp%rowtype;--记录类型  p_row.sal

  p_max  emp.sal % TYPE;--引用数据类型

  p_empname  emp.ename%type;

--开始

begin

  p_name  :=  'haoren';

  p_a  :=  1;

  p_b  :=  2;

  p_sum  :=  p_a+ p_b;

  --引用数据类型赋值

  select  ename, sal  into  p_empname, p_max  from  emp  where sal=(SELECT  max(sal)  from  emp);

  --记录类型赋值

  Select  *  into p_row  from  emp where  ename=’SMITH’;

  --打印语句

  dbms_output.put_line(p_empname||':'||p_max);

 

 

  if  p_row.deptno=20  then

         dbms_output.put_line(‘20’);

         elsif  p_row.deptno=30

                   dbms_output.put_line(‘30’);

                   else

                            dbms_output.put_line(‘10’);

  end  if;

--结束

end;

 

 

 

 

 

 

游标cursor:

set serveroutput on  --打开输出

 declare

    cursor cur is selectename,job,sal from emp;

    c_ename emp.ename%type;    --定义引用类型

    c_job emp.job%TYPE;

    c_sal emp.sal%TYPE;

 begin

  open cur;   --打开cur相当于调用

  loop     --loop是一个循环体

  fetch cur intoc_ename,c_job,c_sal;

    if c_job='MANAGER' THEN c_sal:=c_sal+800;     --使用if语句

    elsif c_job='PRESIDENT' THENc_sal:=c_sal+1000;

    else

      c_sal:=c_sal+500;

      END IF;

  dbms_output.put_line(c_ename||'的工作是'||c_job||'工资是'||c_sal);

 

  exit when(cur%notfound);

  end loop;

  close cur;    --关闭,如果不关闭,则最多能打开300 个cursor

 end;

 

                  

 

 

循环语句:

         ①最常用的循环:   结构:

                   loop

                   执行语句…….;

                   Exit when 条件语句;

                   End;

 

set serveroutputon

declare

  i NUMBER := 0;

begin

  loop

    i:=i+1;

    dbms_output.put_line(i);

    exit when i=20;

  end loop;

end;

        

 

         ②while 条件表达式 loop

                   执行语句……;

                   End loop;

        

         ③begin

                   For I inreverse 1..10 loop

                   执行语句…

                   Endloop;

                  End;

        

顺序控制语句:

①    goto语句

goto语句用于跳转到特定标号执行语句。注意由于使用goto语句会增加程序的复杂性,并使得应用程序可以读性变差,所以在做一般应用

                   开发时,建议不要使用goto语句。

                   setserveroutput on;

declare

i number :=1;

begin

  <>              

    loop

      dbms_output.put_line('i='||i);

      if i=12 then goto stop_goto;       --跳转到《stop_goto》

      end if;

      i:=i+1;

      if i=10 then goto start_goto;       --跳转到《start_goto》

      end if;

    end loop;

  <>

  dbms_output.put_line('循环结束');

end;

 

异常:

 

set serveroutoputon

declare

i number;

begin

i:=i/0;

exception

when Zero_divideTHEN dbms_output.put_line('不能初灵');

when other  dbms_output.put_line('不能初灵');--至少要带这一句

end;

 

         异常有(参考plsql官方文档)

 

自定义异常:

set serveroutputon

declare

i number:=9;

exp EXCEPTION;

begin

if(i>0) thenraise exp;

end if;

exception

when exp THENdbms_output.put_line('不能初灵');

end;

 

         异常处理作用 :可以给出捕获异常,给出明确提示。有时可以利用异常,来进行业务处理。

 

 

-存储过程方法:

set serveroutputon

create or replaceprocedure pro(参数…..) is   --- 可以带参数,outin  ,不带参数不加括号

v_enameemp.ename%type;

begin

select ename intov_ename from emp where empno=7839;

dbms_output.put_line(v_ename);

end;

exec  pro(参数……)

     块调用存储过程

setserveroutput on

declare

begin

  pro(参数);    ====  pro(参数名=>)      //这是名称表示法;    理解:名称表示法可以调动参数顺序如果先用名称表示法,后面则不能使用位置表示法

end;

JAVA调用存储过程方法 

---------------------------------------------------------------------------------------------       

         //调用存储过程的方法(没有返回值)

       Connection ct= null;

       PreparedStatement ps = null;

       try{

           Class.forName("oracle.jdbc.driver.OracleDriver");

           ct= DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","111111");

           ps = ct.prepareStatement("call pro1(?,?)");    //在使用前设好的函数    调用

           ps.setString(1, "SMITH");

           ps.setString(2, "1900");

           ps.execute();

       }catch(Exception e)

       {

           e.printStackTrace();

       }

----------------------------------------------------------------------------------------

                  

 

         //调用存储过程的方法(有返回值)

                   Connection ct = null;

       CallableStatement cs = null;

       try{

           Class.forName("oracle.jdbc.driver.OracleDriver");

           ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","111111");

           cs = ct.prepareCall("{call pro(?,?)}");

           cs.setString(1, "7839");

           cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);

           cs.execute();

           String s = cs.getString(2);

           System.out.println(s);

       }catch(Exception e){

           e.printStackTrace();

       }finally{

           try {

              ct.close();cs.close();

           } catch (SQLException e) {

              // TODO Auto-generatedcatch block

              e.printStackTrace();

           }

          

       }

-------------------------------------------------------------------------------------------------------------------------------------------------------------

//调用存储过程的方法(返回结果集)

--在包里面定义一个游标类型

set serveroutput on

create or replace package pack_type_cursor is

  type t_cur is ref cursor;

end;

 

--创建过程

create or replace procedure pro_java(in_deptno in number, result_cur outpack_type_cursor.t_cur) is

begin

  open result_cur for select * fromemp where deptno=in_deptno;

end;

 

----java中调用过程

 

  cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);

     rs = (ResultSet) cs.getObject(2);

  while(rs.next())

  {

     System.out.println(rs.getString("ename")+" "+rs.getString("sal"));

  }

        

 

-------------------------------------------------

         --分页查询返回结果集

         --在包内定义一个游标

set serveroutput on

create or replace package pack_type_cursor is

  type t_cur is ref cursor;

end;

 

         ---oracle创建过程

                   create orreplace procedure pro_fenye(num_1 in number, num_2 in number, rs_cur outpack_type_cursor.t_cur) is

v_start number;

v_end number;

v_sqlvarchar2(1000);

--v_curpack_type_cursor.t_cur%type;

begin

    v_start:= num_1;

    v_end:=num_2+v_start;

  

    v_sql:='select * from(select t1.* from(select rownum rn1,e.* from emp e)t1 where rn1>='|| v_start||')wherern1<'|| v_end;

    open rs_cur for v_sql;

end;

        

                   --JAVA调用

                   Connection ct = null;

       CallableStatement cs = null;

       ResultSet rs =null;

       try{

           Class.forName("oracle.jdbc.driver.OracleDriver");

           ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","111111");

           cs = ct.prepareCall("{call pro_fenye(?,?,?)}");

           cs.setInt(1, 1);

           cs.setInt(2, 5);

           cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);

           cs.execute();

           rs = (ResultSet) cs.getObject(3);

//         System.out.println("aaaaaa");

           while(rs.next())

           {

              System.out.println(rs.getString("empno")+" "+rs.getString("ename")+" "+rs.getString("sal"));

           }

       }catch(Exception e)

       {

           e.printStackTrace();

       }finally{

           try {

              ct.close();

              rs.close();

           rs.close();

           } catch (SQLException e) {

              // TODO Auto-generatedcatch block

              e.printStackTrace();

           }

          

       }

 

 

------------------------------------------------------------------------------

函数:

         函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据

 

例:

set serveroutputon

create or replacefunction fun(in_ename varchar2(20)) return number is

v_sal number;                                 --返回类型

begin

  select sal*12 into v_sal from emp whereename=in_ename;

  return v_sal;               --返回函数

end;

 

selectfun('SMITH')from dual;   --调用函数

 

 

java调用函数的方法:

         Connection ct = null;

       PreparedStatement ps =null;

       ResultSet rs= null;

       try{

           Class.forName("oracle.jdbc.driver.OracleDriver");

           ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","111111");

          

           String sql = "selectfun('SMITH')from dual";

           ps = ct.prepareStatement(sql);

           rs = ps.executeQuery();

           if(rs.next())

           {

              System.out.println(rs.getDouble(1));

           }

       }catch(Exception e){

           e.printStackTrace();

       }

 

 

触发器:

 

条件谓词:inserting   updating deleting;

 

 

create tabledata_tri_ename(who varchar2(30), action varchar(10), times DATE);            //先创建一张记录数据的表

 

//在对emp表设置触发器 , 如果对emp表使用了增删改,则会把数据发送给data_tri_ename表中

create or replacetrigger tri_ename before insert or update or delete on scott.emp 

declare

v_actionvarchar2(10);

begin

if inserting THENv_action:='insert';                                                          //inserting、updating、deleting相当于是系统函数,系统会自动识别;

  elsif updating THEN v_action:='update';

  elsif deleting THEN v_action:='delete';

  end if;

insert into data_tri_ename values(user, v_action,sysdate );                      //scott用户操作这个emp表则:user是scott    时间是系统时间;

end;

insert intoemp(empno,ename)values(1234,'2500') ;                                 //操作emp表

select * fromdata_tri_ename;

desc  data_tri_ename;                                                                  //查看表的结构;

 

----------------------------------  :new的使用方法    只对insertupdate可行

                   --先创建一个表

create tabletri_table(t_id number,t_name varchar2(10)); 

--再创建一个序列

create sequenceseq;

--在创建一个触发

create or replacetrigger tri_emp3 before insert or update of t_id on tri_table

for each row

begin

  select seq.nextval into :new.t_id from dual;                  -- 将序列号 的值赋值给t_id字段

end;

 

insert intotri_table(t_name) values('fs12fsf');    --插入

select * fromtri_table;                                           --查看这个表

                  

---------------------------   :out的使用方法   只能对deleteupdate可行

 

create or replacetrigger tri_emp3 before delete or update of t_id on tri_table

for each row

declare

v_ntri_table.t_id%type;

begin

  select :old.t_id into v_n from dual;

 -- select seq.nextval i

  dbms_output.put_line();

end;

 

 

------------------------------------------------------------------------------------------:new   :old 的用法

create tabletri_emp_tab(who varchar2(20), action varchar2(20), eid emp.empno%type, enameemp.ename%type);

desc tri_emp_tab;

 

create or replace triggertri_tab before update or insert on emp for each row

declare

v_actiontri_emp_tab.action%type;

begin

  if inserting THEN v_action:='insert';

  elsif updating THEN v_action:='update';

  end if;

  insert into tri_emp_tabvalues(user,v_action,:new.empno,:new.ename);

end;

 

insert into emp(empno,ename)values(1345,'a4sd5h');

 

 

create or replace triggertri_tab_old before delete or update on emp for each row

declare

v_actiontri_emp_tab.action%type;

begin

  if inserting THEN v_action:='delete';

  elsif updating THEN v_action:='update';

  end if;

  insert into tri_emp_tabvalues(user,v_action,:old.empno,:old.ename);

end;

 

         系统触发器:

                   系统事件是指基于oracle事件所建立的触发器通过使用系统事件触发器,提供了跟踪或是数据库变化的机制。

                            Ora_client_ip_address                      //返回客户端的ip

                            Ora_database_name                        //返回数据库名

                            Ora_login_suer                            //返回登陆用户名

                            Ora_sysevent                             //返回触发器的系统事件名

                            Ora_des_encrypten_password               //返回用户des(md5)加密后的密码

                  

例子:

                   create or replace trigger tri_sys after[before]  logon [logoff]ondatabase

begin

  insert intotri_login_logoff(username,logingdate) values(user,sysdate);

end;

 

 

 

 

 

 

 

 

 

Rrecord记录:

set serveroutputon

create or replaceprocedure pro(num in number) is       //过程

type v_type isrecord(

  v_ename  emp.ename%type,

  v_job  emp.job%type,

  v_sal  emp.sal%type

);

v_value  v_type;    //定义变量  跟记录变量一样的类型

begin

  select ename,job,sal  into v_value  from  emp  where empno=num;

  dbms_output.put_line('员工:'||v_value.v_ename||'职位'||v_value.v_job||' 工资'||v_value.v_sal);

end;

 

exec pro(7839);      //执行语句

 

 

包、包体:

         ------------------------------------------------------------声明部分:如果不声明,则无法调用,必须声明;

create or replacepackage pack_test is

functionfun1(fun_empno number) return varchar2;

procedurepro1(pro_empno number);

end;

         -------------------------包体-------------------------------------------  包体部分

create or replacepackage body pack_test is

procedurepro1(pro_empno number) is

v_enameemp.ename%type;            --定义类型

begin

    select ename into v_ename from emp whereempno=pro_empno;

    dbms_output.put_line(v_ename);

end;

functionfun1(fun_empno number) return varchar2 is

fun_enameemp.ename%type;                   --定义类型

begin

  select  ename  into fun_ename from emp where empno=fun_empno;

  return fun_ename;

end;

end;

----------------------执行--------------------------------------

set serveroutputon

execpack_test.pro1(7839);

 

 

 

参照变量:

         参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同对象

从而降低占用的空间。在编写ps/sql程序是,可以使用游标变量和对象变量两种参照变量类型

 

 

 

 

导出表:

         执行语句在dos命令窗口下执行:

         Exp userid=用户名/密码@数据库实例名 tables=(表1,表2..)file=备份路径;

        

导出表的结构:

         Exp userid=用户名/密码@数据库实例名 tables=(表1,表2..)file=备份路径 rows=n;

 

导出方案:

         Exp 用户名/密码@数据实例名 owner=所有者 file=备份路径

 

 

 

闪回:

        

查看scn:

selectsysdate,timestamp_to_scn(sysdate) from dual

修改可以闪回表的时间:

alter system setundo_retention=1200 scope=both

Scope的值:Memory只改数据库、spfile只改参数文件和both两者都改

 

 

 

闪回案例:

•       执行表的闪回,需要flashback anytable的权限

•       create tablet_haoren(tid number,tname VARCHAR2(20) );

•       insert intot_haoren values(1,'haoren');

•       insert intot_haoren values(2,'haoren2');

•       insert intot_haoren values(3,'haoren3');

•       commit

•       SELECT *from  t_haoren;

•       一定要把回退的scn记录下来

•       select sysdate,timestamp_to_scn(sysdate) from dual;

•       delete fromt_haoren where tid=2;

•       commit

•       回退之前一定要让表可以行移动

•       alter tablet_haoren enable row movement;

•       回退

•       flashback tablet_haoren to scn 2157577;

 

 

 

 

•         `闪回删除的案例:

•      删除表

•      drop table t_haoren;

•      显示回收站

•      show recyclebin;

•      将回收站中的表闪回

•      flashback table t_haoren to before drop;

•      再删除表

•       drop tablet_haoren;

•      用回收站中的对象闪回

•      flashback table"BIN$1RvfPcV3TUqHiGdfwapWuw==$0" to before drop

 

 

 

 

 

1.实体权限:某种权限对其它用户的表或视图的存取权限(select,update,insert,alert,index,delete,allall包括所有权限
2.
系统权限分类:是对用户而言的
 
1DBA:拥有全部的特权,是系统的最高权限,只有DBA才可以创建数据库结构
 
2resource:拥有Resource权限的用户可以创建实体,不可以创建数据可结构
 
3connect:拥有Connect权限的用户可以登录Oracle,不可以穿件实体,不可以创建数据可结构
 
对于普通用户:授予connectresource权限
 
授权命令SQL>grant connect/resource/dba to 用户名
 
系统权限用户只能由DBA用户授出:即 systemsys 默认密码分别是 managerchange_on_install
 
例子如A授予B create table的系统权限B又给了C然后A收回B但是C不被收回(grant create table to B with grantoption)(revoke create table from B
  DBA
授予用户的实体权限也可以回收 revoke select on scott.emp from 小明;
 
普通用户可以通过授权有system权限但是永远也不能达到和sys用户有相同的权限
注意:系统权限无级联:当A授权给B系统权限且同时授权给它可以给其它用户授权时,B授权了CA收回B的系统权限时C不被仍有该系统权限
     
实体权限有级联:相反当用户A授权B实体权限时,A收回B的权限C的权限也被收回

你可能感兴趣的:(oracle笔记大全)