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,...)这一行

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

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

调用该过程

    SQL> var vempno number;
SQL> var vename varchar2(10);
SQL> exec :vempno:=7934;
SQL> exec proc_in_out_test(:vempno,:vename);
PL/SQL procedure successfully completed
vename
---------
MILLER SQL> exec :vempno:=7935;
SQL> exec proc_in_out_test(:vempno,:vename); begin proc_in_out_test(:vempno,:vename); end; ORA-20000: 该员工不存在
ORA-06512: 在 "SCOTT.PROC_IN_OUT_TEST", line 7
ORA-06512: 在 line 1

显示游标语法:

CURSOR cursor_name IS select_statement

一个简单的例子:

    DECLARE
v_empname emp.ename%TYPE;
v_job emp.job%TYPE;
v_deptno emp.deptno%TYPE;
CURSOR emp_test IS --声明游标
SELECT ename, job FROM emp WHERE deptno = v_deptno;
BEGIN
v_deptno := 10;
OPEN emp_test; --打开游标
--循环游标
LOOP
FETCH emp_test
INTO v_empname, v_job; --取值
EXIT WHEN emp_test%NOTFOUND; --当没有记录时退出循环
dbms_output.put_line('empname=' || v_empname || ',job=' || v_job);
END LOOP;
CLOSE emp_test;
END;
--游标的属性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT;
--%FOUND:已检索到记录时,返回true
--%NOTFOUNRD:检索不到记录时,返回true
--%ISOPEN:游标已打开时返回true
--%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];

    CREATE OR REPLACE PROCEDURE cursorvariabletest(p_table IN VARCHAR2) IS
TYPE t_emp_dept IS REF CURSOR; --定义游标变量类型
v_cursorvar t_emp_dept; --声明游标变量 v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
v_dname dept.dname%TYPE;
v_loc dept.loc%TYPE; BEGIN
IF p_table = 'emp' THEN
v_empno := 7369;
OPEN v_cursorvar FOR
SELECT ename, job FROM emp WHERE empno = v_empno; --打开游标变量
ELSE
IF p_table = 'dept' THEN
OPEN v_cursorvar FOR
SELECT dname, loc FROM dept; --打开游标变量
ELSE
raise_application_error(-20000, '请输入emp或dept!');
END IF;
END IF; LOOP
IF p_table = 'emp' THEN
FETCH v_cursorvar
INTO v_ename, v_job;
EXIT WHEN v_cursorvar%NOTFOUND;
dbms_output.put_line('ename=' || v_ename || ',job=' || v_job);
ELSE
FETCH v_cursorvar
INTO v_dname, v_loc;
EXIT WHEN v_cursorvar%NOTFOUND;
dbms_output.put_line('dname=' || v_dname || ',loc=' || v_loc);
END IF;
END LOOP;
CLOSE v_cursorvar; --关闭游标变量
END;
使用for循环
declare
cursor emp_cursor is select ename,sal from emp ;
begin
for emp_record in emp_cursor loop
dbms_output.put_line('姓名: '||emp_record.ename||' , 工资: '||emp_record.sal);
end loop;
end ;
/

约束与无约束的游标变量
无约束的游标变量包含特定的返回类型(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. CSS预处理语言

    CSS预处理语言 Less,Sass,Stylus 安装 Less yarn add less 运行命令 ./node_modules/.bin/lessc 嵌套规则 Less.Sass嵌套规则一样 ...

  2. c# 对DataTable进行分组group by

    ]);//对索引为0的一列进行分组,结果是集合

  3. ORACLE在IMP时候出现数据丢失

    IMP-00019: 由于 ORACLE 错误 12899 而拒绝行 IMP-00003: 遇到 ORACLE 错误 12899 ORA-12899: 列 "JACKEYJ".&q ...

  4. javascript权威指南第1章Js概述js语言核心

    <html> <head> <script> function Point(x,y){ this.x=x; this.y=y; } ,); console.log( ...

  5. 合批只是对CPU的优化,与GPU没有任何关系

    如题. 今天细想了下合批这个东西. 合批是节省了CPU的相关准备工作的工作量. 合批后,经过VS,PS,尝试测试,模板测试后,此时已没有了纹理,顶点,索引的概念,只剩下一个个孤立的像素,各像素间没有任 ...

  6. [phvia/firman] PHP多进程服务器模型中的惊群

    [ 典型场景 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,acce ...

  7. [Redis]Redis的五种数据类型与键值/服务器相关命令

    -------------------------------------------------------------------------------------- String(字符串):最 ...

  8. php 计算 距离

    function getdistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为 ...

  9. mysql修改EST时区,mysql时间修改

    方法有两种 ###第一种 select NOW();show variables like "%time_zone%"; ##一:通过sql命令临时修改 set global ti ...

  10. DJango 基础(6)

    Django模型基础 知识点: 数据库的配置 使用django中的模型 将模型映射到数据库 数据的增删改查基本操作 数据库的配置 1.在settings.py中配置DATABASES: DATABAS ...