FW:Oracle之PL/SQL学习笔记

看到一个关于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;

  

FW:Oracle之PL/SQL学习笔记

上一篇:安装oracle需注意的地方


下一篇:本地数据库的导入及遇到的问题