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;

  

时间: 2024-08-02 03:49:51

FW:Oracle之PL/SQL学习笔记的相关文章

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D

Oracle之PL/SQL学习笔记之数据类型(三)

Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分. 1. Oracle预定义的普通数据类型(常见的数据类型) 类型 子类 说明 Oracle中的范围 char Character,String Rowi

Oracle之PL/SQL学习笔记之序言(一)

1. PL/SQL是什么? PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断.循环等操作实现复杂的功能或者计算.PL/SQL 只有 Oracle 数据库有. 2. PL/SQL的优点 1. 提高应用程序的运行性能 传统的java程序传递sql到Oracle服务器

PL/SQL学习笔记_01_基础

PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行 在SQL窗口中运行步骤同 SQL语句 在command  窗口中运行的步骤如下: 1)File—new command window,出现下图 2)输入命令:set serveroutput on    ,回车执行 作用:开启输出服务 3)输入命令:ed   ,回车执行 作用:打开PL/SQL文本编辑器,可以在此文本编辑器中写PL/SQL语句 4)输入命令:/   ,回车执行 作用:执行PL/SQL语句 1

PL/SQL学习笔记_03_存储函数与存储过程

ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. 存储函数:有返回值,创建完成后,通过select function() from dual;执行 存储过程:由于没有返回值,创建完成后,不能使用select语句,只能使用pl/sql块执行 一.存储函数 1.存储函数语法格式 CREATE [OR REPLACE] FUNCTION function_name [ (argment [ { IN | IN OUT } ] Type, a

PL/SQL学习笔记之基本块格式与语法

一:PL/SQL程序块 PL/SQL是一种块结构的语言,一个PL/SQL程序就是一个 代码逻辑块. PL/SQL程序由三部分构成: 1 声明 部分 使用关键字DECLARE开头,它是一个可选的部分,用于声明与赋初值在该程序中使用的  所有变量,游标,子程序,和其他元素. 2 可执行命令 部分 使用关键字BEGIN和END包裹,必须有.定义了一系列 PL/SQL语句  . 3 异常处理 部分 使用关键字EXCEPTION,可选,用于处理可执行命令部分捕获的异常. 二:基本格式 DECLARE <d

Pl/sql学习笔记2

? -- declare type vsal_table is table of emp.sal%type; a vsal_table; begin --必须得初始化 并且有数量上的区分 从一开的 a:=vsal_table(1000,2000,30000); dbms_output.put_line(a(1)); end; ? ? --使用嵌套表的案例 --定义一个类型 create type stu_name is table of varchar2(20); ? create table

FW:Oracle之PL/SQL 时间转换

CREATE OR REPLACE FUNCTION TTD(V_DATE NUMBER) RETURN VARCHAR2 IS RESULT VARCHAR(100); BEGIN SELECT TO_CHAR(TO_DATE('1970-1-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss') + V_DATE / 3600 / 24 + 8 / 24, 'yyyy-mm-dd hh24:mi') INTO RESULT FROM DUAL; RETURN(RESULT