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 30和set 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 --- 可以带参数,out,in ,不带参数不加括号
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的使用方法 只对insert、update可行
--先创建一个表
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的使用方法 只能对delete、update可行
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,all)all包括所有权限
2.系统权限分类:是对用户而言的
(1)DBA:拥有全部的特权,是系统的最高权限,只有DBA才可以创建数据库结构
(2)resource:拥有Resource权限的用户可以创建实体,不可以创建数据可结构
(3)connect:拥有Connect权限的用户可以登录Oracle,不可以穿件实体,不可以创建数据可结构
对于普通用户:授予connect,resource权限
授权命令SQL>grant connect/resource/dba to 用户名
系统权限用户只能由DBA用户授出:即 system,sys 默认密码分别是 manager和change_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授权了C当A收回B的系统权限时C不被仍有该系统权限
实体权限有级联:相反当用户A授权B实体权限时,A收回B的权限C的权限也被收回