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

先来个简单的

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;

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

数据库_存储过程简介(oracle版)的更多相关文章

  1. ORACLE数据库_迁移(新机器,新存储)

    迁移: (10g 64老机器,老存储) ------>(11g 64新机器,新存储)注意要点:新老服务的时间,字符集,sid升级顺序:10.2.0.1------>10.2.0.4或10. ...

  2. [转]SQLSERVER存储过程调用不同数据库的数据_存储过程中通过链接服务器访问远程服务器

    本文转自:http://blog.csdn.net/nnaabbcc/article/details/7967761 存储过程调用不同数据库的数据 在存储过程调用不同数据库的数据该如何做,比如在存储过 ...

  3. CSDN Oracle版精华帖荟萃

    ⑴ 关于大数据量的数据库设计问题http://bbs.csdn.net/topics/390382930⑵ ORA-00904标识符无效http://bbs.csdn.net/topics/39033 ...

  4. C语言与数据库操作入门(Win版)

    C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1387 数据库,DataBase,学C语言的是不是想说,很想爱她却并不容易呢?不用着急,C语言也可以操作数据库的 ...

  5. [转帖]达梦数据库(DM6)和ORACLE 10g的异同点

    达梦数据库(DM6)和ORACLE 10g的异同点    https://bbs.aliyun.com/detail/351337.html   花花浪子 级别: 小白 发帖 0 云币 -41 加关注 ...

  6. 数据库基本概念及Oracle基本语句

    一.数据库分类 通常是按照数据模型的特点将传统数据库系统分成网状数据库.层次数据库和关系数据库三种. 1.网状数据库 顾名思义,网状数据库采用的是以记录类型为结点的网状数据模型,是一种导航式(Navi ...

  7. 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接

    前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...

  8. Mybatis调用数据库的存储过程和方法

     转载. https://blog.csdn.net/ml0228123/article/details/81002258   上次的项目,要求我用java代码调用存储过程,折腾了好久.最后总算成功了 ...

  9. OCM_第十八天课程:Section8 —》RAC 数据库 _ RAC DB 搭建/RAC DB 配置使用

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

随机推荐

  1. 04-TypeScript中的方法新功能(上)

    在TypeScript中,提供了一些函数的新功能,能够简化JavaScript中的一些比较复杂代码才能实现的一些能力. 在C#后端语言中,能够对方法传递的参数指定params关键字,也就是可以传递任意 ...

  2. Android中服务的生命周期与两种方式的区别

    服务的生命周期跟Activity的生命周期类似.但是生命周期甚至比你关注服务如何创建和销毁更重要,因为服务能够在用户不知情的情况下在后台运行. 服务的生命周期---从创建到销毁---可以被分为以下两个 ...

  3. 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)

    写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...

  4. vue页面参数闪一下的问题

    解决方法: 直接在外层元素加上v-cloak <div id='app' v-cloak></div>

  5. 通过反射实现IOC功能

    这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六 ...

  6. leetcode — two-sum-ii-input-array-is-sorted

    import java.util.ArrayList; import java.util.List; /** * Source : https://oj.leetcode.com/problems/m ...

  7. vue.js的项目实战

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用, ...

  8. maven教程5(聚合工程)

    所谓聚合项目,实际上就是对项目分模块,互联网项目一般来说按照业务分(订单模块.VIP模块.支付模块.CMS模块...),传统的软件项目,大多采用分层的方式(Dao.Serivce.Controller ...

  9. WEB页获取串口数据

    最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言 ...

  10. 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想

    K&R习题1-23中,要求“编写一个程序,删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不允许嵌套”. 如果不考虑字符常量和字符串常量,问题确实很简单.只 ...