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;

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

  • 相关阅读:
    你还在钟情于windows XP吗?
    我常用的vim快捷键
    2013年读的书(很多还没看完)
    期末考试了
    顺着自己的心,去做自己喜欢的事
    关于最近新闻泛滥的几点看法以及学习的个人观点
    华为OJ_1
    【Android】弹出软键盘时候让上面布局跟着上移的方法
    【Android】策略模式封装百度地图路线规划模块
    google觉得好用的插件(不断更新)
  • 原文地址:https://www.cnblogs.com/xiu123/p/9503415.html
Copyright © 2011-2022 走看看