Oracle中的游标和函数详解

 Oracle中的游标和函数详解

1.游标

游标是一种 PL/SQL 控制结构;可以对 SQL 语句的处理进行显示控制,便于对表的行数据

逐条进行处理。 游标并不是一个数据库对象,只是存留在内存中。

操作步骤:

声明游标
   打开游标

取出结果,此时的结果取出的是一行数据

关闭游标 到底那种类型可以把一行的数据都装进来

此时使用 ROWTYPE 类型,此类型表示可以把一行的数据都装进来。 例如:查询雇员编号为 7369 的信息(肯定是一行信息)。

例:查询雇员编号为 7369 的信息(肯定是一行信息)。

DECLARE
  eno emp.empno%TYPE ;
  empInfo emp%ROWTYPE ;
BEGIN
  eno := &en ;
  SELECT * INTO empInfo FROM emp WHERE empno=eno ;
  DBMS_OUTPUT.put_line('雇员编号:'||empInfo.empno) ;
  DBMS_OUTPUT.put_line('雇员姓名:'||empInfo.ename) ;
END ;

使用 for 循环操作游标(比较常用)

DECLARE
  -- 声明游标
  CURSOR mycur IS SELECT * FROM emp where empno=-1;
  empInfo emp%ROWTYPE ;
  cou NUMBER ;
BEGIN
  -- 游标操作使用循环,但是在操作之前必须先将游标打开
  FOR empInfo IN mycur
  LOOP
    --ROWCOUNT 对游标所操作的行数进行记录
    cou := mycur%ROWCOUNT ;
    DBMS_OUTPUT.put_line(cou||'雇员编号:'||empInfo.empno) ;
    DBMS_OUTPUT.put_line(cou||'雇员姓名:'||empInfo.ename) ;
  END LOOP ;
END ;

我们可以看到游标FOR循环确实很好的简化了游标的开发,我们不在需要open、fetch和close语句,不在需要用%FOUND属性检测是否到最后一条记录,这一切Oracle隐式的帮我们完成了。

编写第一个游标,输出全部的信息。

DECLARE
  -- 声明游标
  CURSOR mycur IS SELECT * FROM emp ; -- 相当于一个List (EmpPo)
  empInfo emp%ROWTYPE ;
BEGIN
  -- 游标操作使用循环,但是在操作之前必须先将游标打开
  OPEN mycur ;
  -- 使游标向下一行
  FETCH mycur INTO empInfo ;
  -- 判断此行是否有数据被发现
  WHILE (mycur%FOUND)
    LOOP
      DBMS_OUTPUT.put_line('雇员编号:'||empInfo.empno) ;
      DBMS_OUTPUT.put_line('雇员姓名:'||empInfo.ename) ;
      -- 修改游标,继续向下
      FETCH mycur INTO empInfo ;
    END LOOP ;
END ;

也可以使用另外一种方式循环游标:LOOP…END LOOP;

DECLARE
  -- 声明游标
  CURSOR mycur IS SELECT * FROM emp ;
  empInfo emp%ROWTYPE ;
BEGIN
  -- 游标操作使用循环,但是在操作之前必须先将游标打开
  OPEN mycur ;
  LOOP
    -- 使游标向下一行
    FETCH mycur INTO empInfo ;
    EXIT WHEN mycur%NOTFOUND ;
    DBMS_OUTPUT.put_line('雇员编号:'||empInfo.empno) ;
    DBMS_OUTPUT.put_line('雇员姓名:'||empInfo.ename) ;
  END LOOP ;
END ;

注意 1: 在打开游标之前最好先判断游标是否已经是打开的。

通过 ISOPEN 判断

格式:

游标%ISOPEN IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ; 

注意 2:可以使用 ROWCOUNT 对游标所操作的行数进行记录。

DECLARE
  -- 声明游标
  CURSOR mycur IS SELECT * FROM emp ;
  empInfo emp%ROWTYPE ;
  cou NUMBER ; BEGIN
  -- 游标操作使用循环,但是在操作之前必须先将游标打开
  IF mycur%ISOPEN THEN
    null ;
  ELSE
    OPEN mycur ;
  END IF ;
  LOOP
    -- 使游标向下一行
    FETCH mycur INTO empInfo ;
    EXIT WHEN mycur%NOTFOUND ;
    cou := mycur%ROWCOUNT ;
    DBMS_OUTPUT.put_line(cou||'雇员编号:'||empInfo.empno) ;
    DBMS_OUTPUT.put_line(cou||'雇员姓名:'||empInfo.ename) ;
  END LOOP ;
END ;

2.函数

函数就是一个有返回值的过程。

定义一个函数:此函数可以根据雇员的编号查询出雇员的年薪

CREATE OR REPLACE FUNCTION myfun(eno emp.empno%TYPE)
  RETURN NUMBER AS rsal NUMBER ;
BEGIN
  SELECT (sal+nvl(comm,0))*12 INTO rsal FROM emp WHERE empno=eno ;
  RETURN rsal ;
END ;

直接写 SQL 语句,调用此函数:

SELECT myfun(7369) FROM dual ;

写一个函数  输入一个员工名字,判断该名字在员工表中是否存在。存在返回 1,不存在返回 0

create or replace function empfun(en emp.ename%type)
  return number as is_exist number;
begin
  select count(*) into is_exist from emp where ename=upper(en);
  return is_exist;
end;

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Oracle存储过程、包、方法使用总结(推荐)

    Oracle存储过程.包.方法使用总结,具体代码如示: /** *@author:zhengwei *@date:2017-04-28 *@desc:存储过程用法总结 */ CREATE OR REPLACE PROCEDURE MYPROCEDURE(P_ID IN VARCHAR, P_STATUS OUT VARCHAR) --P_ID为输入参数 ,P_STATUS为输出参数 AS ---变量声明 T_STATUS VARCHAR2(20); T_ID NUMBER; V_POSTYPE

  • win10 oracle11g安装报错问题集合 附解决方法

    本文实例为大家分享了oracle11g安装报错的原因,和对应的解决方法,供大家参考,具体内容如下 注册ocx时出现ole初始化错误或OCX加载错误 问题原因:安装文件不能放在包含空格的文件夹名字中 解决办法:oracle安装的时候最好安装在盘符的根目录下,不要使用中文 ora-00922(缺少或无效选项) 问题原因:配置管理员密码时,采用了数字开头的密码 解决办法:将密码改为英文开头(配置密码时,需要数字.大写英文.小写英文) [ins-32025]所选安装与指定oracle主目录中已安装软件冲

  • Oracle 如何规范清理v$archived_log记录实例详解

    Oracle 如何规范清理v$archived_log记录实例详解 单机实例上面,v$archived_log 很多,有上万条记录了,所以得清理一下,不然每次查询都直接滚屏幕了 SQL> select sequence#,applied from v$archived_log order by sequence# ; SEQUENCE# APPLIED .................... SEQUENCE# APPLIED ---------- --------- 9376 NO 9377

  • oracle创建表空间、授权、创建用户、导入dmp文件

    oracle创建表空间,授权,创建用户,导入dmp文件,具体详解如下所示: 1.创建表空间 Create tablespace bpm datafile 'D:\ORACLE11\ORADATA\ORCL\BPM.DBF' size 400M autoextend on Create tablespace lyoa datafile 'D:\ORACLE11\ORADATA\ORCL\LYOA.DBF' size 400M autoextend on Create tablespace kdb

  • Oracle解析复杂json的方法实例详解

    问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析.如此一来导致即便可以在PL/SQL中调用远程接口,但返回结果仍需传给前台js或java等其它代码进行处理,不太方便. 分析思路: 1.在PL/SQL中写json串,无需声明json对象,只需直接拼接成格式正确的json字符串即可,因此数据库对象间json串的传递完全可以用varchar2或clob来代替

  • oracle获取当前时间,精确到毫秒并指定精确位数的实现方法

    oracle获得当前时间的,精确到毫秒   可以指定精确豪秒的位数 select to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff ') from dual;--20120516 11:56:40.729083 select to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff3') from dual;--20120516 11:58:42.755 desc ct_cdr_comparison 名称        

  • Linux静默安装Oracle11g部分问题的解决方法

    这次试了试使用静默安装Oracle,过程比较麻烦,好在有文档帮助,但是由于自己的粗心导致了各种奇葩问题,记录下来. 进行静默安装数据库 $ORACLE_HOME/bin/dbca -silent -responseFile /home/oracle/etc/dbca.rsp 出现问题: [oracle@bogon ~]$ $ORACLE_HOME/bin/dbca -silent -responseFile /home/oracle/etc/dbca.rsp Exception in threa

  • Oracle连接远程数据库的四种方法

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍 第一种方法: 若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了. 不过要注意环境变量%ORACLE_HOME%/network/admin/是否设置. 第二种方法: 本机未安装oracle服务器,也未安装oracle客户端.但是安装了pl sql development.toad sql development.sql navigat

  • Oracle中的游标和函数详解

     Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操作步骤: 声明游标    打开游标 取出结果,此时的结果取出的是一行数据 关闭游标 到底那种类型可以把一行的数据都装进来 此时使用 ROWTYPE 类型,此类型表示可以把一行的数据都装进来. 例如:查询雇员编号为 7369 的信息(肯定是一行信息). 例:查询雇员编号为 7369 的信息(肯定是一

  • Oracle中instr和substr存储过程详解

    instr和substr存储过程,分析内部大对象的内容 instr函数 instr函数用于从指定的位置开始,从大型对象中查找第N个与模式匹配的字符串. 用于查找内部大对象中的字符串的instr函数语法如下: dbms_lob.instr( lob_loc in blob, pattern in raw, offset in integer := 1; nth in integer := 1) return integer; dbms_lob.instr( lob_loc in clob char

  • jQuery3.0中的buildFragment私有函数详解

    时隔 3 个月,jQuery 团队终于发布了 3.0 Alpha 版本.有两个版本 jQuery compat 3.0 和 jQuery 3.0. jQuery compat 3.0 对应之前的 1.x, 兼容更多的浏览器,对于IE支持到 8.0 版本 jQuery 3.0 对应之前的 2.x,关注更新的浏览器,对于IE支持到 9.0 版本 此外, 3.0还增加了对 Yandex 浏览器的支持,一款来自俄罗斯的浏览器. 下面看下jQuery3.0中的buildFragment. 在 jQuery

  • 对pandas中Series的map函数详解

    Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然DataFrame还有apply()函数) 1.字典映射 import pandas as pd from pandas import Series, DataFrame data = DataFrame({'food':['bacon','pulled pork','bacon','Pastrami',

  • 对Python中plt的画图函数详解

    1.plt.legend plt.legend(loc=0)#显示图例的位置,自适应方式 说明: 'best' : 0, (only implemented for axes legends)(自适应方式) 'upper right' : 1, 'upper left' : 2, 'lower left' : 3, 'lower right' : 4, 'right' : 5, 'center left' : 6, 'center right' : 7, 'lower center' : 8,

  • 对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: #import itertools from itertools import * #最好使用时用上面那个,不过下面的是为了演示比较 常用的,所以就直接全部导入了 一.无限迭代器: 由于这些都是无限迭代器,因此使用的时候都要设置终止条件,不然会一直运行下去,也就不是我们想要的结果了. 1.coun

  • 对Tensorflow中的变量初始化函数详解

    Tensorflow 提供了7种不同的初始化函数: tf.constant_initializer(value) #将变量初始化为给定的常量,初始化一切所提供的值. 假设在卷积层中,设置偏执项b为0,则写法为: 1. bias_initializer=tf.constant_initializer(0) 2. bias_initializer=tf.zeros_initializer(0) tf.random_normal_initializer(mean,stddev) #功能是将变量初始化为

  • JavaScript中Array的filter函数详解

    目录 描述 理解 示例 原生实现 描述 filter为数组中的每个元素调用一次callback函数,并利用所有使得callback返回 true 或等价于 true 的值的元素创建一个新数组.callback只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用.那些没有通过callback 测试的元素会被跳过,不会被包含在新数组中. 理解 filter不会改变原数组,它返回过滤后的新数组. filter遍历的元素范围在第一次调用callback之前就已经确定了.在调用f

  • PostgreSQL中的日期/时间函数详解

    目录 零.前言 一.获取当前时间 二.时间的加减 三.格式化函数 3.1时间转字符串 3.2字符串转日期 3.3字符串转时间 3.4Unix时间戳转时间 四.一些重要函数 4.1时间间隔 4.2时间截取 五.时间的转换 六.收! 零.前言 公司里有一台阿里云RDS数据库用了PPAS(Postgres PlusTM Advanced Server),在处理日期/时间时遇到一些问题,花了点时间整理如下. 一.获取当前时间 select now() select current_timestamp s

  • C#函数式编程中的标准高阶函数详解

    何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的.只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内.那么我们就将这类函数叫做高阶函数.但是今天我们的标题并不是高阶函数,而是标准高阶函数,既然加上了这个标准,就意味着在函数式编程中有一套标准的函数,便于我们每次调用.而今天我们将会介绍三个标准函数,分别为Map.Filter.Fold.  Map 这个函数的作用就是将列表中的每项从A类型转换到B类型,并形成一个新的类型.下面我们可

随机推荐