看到一个关于Oracle系列文章,基本集中在一些基础知识的汇总。 比较适合新员工培训和知识汇总回顾。记录之前不了解或者不确定的知识
http://my.oschina.net/KingPan/blog?catalog=504011
1、得到序列的下一个值或当前值
select your_sequence.nextval from dual;--获得序列your_sequence的下一个值 select your_sequence.currval from dual;--获得序列your_sequence的当前值
2、用户管理、别名管理、权限管理
--创建用户给其一个密码(必须给其一个密码) create user king IDENTIFIED by king; --创建的新用户要给其权限 grant connect to king; grant resource to king; --给用户scott解锁 alter user scott account unlock ; --把用户锁住 alter user scott account lock; --给用户scott修改密码 alter user scott IDENTIFIED by tarena123;
1. 定义同义词 --定义一个公有的别名 scott.emp ----> emp create orreplace synonym emp for scott.emp; 2.删除同义词: drop synonym table_name; 3.查看所有同义词: select * from dba_synonyms;
-- 表操作的权限 grant select on emp to jsd1404; -- 表操作收回权限 revoke select on emp from jsd1404; -- 对用户操作的权限: grant connect to king;--给用户授予连接的权限 grant resource to king;--给用户king授予 所有资源的权限 -- 对存储过程的权限: grant create procedure to jsd1404;--授予创建存储过程的权限 grant execute procedure_name to jsd1404;--授予执行某个存储过程的权限 --对表空间操作的权限: grant create tablespace to jsd1404; --授予可以创建tablespace 的权限 grant alter tablespace to jsd1404;--授予可以修改tablespace 的权限
3、decode case..when
-- decode , select id, decode(sex,1,‘男‘,2,‘女‘,‘未知‘) from t1; -- case when select id, case sex when 1 then ‘男‘ when 2 then ‘女‘ else ‘未知‘ end from t1;
4、table的管理
-- 修改表 create table king_test( c1 number(4), c2 number(7,-2) ); --增加列 alter table king_test add c3 number(5); --修改列 alter table king_test modify c3 varchar2(10); --删除列 alter table king_test drop column c3; -- 删表 drop table [表名] ;--删除表,表放在回收站 drop table [表名] purge; --删除表,不放入回收站 drop table [表名] cascade constraints/constraint; 删除级联表,不受级联约束 -- 闪回(回滚) FLASHBACK TABLE [表名] TO BEFORE DROP;
5、ROW_NUMBER()
例如:请用一条sql语句查询出scott.emp表中每个部门工资前三位的数据
SELECT DEPTNO, MAX(SAL) 第一名, MAX(DECODE(T, 2, SAL)) 第二名, MIN(SAL) 第三名 FROM (SELECT SAL, DEPTNO, T FROM (SELECT EMPNO, ENAME, SAL, ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) T, DEPTNO FROM EMP) E WHERE E.T <= 3) GROUP BY DEPTNO;
6、%type、record
-- type declare c_ename constant varchar2(50):=‘KING‘; v_job emp.job%type; ----------------------------------------------- --备注:通过雇员姓名查找雇员的职称 ----------------------------------------------- begin select job into v_job from emp where ename=c_ename; dbms_output.put_line(‘雇员‘||c_ename||‘的职称为:‘||v_job); end; -- record(记录类型) declare type emp_record is record( job emp.job%type,--职称 deptno emp.deptno%type --部门编号, 多个用, 隔开 ); -- 定义record类型 v_emp_record emp_record; --定义一个record类型的变量 begin select job,deptno into v_emp_record from emp where empno=7788; dbms_output.put_line(‘雇员职称:‘||v_emp_record.job||‘雇员部门编号:‘||v_emp_record.deptno); end;
7、使用BULK COLLECT 和FOR 语句的游标
declare cursor emp_cursor is select * from emp; type emp_tab is table of emp%rowtype; v_emp_tab emp_tab; begin open emp_cursor;--打开游标 loop fetch emp_cursor bulk collect into v_emp_tab limit 5;--使用limit显示一次取得记录数 for i in 1 .. v_emp_tab.count loop dbms_output.put_line(‘雇员编号:‘||v_emp_tab(i).empno||‘,雇员姓名:‘||v_emp_tab(i).ename); end loop; exit when emp_cursor%notfound; end loop; end;
7、异常
declare c_deptno number:=10;--一个不存在的员工编号 v_name emp.ename%type;--员工姓名 begin select ename into v_name from emp where deptno=c_deptno; exception when too_many_rows then dbms_output.put_line(‘期望返回一条记录,实际返回多条记录‘); when no_data_found then dbms_output.put_line(‘不存在雇员编号为:‘||c_empno||‘的雇员‘); end;
8、函数
-- nvl函数: create or replace function my_nvl(val object,val2 object) return object is begin if val is null then return val2; else return val; end if; end; -- 查看函数或存储过程的脚本: select name,line,text from user_source where name=upper(‘函数或存储过程的名称‘);
9、包PACKAGE
1、包分公有、私有
2、子程序的重载
CREATE OR REPLACE PACKAGE demo_pack1 IS DeptRec dept%ROWTYPE; FUNCTION query_dept(dept_no IN NUMBER) RETURN INTEGER; FUNCTION query_dept(dept_no IN VARCHAR2) RETURN INTEGER; END demo_pack1;
注意1:如果两个子程序的参数只是名称和方式不同时,不能重载他们。
例:PROCEDURE OverlodeMe(P_parameter in number)
PROCEDURE OverlodeMe(P_parameter out number)
注意2:不能只根据两个函数的返回类型进行重载
例:FUNCTION Overlodeme RETURN date
FUNCTION Overlodeme RETURN boolean
10、触发器
CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...] ON [schema.]table_name | [schema.]view_name [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}] [FOR EACH ROW ] [WHEN condition] PL/SQL_BLOCK | CALL procedure_name; -- 例如 CREATE OR REPLACE TRIGGER TR_DEL_EMP BEFORE DELETE --指定触发时机为删除操作前触发 ON SCOTT.EMP FOR EACH ROW --说明创建的是行级触发器 BEGIN --将修改前数据插入到日志记录表 emp_his ,以供监督使用。 INSERT INTO EMP_HIS (DEPTNO, EMPNO, ENAME, JOB, MGR, SAL, COMM, HIREDATE) VALUES (:OLD.DEPTNO, :OLD.EMPNO, :OLD.ENAME, :OLD.JOB, :OLD.MGR, :OLD.SAL, :OLD.COMM, :OLD.HIREDATE); END;