Oracle存储过程:

语法:
CREATE [OR REPLACE] PROCEDURE procedure_name
(arg1 [mode1] datatype1,arg2 [mode2] datatype2,...)
IS [AS]
PL/SQL BLOCK;
mode用于指定输入输出参数:IN为输入参数,OUT为输出参数,当为输入参数时可以省去IN,OUT不能省去。
如果没有输入输出参数,可以省去
(arg1 [mode1] datatype1,arg2 [mode2] datatype2,...)这一行

一个带有输入,输出参数的简单的例子

  1. CREATE OR REPLACE PROCEDURE proc_in_out_test(var_empno NUMBER,
  2. var_ename OUT VARCHAR2) IS
  3. BEGIN
  4. SELECT ename INTO var_ename FROM emp WHERE empno = var_empno;
  5. EXCEPTION
  6. WHEN no_data_found THEN
  7. raise_application_error(-20000, '该员工不存在');
  8. END;

调用该过程

  1. SQL> var vempno number;
  2. SQL> var vename varchar2(10);
  3. SQL> exec :vempno:=7934;
  4. SQL> exec proc_in_out_test(:vempno,:vename);
  5. PL/SQL procedure successfully completed
  6. vename
  7. ---------
  8. MILLER
  9.  
  10. SQL> exec :vempno:=7935;
  11. SQL> exec proc_in_out_test(:vempno,:vename);
  12.  
  13. begin proc_in_out_test(:vempno,:vename); end;
  14.  
  15. ORA-20000: 该员工不存在
  16. ORA-06512: "SCOTT.PROC_IN_OUT_TEST", line 7
  17. ORA-06512: line 1

显示游标语法:

CURSOR cursor_name IS select_statement

一个简单的例子:

  1. DECLARE
  2. v_empname emp.ename%TYPE;
  3. v_job emp.job%TYPE;
  4. v_deptno emp.deptno%TYPE;
  5. CURSOR emp_test IS --声明游标
  6. SELECT ename, job FROM emp WHERE deptno = v_deptno;
  7. BEGIN
  8. v_deptno := 10;
  9. OPEN emp_test; --打开游标
  10. --循环游标
  11. LOOP
  12. FETCH emp_test
  13. INTO v_empname, v_job; --取值
  14. EXIT WHEN emp_test%NOTFOUND; --当没有记录时退出循环
  15. dbms_output.put_line('empname=' || v_empname || ',job=' || v_job);
  16. END LOOP;
  17. CLOSE emp_test;
  18. END;
  19. --游标的属性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT;
  20. --%FOUND:已检索到记录时,返回true
  21. --%NOTFOUNRD:检索不到记录时,返回true
  22. --%ISOPEN:游标已打开时返回true
  23. --%ROWCOUNT:代表检索的记录数,从1开始

参数化游标只是声明方式和打开游标时有些不同

CURSOR emp_test2(p_deptno emp.deptno%TYPE) IS --声明游标
       SELECT ename, job FROM emp WHERE deptno = p_deptno;

OPEN emp_test2(10); --打开游标

游标变量:

定义游标变更类型
TYPE type_name IS REF CURSOR[RETURN return_type];

  1. CREATE OR REPLACE PROCEDURE cursorvariabletest(p_table IN VARCHAR2) IS
  2. TYPE t_emp_dept IS REF CURSOR; --定义游标变量类型
  3. v_cursorvar t_emp_dept; --声明游标变量
  4.  
  5. v_empno emp.empno%TYPE;
  6. v_ename emp.ename%TYPE;
  7. v_job emp.job%TYPE;
  8. v_dname dept.dname%TYPE;
  9. v_loc dept.loc%TYPE;
  10.  
  11. BEGIN
  12. IF p_table = 'emp' THEN
  13. v_empno := 7369;
  14. OPEN v_cursorvar FOR
  15. SELECT ename, job FROM emp WHERE empno = v_empno; --打开游标变量
  16. ELSE
  17. IF p_table = 'dept' THEN
  18. OPEN v_cursorvar FOR
  19. SELECT dname, loc FROM dept; --打开游标变量
  20. ELSE
  21. raise_application_error(-20000, '请输入emp或dept!');
  22. END IF;
  23. END IF;
  24.  
  25. LOOP
  26. IF p_table = 'emp' THEN
  27. FETCH v_cursorvar
  28. INTO v_ename, v_job;
  29. EXIT WHEN v_cursorvar%NOTFOUND;
  30. dbms_output.put_line('ename=' || v_ename || ',job=' || v_job);
  31. ELSE
  32. FETCH v_cursorvar
  33. INTO v_dname, v_loc;
  34. EXIT WHEN v_cursorvar%NOTFOUND;
  35. dbms_output.put_line('dname=' || v_dname || ',loc=' || v_loc);
  36. END IF;
  37. END LOOP;
  38. CLOSE v_cursorvar; --关闭游标变量
  39. END;
  1. 使用for循环
  2. declare
  3. cursor emp_cursor is select ename,sal from emp ;
  4. begin
  5. for emp_record in emp_cursor loop
  6. dbms_output.put_line('姓名: '||emp_record.ename||' , 工资: '||emp_record.sal);
  7. end loop;
  8. end ;
  9. /

约束与无约束的游标变量
无约束的游标变量包含特定的返回类型(type,rowtype,record等),查询的选择列表必须匹配游标的返回类型,否则会出现预

定义的ROWTYPE_MISMATCH异常。约束的游标变量没有Return子句。

Oracle存储过程,游标使用的更多相关文章

  1. Oracle存储过程游标for循环怎么写

    一.不带参数的游标for循环 首先编写存储过程的整体结构,如下: create or replace procedure test_proc is v_date date; --变量定义 begin ...

  2. oracle存储过程+游标处理select数据

    create or replace PROCEDURE UPDATE_RECORDCODE is cursor location_data is select * from location wher ...

  3. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

  4. C#执行oracle返回游标类型的存储过程

    存储过程代码为: create or replace procedure proc_test(pCursor OUT pak_pub.ut_cursor) AS begin -- 使用游标 open ...

  5. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  6. oracle存储过程(返回列表的存储结合游标使用)总结 以及在java中的调用

    这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励. 以下是我在开发项目中第一次 ...

  7. oracle存储过程和游标的使用

    oracle存储过程和游标的使用 (2011-04-19 14:52:47) 转载▼ 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情 ...

  8. ORACLE存储过程,循环语法和游标

    1.定义所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出 ...

  9. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

随机推荐

  1. WordPress版微信小程序开发系列(一):WordPress REST API

    自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决.不过这些文章 ...

  2. Vue组件间的参数传递

    1.父组件与子组件传值 父组件传给子组件:子组件通过props方法接受数据: 子组件传给父组件: $emit 方法传递参数 2.非父子组件间的数据传递,兄弟组件传值 eventBus,就是创建一个事件 ...

  3. 将json转换为数据结构体

    主要用到的依赖:(划重点:这个依赖需要加jdk版本号,不加的话用不了,且目前最高是jdk15) (ps: 用于json与其他类型格式转换,JSONObject, JSONArray等来自这个包) &l ...

  4. Ajax的异步与同步(async)

    1.async值为true (异步)当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行success,也就是说 ...

  5. JSX

    有一个 Babel 插件,用于在 Vue 中使用 JSX 语法,它可以让我们回到更接近于模板的语法上.JSX语法返回一个vnode对象 import AnchoredHeading from './A ...

  6. redis安装--单机

    本例基于CentOS7.2系统安装 环境需求: 关闭防护墙,selinux 安装好gcc等编译需要的组件 yum -y install gcc c++ 到redis官网下载合适版本的redis安装包, ...

  7. 浏览器useragent

    var ua = window.navigator.userAgent; edge :Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537 ...

  8. java学习笔记(六):变量类型

    java一共三种变量: 局部变量(本地变量):方法调用时创建,方法结束时销毁 实例变量(全局变量):类创建时创建,类销毁时销毁 类变量(静态变量):程序启动是创建,程序销毁时销毁 public cla ...

  9. as3.0 嵌入字体的用法

    var txt:TextField = new TextField();//创建文本 txt.embedFonts=true;//确定嵌入字体 var font:Font=new MyFont();/ ...

  10. MYSQL、SQL在LIKE里传的参数没有赋进去的原因

    SQL语句 = string.Format(" where name like '%@key%' "); para.Add(new MySqlParameter("@ke ...