文档章节

oracle 编程基础笔记

淡漠Vip
 淡漠Vip
发布于 2017/09/07 16:00
字数 1343
阅读 5
收藏 0

 

游标函数过程

作者: itdreamlmc@163.com

游标的使用步骤

1)定义游标   cursor 游标名称[(参数列表)] is 子查询语句

cursor mysor is select * from emp;

2)打开游标   open 游标名称

  open mysor;

3)取数据      fetch 游标名称 into 变量名称,.....

fetch mysor into rowdatas;

4)关闭游标  close 游标名称

close mysor;

游标遍历查询实例:

declare

cursor mysor is select * from emp;

rowdatas emp%rowtype;

begin

  open mysor;

  loop

       fetch mysor into rowdatas;

            dbms_output.put_line(rowdatas.ename||'---'||rowdatas.job||'---'||rowdatas.sal);

       exit when mysor%notfound;

  end loop;

  close mysor;

end;

 

存储函数

作者: itdreamlmc@163.com

函数的创建语法:

create [or replace] function 函数名[(参数名 in|out 参数类型,......)] return 返回数据类型 is|as 

begin

     函数体   

     return 结果变量;

end;

实例:使用存储函数来查询指定员工的年薪

--定义存储函数

create or replace function getsalbyempno(v_empno in number) return number

is

v_sum number;

begin

  select sal*12 into v_sum from emp where empno=v_empno;

  return v_sum;

end;

--调用函数

select getsalbyempno(7902) from dual;

带多个返回值的存储函数

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

实例:定义一个可以查询指定员工的年薪与工作的函数

--定义存储函数

create or replace function getbyempno(v_empno in number,v_job out varchar2) return number

is

v_sum number;

begin

  select sal*12,job into v_sum,v_job from emp where empno= v_empno;

  return v_sum;

end;

--定义测试函数

 

返回游标 类型的函数:

实例:查询指定部门的所有员工工作:

--定义函数

create or replace function findAllJobbydeptno(v_deptno in number) return sys_refcursor

is

mycursor sys_refcursor;

begin

  open mycursor for select job from emp where deptno=v_deptno;

  return mycursor;

end;

--测试函数

select findAllJobbydeptno(20) from dual;

 

触发器

作者: itdreamlmc@163.com

 

触发器的作用

  1. 数据确认
    • 实例:员工涨后的工资不能少于涨前的工资
  2. 实施复杂的安全性检查
    • 实例:进制在非工作时间插入新想员工
  3. 做审计
  4. 数据的备份和同步

触发器的类型

  1. 语句级触发器:
    1. 在指定的操作语句之前或者之后执行一次,不管这条语句影响了多少行。
  2. 行级触发器(for each row)
    1. 触发语句作用的每一条记录都被触发。在行触发器中使用old和new伪记录变量,识别值的状态

定义触发器的语法:

create [or replace] trigger 触发器名 {before|after}

{delete|insert|update[of 列名]}

on 表名

[for each row [when(条件)]]

declare

     ........

begin

     PLSQL块

end 触发器名;

在触发器中触发语句与伪记录值:

范例:插入一个员工后打印一句话“一个新的员工插入成功”

--定义触发器

create or replace trigger trigger_emp after insert on emp

declare



begin

  dbms_output.put_line('一个新的员工插入成功');

end;

--测试触发器

insert into emp values(7878,'tom','CLERK',7782,sysdate,1600,null,20);

 

范例:修改员工薪资之前,判断修改之后是否增加!

 

----------------------------------触发器:员工修改员工薪资判断-------------------------------

create or replace trigger trigger_emp_sal before update on emp for each row

declare

begin

     if :old.sal>:new.sal then raise_application_error(-20002,'修改后的薪资小于修改前薪资');

     end if;

end;

--测试

select * from emp;

update emp set sal=77 where empno=7878;

 

范例:触发器实现序列自动 增加

--定义测试表

create table test1(

   id number(11) primary key,

   username varchar(30)

);

--定义序列

create sequence myseq;

--定义触发器

create or replace trigger trigger_test1_autoincrement before insert on test1 for each row

declare

begin

  select myseq.nextval into :new.id from dual;

end;

--测试触发器

insert into test1(username) values('jack');

select * from test1;

 

存储过程和存储函数的区别

作者: itdreamlmc@163.com

 

存储过程和存储函数的区别:

一般来讲,过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。但过程和函数都可以通过out指定一个或多个输出参数。我们可以利用参数,在火车和函数中实现返回多个值。

 

 

存储过程

作者: itdreamlmc@163.com

 

创建存储过程语法:

create [or replace] procedure 过程名[(参数名 in|out 数据类型,....)]

AS|IS

变量的定义声明部分....

begin

     PLSQL子程序体

end  [过程名];

实例:给指定员工涨100工资,并打印涨之前和之后的工资

 

--定义创建过程

create or replace procedure addSal(v_empno in number)

AS

v_old_sal emp.sal%type;

v_new_sal emp.sal%type;

begin

  select sal into v_old_sal from emp where empno=v_empno;

  update emp set sal=sal+100 where empno=v_empno;

  select sal into v_new_sal from emp where empno=v_empno;

  dbms_output.put_line('涨之前工资为:'||v_old_sal||' 涨之后工资:'||v_new_sal);

end;

--调用定义过程

call addSal(7369);

 

定义带返回数据的过程:

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

实例:查询指定员工的年薪

 

--定义过程

create or replace procedure findSalByempno(v_empno in number,v_annousal out number)

AS

begin

  select sal*12 into v_annousal from emp where empno=v_empno;

end;

--定义存储工程

declare

v_sum number;

begin

  findSalByempno(&num,v_sum);

  dbms_output.put_line('该员工年薪为:'||v_sum);

end;

 

PLSQL中的异常exception

作者: itdreamlmc@163.com

 

异常分类

  1. 系统异常
  2. 自定义异常

系统异常

  1. no_data_found  没有查询到数据
  2. too_many_rows 查询的结果数量大
  3. zero_divide 被0整除
  4. value_error 类型错误
  5. timeout_on_resource 处理超时
  6. others 其他错误

异常实例:


declare

v_ename emp.ename%type;

v_num1 number(11) :=0;

v_num2 number(11) :=12;
begin

--数据未找到 select ename into v_ename from emp where empno=73693;

--数据结果太多 select ename into v_ename from emp where deptno=20;

--0不能作为除数  v_num1:=v_num2/v_num1;

--数据类型错误 select ename into v_num1 from emp where empno=7369;



exception

  when too_many_rows then  dbms_output.put_line('数据太多');

  when no_data_found then dbms_output.put_line('没有查询到数据');

  when zero_divide then dbms_output.put_line('0不能作为除数');

  when value_error then dbms_output.put_line('数据类型错误');

  when others then  dbms_output.put_line('其他错误');

end;

 

 

 

© 著作权归作者所有

共有 人打赏支持
淡漠Vip
粉丝 0
博文 7
码字总数 2464
作品 0
程序员
SAS学习笔记

SAS编程语言 学习一门语言重要的是打好语法基础,所以,从最基础的开始。 逻辑库是SAS编程语言的一个重要知识点,是数据步和过程步读取数据集或关系数据库中的表或者存储路径下对应文件的桥梁...

开拓者-2017
2015/12/24
69
2
Oracle笔记 目录索引

Oracle笔记 一、oracle的安装、sqlplus的使用 Oracle笔记 二、常用dba命令行 Oracle笔记 三、function 、selectOracle笔记 四、增删改、事务 Oracle笔记 五、创建表、约束、视图、索引、序列...

ibm_hoojo
2011/05/03
0
0
【目录】Linux 环境C/C++ 开发笔记,持续更新

C++ 知识要点: 计算机经典书籍 收藏,不断更新..... http://990487026.blog.51cto.com/10133282/1876827 【平台搭建】 编程语言排行榜: http://www.tiobe.com/tiobe_index?page=index QT w...

990487026
2016/05/18
0
0
Spring.NET学习笔记——目录(原)

目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔记2——环境搭建(基础篇) Level 200 Sprin...

长平狐
2012/06/11
887
1
Posix多线程编程学习笔记

Posix多线程编程学习笔记(一)—线程基础(1) http://blog.chinaunix.net/u/22935/showart310711.html Posix多线程编程学习笔记(一)—线程基础(2) http://blog.chinaunix.net/u/22935/...

晨曦之光
2012/04/13
163
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部