zoukankan      html  css  js  c++  java
  • 数据库_存储过程简介(oracle版)

    应朋友要求,写个存储过程说明,本篇比较简单,适合新接触存储过程的同学

    先来个简单的

    begin
      dbms_output.put_line('my first execute');
    end;

    如果使用的是PL/SQL,执行后会在output中打印my first execute,那么这里就有了第一个功能

    dbms_output.put_line,在output里面打印结果,另外还有dbms_output.put,这个通常不用,put不含回车,而put_line是含回车的

    下面介绍下如何写一个完整的存储过程,一个完整的存储过程,如下

    create or replace procedure my_first_pro(user_input varchar2) as
      n number;
    begin
      n := 1;
      dbms_output.put_line('user input values is '||user_input);
      dbms_output.put_line('n = '||n);
    end;

    一个完整的存储过程至少包含两部分

    1、创建一个叫my_first_pro的存储过程create procedure my_first_pro as

    2、begin

          end;

          在begin和end中间是存储过程需要实现的功能

    下面对上面代码做一个说明

        创建存储过程不解释了,or replace表示使用新修改的存储过程覆盖现有的存储过程,可以尝试不加这个,如果不加的话会提示报错存储过程已存在,即不可覆盖

        在存储过程名称后面的括号里面,user_input varchar2这个是输入参数,默认是in参数,如果是输出参数,可以输入user_output out varchar2

        n number 这个是声明变量,变量在使用前必须声明,并表明类型,这点和c很像,具体类型可百度,常用的有number、varchar2、char(1)

        n := 1 对n进行赋值,oracle里为了区分判断使用=和赋值使用=的区别,在赋值时不能直接使用=,需要使用:=

        dbms_output.put_line讲过了,值得说明的是在存储过程里面支持oracle的sql所有功能,用法也差不多,比如这里使用的连接符||

    那么结果就是显示入参的values和n的赋值

    先写这些了,睡觉,明天写for和游标

    继续,搞起来

    先说下游标,oracle存储过程里面,游标分为显式游标和隐式游标,听起来很牛逼的样子,其实很简单,显式游标就是需要先定义游标变量,并且在使用时候要打开游标,既然有打开那就一定有关闭,否则无限循环,隐式游标就简单了,不用定义游标变量,随用随定义,所以一般如果能用隐式的时候都会用隐式游标

    先看个隐式游标的例子

    create or replace procedure hide_cursor_case as
    begin
      for i in 1.. 10 loop
        dbms_output.put_line(i);
      end loop;
    end;

    先说下for循环格式

    for cursor_name in i.. n loop

    end loop;

    以for开始,后面指定游标,这个例子里面我并没有在hide_cursor_case as后面指定变量,所以这里的i是隐式游标,后面in 1.. 10即从1到10的迭代,可以理解成python里面的range(11),再后面是循环的开始标记loop,最后end loop;结束,所有使用游标的处理都要在loop和end loop中进行,例子打印了1到10的数字,执行方法

    begin
      hide_cursor_case;
    end;

    结果是

    下面是显式游标,当然比较麻烦了,只是介绍下,如果有人用的话还是要能看懂的,直接懵逼就不好了,我建议能用隐式的话还是不要用显式的吧

    create or replace procedure open_cursor_case as
      cursor1 number;
      cursor iscur is select level as rid from dual connect by level <= 10;
    begin
      open iscur;
      loop
        fetch iscur into cursor1;
        dbms_output.put_line(cursor1);
        exit when iscur%notfound;
      end loop;
    end;

    对比一下,我就想说,谁有上面那个不用,用这个,一定是自虐狂...

    下面介绍下这个存储过程,已经说过的就不说了,cursor1 number定义一个变量,用来接收游标返回结果,这个类型要与接收游标的类型一致

    cursor指定游标,后面是游标名称iscur,这个游标所用的sql写在is后面,这段sql不介绍,要不然又得一大篇,单独拿出来执行下就知道是什么玩意了。

    open iscur打开游标,刚才说过了,显式游标是需要打开的,后面循环游标和for一样,loop开始,end loop结束,中间是游标的使用,首先fetch iscur into cursor1把游标指向的一行给变量,因为这里的sql只有一个字段,所以只要一个变量接收就可以了,多个变量接收用逗号分开,并注意要先定义变量,例如fetch iscur into cursor1,cursor2,具体指定几个变量要看游标包含的字段而定。exit when iscur%notfound这个就容易理解了,当游标找不到任何数据的时候退出。

    好了,游标和for就这些,基础写完了,如果觉得还不错的话,过一段时间再写高级点的,下面一个统计用户下全部表数据量的存储过程,以供学习,还是那句话,不明白多百度

    create or replace procedure count_tables_pro as
      cursor iscur is select table_name from user_tables;
      sql_v varchar2(200);
      cnt number;
    begin
      for i in iscur loop
        sql_v := 'select count(9) from '||i.table_name;
        execute immediate sql_v into cnt;
        dbms_output.put_line(i.table_name||': '||cnt);
      end loop;
    end;

    这个也算是个半隐式游标,留个自习吧,把这个改成纯隐式游标,很简单吧。

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/xiu123/p/9503415.html
Copyright © 2011-2022 走看看