mysql与oracle的存储过程有什么区别?

MySQL存储过程

(1). 格式

MySQL存储过程创建的格式:CREATE PROCEDURE过程名 ([过程参数[,...]])

[特性 ...]过程体

案例分析:

参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名数据类形...])

IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

OUT 输出参数:该值可在存储过程内部被改变,并可返回

INOUT 输入输出参数:调用时指定,并且可被改变和返回

1)不带参数:

mysql>delimiter //

mysql> create procedure p1()

-> begin

->  declare v_ename varchar(10);

->  declare v_sal   int;

->  select ename,sal into v_ename,v_sal from emp where empno=7788;        ->      select v_ename ;

->      select v_sal;

->  end;

-> //

Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;

mysql> call p1();

+---------+

| v_ename |

+---------+

| SCOTT   |

+---------+

1 row in set (0.00 sec)

+-------+

| v_sal |

+-------+

|  3000 |

+-------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

2)in参数:

mysql> delimiter //

mysql> create procedure p2(in v_empno int)

-> begin

->  declare v_ename varchar(10);

->  declare v_sal   int;

->  select ename,sal into v_ename,v_sal from emp where empno=v_empno;     ->      select v_ename ;

->      select v_sal;

->  end;

-> //

Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;

执行:

mysql> call p2(7788);

+---------+

| v_ename |

+---------+

| SCOTT   |

+---------+

1 row in set (0.00 sec)

+-------+

| v_sal |

+-------+

|  3000 |

+-------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

3)out参数:

mysql> delimiter //

mysql> create procedure p3(in v_empno int,out v_sal int)

-> begin

->  declare v_ename varchar(10);

->      select ename,sal into v_ename,v_sal from emp where empno=v_empno; ->      select v_ename ;

->      select v_sal;

->  end;

-> //

Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;

执行:

mysql> call p3(7788,@v_sal);

+---------+

| v_ename |

+---------+

| SCOTT   |

+---------+

1 row in set (0.00 sec)

+-------+

| v_sal |

+-------+

|  3000 |

+-------+

1 row in set (0.00 sec)

4)存储过程循环

while 循环

mysql> delimiter //

mysql> create procedure p_while()

begin

declare v_empno int;

declare v_count int;

set  v_empno=7788;

set  v_count=0;

while v_count < 10 do

insert into emp1 select * from emp where empno=v_empno;

set  v_count=v_count + 1;

end while;

end;

//

mysql> delimiter ;

repeat 循环:

mysql> delimiter //

mysql> create procedure p_repeat()

begin

declare v_empno int;

declare v_count int;

set  v_empno=7788;

set  v_count=0;

repeat

insert into emp1 select * from emp where empno=v_empno;

set  v_count=v_count + 1;

until v_count > 10

end repeat;

end;

//

mysql> delimiter ;

loop 循环:

mysql> delimiter //

mysql> create procedure p_loop()

begin

declare v_empno int;

declare v_count int;

set  v_empno=7788;

set  v_count=0;

loop_label:loop

insert into emp1 select * from emp where empno=v_empno;

set  v_count=v_count + 1;

if v_count > 10 then

leave loop_label;

end if;

end loop;

end;

//

mysql> delimiter ;

三、Oracle 存储过程

不带参数:

SQL> create or replace procedure proc1 is

3  v_ename emp.ename%type;

4  v_sal  emp.sal%type ;

5

6  begin

7      select ename,sal into v_ename,v_sal from emp where empno=&no;

8      dbms_output.put_line(‘Name is : ‘||v_ename||‘ , ‘||‘Salary is : ‘||v_sal);

9  exception

10      when no_data_found then

11         dbms_output.put_line(‘you number is not crrect ,please input again !‘);

12

13  end;

14  /

Procedure created

执行:

SQL> exec proc1;

PL/SQL procedure successfully completed

SQL> set serverout on

SQL> /

Name is : SCOTT , Salary is : 3000

PL/SQL procedure successfully completed

带参数的存储过程:

参数定义中,IN、OUT和IN OUT代表参数的三种不同模式:

IN:当调用存储过程时,该模式的形参接收对应实参的值,并且该是只读的,即不能被修改。默认为IN。

OUT:该形参被认为只能写,既只能为其赋值。在存储过程中不能读它的值。返回时,将该形参值传给相应的实参。

IN OUT:都允许

in 参数:

SQL>  create or replace procedure proc2 ( v_empno emp.empno%type) is

-- 如果不指明参数的模式,默认为in

2      v_ename emp.ename%type;

3      v_sal emp.sal%type;

4

5      begin

6         select ename,sal into v_ename,v_sal from emp where empno=v_empno;

7         dbms_output.put_line(‘Name is : ‘||v_ename||‘ , ‘||‘Salary is : ‘||v_sal);

8      exception

9          when no_data_found then

10             dbms_output.put_line(‘you number is not crrect ,please input again !‘);

11

12     end;

13  /

Procedure created

执行:

SQL> exec proc2(7369);

Name is : SMITH , Salary is : 8000

PL/SQL procedure successfully completed

SQL> create or replace procedure proc2 ( v_empno in emp.empno%type) is

2      v_ename emp.ename%type;

3      v_sal emp.sal%type;

4

5      begin

6         select ename,sal into v_ename,v_sal from emp where empno=v_empno;

7         dbms_output.put_line(‘Name is : ‘||v_ename||‘ , ‘||‘Salary is : ‘||v_sal);

8      exception

9          when no_data_found then

10             dbms_output.put_line(‘you number is not crrect ,please input again !‘);

11

12     end;

13  /

out 参数:

SQL> create or replace procedure proc2 ( v_empno in emp.empno%type, v_ename out emp.ename%type,v_sal out emp.sal%type)

2    is

3

4  begin

5     select ename,sal into v_ename,v_sal from emp where empno=v_empno;

6     dbms_output.put_line(‘Name is : ‘||v_ename||‘ , ‘||‘Salary is : ‘||v_sal);

7  exception

8      when no_data_found then

9         dbms_output.put_line(‘you number is not crrect ,please input again !‘);

10

11  end;

12  /

Procedure created

执行:

SQL> var v_ename varchar2(10);

SQL> var v_sal number;                              //注意:对于number类型不能指明长度

SQL> exec proc2(7788,:v_ename,:v_sal );

Name is : SCOTT , Salary is : 3000

PL/SQL procedure successfully completed

v_ename

---------

SCOTT

v_sal

---------

3000

通过匿名块执行:

SQL> var v_ename varchar2

SQL> var v_sal number

SQL> declare

2   v_empno emp.empno%type := 7788;

3  begin

4    proc2(v_empno ,:v_ename,:v_sal);

5  end;

6  /

Name is : SCOTT , Salary is : 3000

PL/SQL procedure successfully completed

v_ename

---------

SCOTT

v_sal

---------

3000

SQL> declare

2    v_empno emp.empno%type := 7836;

3    v_ename emp.ename%type ;

4   v_sal emp.sal%type;

5  begin

6    proc2(v_empno ,v_ename,v_sal);

7  end;

8  /

in out 参数:

SQL>

create or replace procedure proc3( v_empno  in out emp.empno%type)

is

v_ename emp.ename%type;

v_sal emp.sal%type;

begin

select ename,sal into v_ename,v_sal from emp where empno=v_empno;

dbms_output.put_line(‘Name is : ‘||v_ename||‘ , ‘||‘Salary is : ‘||v_sal);

exception

when no_data_found then

dbms_output.put_line(‘you number is not crrect ,please input again !‘);

end;

/

执行:

SQL> var v_empno number;

SQL> exec :v_empno:=7788;

PL/SQL procedure successfully completed

v_empno

---------

7788

SQL> exec proc3(:v_empno);

Employees id is: 7788 , Name is : SCOTT , Salary is : 3000

PL/SQL procedure successfully completed

v_empno

---------

7788

SQL> declare

2  v_empno emp.empno%type;

3  begin

4   v_empno:=7788;

5   proc3(v_empno );

6  end;

7  /

Name is : SCOTT , Salary is : 3000

PL/SQL procedure successfully completed

SQL> create or replace procedure proc3( v_empno  in out emp.empno%type)

2

3   is

4

5   v_ename emp.ename%type;

6   v_sal emp.sal%type;

7

8   begin

9       select empno,ename,sal into v_empno, v_ename,v_sal from emp where empno=v_empno;

10     dbms_output.put_line(‘Employee number is: ‘||v_empno||‘ , ‘||‘Name is : ‘||v_ename||‘ , ‘||‘Salary is : ‘||v_sal);

11  exception

12      when no_data_found then

13         dbms_output.put_line(‘you number is not crrect ,please input again !‘);

14

15  end;

16  /

Procedure created

执行:

SQL> declare

2    v_empno emp.empno%type;

3  begin

4    v_empno := 7788;

5  proc3(v_empno);

6  end;

7  /

Employee number is: 7788 , Name is : SCOTT , Salary is : 3000

PL/SQL procedure successfully completed

Oracle 存储过程循环:

loop 基本循环:

SQL>  declare

2      v_empno emp.empno%type := 7788;

3      v_count number :=0;

4

5    begin

6

7      loop

8         insert into emp1 select * from emp where empno=v_empno;

9         v_count := v_count + 1;

10         exit when  v_count >= 10;

11      end loop;

12

13    end;

14  /

PL/SQL procedure successfully completed

for 循环:

SQL> declare

2

3     v_empno emp.empno%type;

4

5    begin

6       v_empno := 7788;

7

8     for  i  in 1..10 loop

9         insert into emp1 select * from emp where empno=v_empno;

10     end loop;

11

12   end;

13

14

15

16  /

PL/SQL procedure successfully completed

while 循环:

SQL> declare

2      v_empno emp.empno%type;

3      v_count number := 0;

4

5    begin

6       v_empno := 7788;

7

8      while v_count < 10  loop

9         insert into emp1 select * from emp where empno=v_empno;

10         v_count := v_count + 1;

11

12      end loop;

13      end;

14  /

PL/SQL procedure successfully completed

时间: 2024-10-12 17:38:21

mysql与oracle的存储过程有什么区别?的相关文章

MySQL 和 Oracle 在 MyBatis 使用中的区别

MySQL 和 Oracle 在 MyBatis 使用中的区别: 区别 MySQL Oracle 存储过程的参数模式 mode 为 IN 时,是否需要指定 jdbcType 不需要:MyBatis 为 IN 模式提供了默认的 jdbcType,没有为 OUT 模式提供 如果入参存在 null 的情况,需要 存储过程的参数模式 mode 为 OUT 时,是否需要指定 jdbcType 需要 需要 是否支持游标参数 不支持 支持 原文地址:https://www.cnblogs.com/cag205

mysql和oracle建表语句的区别

mysql DROP TABLE IF EXISTS `order`;CREATE TABLE `order` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `number` varchar(255) NOT NULL COMMENT '工单编号',  `applicant` varchar(255) NOT NULL COMMENT '工单申请人',  `state` int(1) NOT NULL COMMENT '工单状态',  `count` int

Mysql与Oracle区别

文章分类:数据库 周五去一家公司去面试,那公司经理问了关于Mysql与Oracle的区别问题,以前没有总结,回答也不是很好,只是凭感觉,先总结如下: 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. Oracle支持大并发,大访问量,是OLTP最好的工具. 3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特

Mysql与Oracle区别(转载)

Mysql与Oracle区别 文章分类:数据库 转载于http://blog.sina.com.cn/s/blog_5d9ca4ea0100kmhy.html 周五去一家公司去面试,那公司经理问了关于Mysql与Oracle的区别问题,以前没有总结,回答也不是很好,只是凭感觉,先总结如下: 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. Oracle支持大并发,大访问量,是

存储过程之--MySQL与Oracle实现对比

存储过程之--MySQL与Oracle实现对比 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是

MYSQL和ORACLE的一些区别

原文:http://www.cnblogs.com/wujin/archive/2012/02/02/2336055.html 有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORACLE的需求,应用程序也要相应做一些修改.总结出以下几点注意事项. 1. 自动增长的数据类型处理          MYSQL有自动增长的数据类型,插入记录时不用操作此字段,

oracle函数和存储过程有什么区别

1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改.插入数据库表或执行某些DDL语句等等) 参数的返回情况来看: 如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数: 从调用情况来看: 如果在SQL语句(DML或SELECT)中调用的话一定是存储函数或存储的封装函数不可以是存储过程

模块与包 Mysql与Oracle区别

1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到python解释器的内置模块 2),模块的执行:import,每个模块都是一个独立的名称空间. 模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入imp

qlserver、Mysql、Oracle三种数据库的优缺点总结

这篇文章主要介绍了sqlserver.Mysql.Oracle三种数据库的优缺点总结,需要的朋友可以参考下 一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势.从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要.作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应