共计 3368 个字符,预计需要花费 9 分钟才能阅读完成。
行业资讯
数据库
MySQL 与 Oracle 差异比较之存储过程 Function 的示例分析
这篇文章给大家分享的是有关 MySQL 与 Oracle 差异比较之存储过程 Function 的示例分析的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
存储过程 Function
编号类别 ORACLEMYSQL 注释 1 创建存储过程语句不同 create or replace procedure P_ADD_FAC(
id_fac_cd IN ES_FAC_UNIT.FAC_CD%TYPE) isDROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`;
create procedure P_ADD_FAC(
id_fac_cd varchar(100))
1. 在创建存储过程时如果存在同名的存储过程, 会删除老的存储过程.
oracle 使用 create or replace.
mysql 使用先删除老的存储过程, 然后再创建新的存储过程.
2. oracle 存储过程可以定义在 package 中, 也可以定义在 Procedures 中. 如果定义在包中, 一个包中可以包含多个存储过程和方法. 如果定义在 Procedures 中, 存储过程中不可以定义多个存储过程.
Mysql 存储过程中不可以定义多个存储过程.
3. oracle 中字符串类型可以使用 varchar2.
Mysql 需要使用 varchar
4. Oracle 中参数 varchar 长度不是必须的,
Mysql 中参数 varchar 长度是必须的, 比如 varchar(100) 2 创建函数语句不同 CREATE OR REPLACE FUNCTION F_ROLE_FACS_GRP(
ii_role_int_key IN SD_ROLE.ROLE_INT_KEY%TYPE
) RETURN VARCHAR2DROP FUNCTION IF EXISTS `SD_ROLE_F_ROLE_FACS_GRP`;
CREATE FUNCTION `SD_ROLE_F_ROLE_FACS_GRP`(
ii_role_int_key INTEGER(10)
) RETURNSvarchar(1000) 1. 在创建函数时如果存在同名的函数, 会删除老的函数.
oracle 使用 create or replace.
mysql 使用先删除老的函数, 然后再创建新的函数.
2. oracle 函数可以定义在 package 中, 也可以定义在 Functions 中. 如果定义在包中, 一个包中可以包含多个存储过程和函数. 如果定义在 Functions 中, 每个函数只能定义一个函数.
Mysql Functions 不可以定义多个函数.
3. oracle 返回值用 return.
Mysql 返回值用 returns. 3 传入参数写法不同 procedure P_ADD_FAC(
id_fac_cd IN ES_FAC_UNIT.FAC_CD%TYPE)create procedure P_ADD_FAC(
(in) id_fac_cd varchar(100))
1. oracle 存储过程参数可以定义为表的字段类型.
Mysql 存储过程不支持这种定义方法. 需要定义变量的实际类型和长度.
2. oracle 参数类型 in/out/inout 写在参数名后面.
Mysql 参数类型 in/out/inout 写在参数名前面.
3. oracle 参数类型 in/out/inout 都必须写.
Mysql 参数类型如果是 in, 则可以省略. 如果是 out 或 inout 则不能省略.
注意: mysql 中指定参数为 IN, OUT, 或 INOUT 只对 PROCEDURE 是合法的。(FUNCTION 参数总是被认为是 IN 参数)RETURNS 字句只能对 FUNCTION 做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个 RETURN value 语句。
function func_name(
gw_id in(out) varchar2 )create function func_name(
gw_id varchar(100))4 包的声明方式 create or replace package/package body package name 拆分成多个存储过程或函数 oracle 可以创建包, 包中可以包含多个存储过程和方法.
mysql 没有没有包这个概念, 可以分别创建存储过程和方法. 每个存储过程或方法都需要放在一个文件中.
例 1: 方法命名
oracle 中 SD_FACILITY_PKG.F_SEARCH_FAC
to mysql SD_FACILITY_F_SEARCH_FAC
例 2: 过程命名
oracle 中 SD_FACILITY_PKG.P_ADD_FAC
to mysql SD_FACILITY_P_ADD_FAC
5 存储过程返回语句不一样 return;LEAVE proc; (proc 代表最外层的 begin end)oracle 存储过程和方法都可以使用 return 退出当前过程和方法.
Mysql 存储过程中只能使用 leave 退出当前存储过程. 不可以使用 return.
Mysql 方法可以使用 return 退出当前方法. 6 存储过程异常处理不一样 EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
ov_rtn_msg := c_sp_name|| (|| li_debug_pos ||): ||
TO_CHAR(SQLCODE)|| : ||SUBSTR(SQLERRM,1,100);DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK ;
set ov_rtn_msg = concat(c_sp_name, ( , li_debug_pos ,): ,
TO_CHAR(SQLCODE), : ,SUBSTR(SQLERRM,1,100));
END;oracle : 内部异常不需要定义, 在存储过程或函数末尾写上 EXCEPTION 后, 后面的部分即为异常处理的部分. oracle 可以定义自定义异常, 自定义异常需要使用 raise 关键字抛出异常后, 才可以在 EXCEPTION 中捕获.
mysql: mysql 内部异常也需要先定义, 在定义的同时也需要实现异常的功能.
目前 mysql 不支持自定义异常. 7 过程和函数的声明变量的位置不同声明变量在 begin…end 体之前声明变量在 begin…end 体内,begin 之后其他任何内容之前 8NO_DATA_FOUND 异常处理 EXCEPTION
WHEN NO_DATA_FOUND THEN
oi_rtn_cd := 1;
ov_rtn_msg := SD_COMMON.P_GET_MSG(DP-CBM-01100a-016 ,
li_sub_rtn_cd,
lv_sub_rtn_msg
); 使用 FOUND_ROWS() 代替 NO_DATA_FOUND. 详见注释.oracle 中:
NO_DATA_FOUND 是游标的一个属性.
当 select 没有查到数据就会出现 no data found 的异常,程序不会向下执行.
Mysql:
没有 NO_DATA_FOUND 这个属性. 但可是使用 FOUND_ROWS()方法得到 select 语句查询出来的数据. 如果 FOUND_ROWS()得到的值为 0, 就进入异常处理逻辑. 9 在存储过程中调用存储过程方式的不同 Procedure_Name(参数);Call Procedure_Name(参数);MYSQL 存储过程调用存储过程,需要使用 Call pro_name(参数).
Oracle 调用存储过程直接写存储过程名就可以了. 10 抛异常的方式不同 RAISE Exception_Name; 见备注详见 2009002-OTMPPS-Difficult Questions-0001.doc 中 2.5 Mysql 异常处理部分
感谢各位的阅读!关于“MySQL 与 Oracle 差异比较之存储过程 Function 的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!