数据库_存储过程简介(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是含回车的

数据库_存储过程简介(oracle版)

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

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的赋值

数据库_存储过程简介(oracle版)

先写这些了,睡觉,明天写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;

结果是

数据库_存储过程简介(oracle版)

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

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;

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

Original: https://www.cnblogs.com/xiu123/p/9503415.html
Author: 咻_python
Title: 数据库_存储过程简介(oracle版)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578171/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux安装mysql8.0

    MySQL 配置MySQL8安装源 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3….

    Linux 2023年6月6日
    0107
  • linux bash 手册

    1、Linux shell简介 shell是一种特殊的交互式工具,包含了一组内部命令,这些命令可以完成复制文件,移动文件,显示和终止程序等操作。shell的核心是命令行提示符,它允…

    Linux 2023年6月7日
    096
  • redis订阅关闭异常解决

    redis订阅关闭异常解决 应用程序模块订阅redis运行一段时间出现一直重连Redis服务,日志如下: 2019-04-28 10:06:17,551 ERROR org.spr…

    Linux 2023年5月28日
    0117
  • Centos7.9、Ubuntu操作系统图文安装

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 一、环境准备 1、镜像包 CentOS-7.9-x86_64-DVD-2009.isoubuntu-18.04.6-server…

    Linux 2023年5月27日
    094
  • Python的闭包是什么意思?

    闭包算是编程语言里一个比较常见的概念,但说实话,这个名词有点晦涩。在查看了半天网上的资料后,还是有点不明就里。 我疑惑的点主要是:这个东西是用来解决什么问题的?或者说,他的作用是什…

    Linux 2023年6月8日
    0111
  • linx命令之ln 软连接 硬链接

    ln(全称:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。 当需要在不同的目录,用到相同的文件时;不需要在每一个需要的目录下…

    Linux 2023年5月27日
    0105
  • shell ${val:0:3)含义

    ${file:0:5}:提取最左边的5个字节:/dir1${file:5:5}:提取第5个字节右边的连续5个字节:/dir2 例子: pval=12345678 r=${pval:…

    Linux 2023年5月28日
    073
  • Linux 常用命令总结(三)

    一、实用命令 1、crontab(定时任务) (1)基本概念crontab 是用来管理定时任务的命令。系统启动后,将会自动调用 crontab,如果存在任务,则根据相关定义去执行。…

    Linux 2023年5月27日
    0125
  • shell 获取进程号

    Shell最后运行的后台PID(后台运行的最后一个进程的进程ID号) $! Shell本身的PID(即脚本运行的当前进程ID号 $$ Original: https://www.c…

    Linux 2023年5月28日
    0101
  • 美团笔试(22.03.19)

    代码题 一共五道代码题,看了前面三道,ac了三道,后面两道题没有时间看,此处将对前三题进行记录总结,后附代码。 题意:给定一组n个商品的价格,下单购买商品时,必须购买前i个商品,即…

    Linux 2023年6月13日
    0110
  • python爬虫配置IP代理池(ProxyPool)

    关注我的公众号【靠谱杨的挨踢生活】回复 ProxyPool可以免费获取网盘链接。也可自行搜索下载:https://github.com/Python3WebSpider/Proxy…

    Linux 2023年6月14日
    0119
  • Linux ARMv7中断向量表搬移(2)【转】

    经历过kernel的汇编阶段,进入C语言start_kernel后对中断向量表的位置进行搬移,搬移函数是early_trap_init。 early_trap_init函数的调用流…

    Linux 2023年6月8日
    0110
  • [apue] 标准 I/O 库那些事儿

    标准 IO 库自 1975 年诞生以来,至今接近 50 年了,令人惊讶的是,这期间只对它做了非常小的修改。除了耳熟能详的 printf/scanf,回过头来对它做个全方位的审视,看…

    Linux 2023年6月6日
    0135
  • Linux——基础命令用法(下)

    一、linux用户 1、什么是用户 用户用于运行某些进程并拥有某些文件或目录。 [En] Users are used to run certain processes and o…

    Linux 2023年5月27日
    0112
  • Mysql Date操作

    根据format字符串格式化date值。 下列修饰符可以被用在format字符串中: %W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1s…

    Linux 2023年6月7日
    076
  • 堆栈

    目录: 9、【剑指Offer学习】【面试题09:用两个栈实现队列】 30、【剑指Offer学习】【面试题30:包含min函数的栈】 31、【剑指Offer学习】【面试题31:栈的压…

    Linux 2023年6月13日
    0118
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球