Oracle存储过程,游标使用

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;  

约束与无约束的游标变量

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

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

时间: 2024-10-07 11:42:35

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

Oracle 存储过程 游标

1 test 2 ----包 create or replace package test_pkg1 is   procedure test_p(v_id   in sys_user.id%type,                    v_name in sys_user.name%type,                    msg    out varchar); end test_pkg1; -- 包体 create or replace package body test_pkg

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

create or replace PROCEDURE UPDATE_RECORDCODE is cursor location_data is select * from location where remark in('952701','9527008','952705');--申明游标 serviceCode NUMBER:=1; BEGIN for l in location_data loop --遍历游标 BEGIN --业务处理 UPDATE SERIAL_CODE SET CU

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

C#执行oracle存储过程,存储过程代码为: create or replace procedure proc_test(pCursor OUT pak_pub.ut_cursor) AS begin open pCursor for select * from scott.emp; end proc_tes; 其中pak_pub.ut_cursor的定义为: create or replace package pak_pub as type ut_cursor is ref cursor;

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

面试概率极大的Oracle存储过程

1.什么是存储过程.存储过程是数据库服务器端的一段程序,它有两种类型.一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户.另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作.有的服务器允许同一个存储过程既可以返回数据又可以执行动作.2.什么时候需要用存储过程 如果服务器定义了存储过程,应当根据需要决定是否要用存储过程.存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的.在服务器上执行存储过程,可以改善应用程序的性能.这

用java调用oracle存储过程总结(转)

//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立连接 Connection conn=null; conn=DriverManager.getConnection(); //3.使用java.sql.*类 CallableStatement cs=conn.prepareCall(str); //4.传入in值 cs.setInt(1,id); cs.se

Oracle存储过程的编写经验与优化措施

1.开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用"databsevv.dbo.table_name",因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验. 2.开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查. 3.高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a) SQL的使用规范: i. 尽量避免大事务操作,慎用ho

Oracle存储过程中异常Exception的捕捉和处理

Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Varchar2) AUTHID CURRENT_USER AS --声明异常 some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition v_ErrorCode NUMBER; -- Variable to hold

C#调用 Oracle 存储过程样例代码

-- 建表CREATE TABLE sale_report (     sale_date DATE NOT NULL ,     sale_item VARCHAR(2) NOT NULL ,      sale_money DECIMAL(10,2) NOT NULL,      PRIMARY KEY(sale_date, sale_item)); -- 測试数据DECLAREv_begin_day DATE;v_end_day DATE;BEGIN v_begin_day := TO_D