MySQL和Oracle对比之存储过程(r5笔记第7天)

昨天晚上帮一个朋友处理了一个关于存储过程的问题,他需要迁移一些Oracle中的存储过程到MySQL中来,但是改了一部分的程序,发现MySQL中没法编译了,报了很多的错误。 这个问题也比较典型,自己就趁热打铁总结了一下。 因为隐私的关系还有代码长度的关系,我就不罗列代码了。 假设Oracle中的存储过程如下,我们需要改写为MySQL代码: set serveroutput on CREATE or replace PROCEDURE test_proc( in_value IN varchar2) as stmt_bz number; stmt_dml varchar2(200); begin stmt_bz:=100; stmt_dml:=in_value||' insert into new_test(id,' || 'name)' || ' values('||stmt_bz||','||''''||stmt_bz||''''||')'; dbms_output.put_line(stmt_dml); end; / exec test_proc('test'); 运行情况如下: SQL> exec test_proc('test'); test insert into new_test(id,name)values(100,'100') PL/SQL procedure successfully completed. 看起来逻辑也不复杂,但是要迁移到MySQL中还是有不少的细节需要注意。 delimiter // DROP PROCEDURE IF EXISTS `test_proc`// CREATE PROCEDURE test_proc(IN in_value varchar(2000)) begin declare stmt_bz int; declare stmt_dml varchar(200); set stmt_bz=100; set stmt_dml=concat(' insert into new_test(id,' , 'name)' , 'values(',stmt_bz,',','''',stmt_bz,'''',')'); select stmt_dml; end // delimiter ; call test_proc('test'); 输出结果如下: mysql> call test_proc('test'); +-------------------------------------------------+ | stmt_dml | +-------------------------------------------------+ | insert into new_test(id,name)values(100,'100') | +-------------------------------------------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) 第一处是分隔符的问题,delimiter 在MySQL在是可以自行制定的。我们暂定为// 第二处是关于drop procedure和create procedure,在Oracle中就可以直接制定为create or replace procedure 第三处是关于传入参数in_value,字符型传入参数在MySQL中就是varchar(2000),在Oracle就是varchar2 (注意不是varchar2(2000)) 第四处是begin的部分,在Oracle中就是as begin来开启的,但是在MySQL就可以直接begin了。 第五处是声明变量在MySQL中就需要逐步声明,declare,但是在Oracle中是作为匿名pl/sql块一样来处理 第六处是变量初始化,在oracle中直接使用stmt_bz:=100; 但是在MySQL中需要用set stmt_bz=100; 第七处是关于字符串拼接,在MySQL中会用concat,在Oracle中可以使用||来拼接。 第八处就是输出变量,MySQL中使用select stmt_dml; 直接查询即可,在oracle可以调用dbms_output来输出。 第九处就是调用存储程序,在Oracle中使用exec,call都可以,在MySQL中只能使用call

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

一个MySQL优化案例的初步思路(r8笔记第87天)

今天想起这件同事处理的一个性能优化案例,当时虽然解决了,但是还是留下了几个未解的问题,和大家一起讨论一下。 首先,这个问题是根据反馈sql响应很慢,已经开始影响...

28540
来自专栏java架构师

【SQL Server】系统学习之二:索引优化

页大小8192个字节,行限制为8060字节(大型对象除外)。 包含varchar nvarchar varbinary sql_variant(8012,obj...

25160
来自专栏乐沙弥的世界

MongoDB 多键索引

更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB执行计划获取(db.collection.explain()) ...

17330
来自专栏乐沙弥的世界

PL/SQL 游标变量

    游标变量与游标相似,有其共性,也有其不同点。就其共性来说两者都是指向多行查询的结果集中的当前行。都要经历声明,打开,检索与关闭的过程。所不同的是游标与游...

9840
来自专栏cs

python链接mysql数据库

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

13040
来自专栏小狼的世界

Mysql运行模式及1690错误处理

经过查询,发现这个错误的原因是两个时间字段进行减法运算时,如果有一个时间为0000-00-00时造成的,根本原因是因为这样减法的结果会超过Mysql数值字段的范...

13120
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle存储过程

Oracle存储过程 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数...

44450
来自专栏Django Scrapy

day2 oracle相关

数据库定义有三: 1 一门计算机学科 2 代表某个软件 3 某一种数据库软件产生的集合 DDL 数据库定义语句 DML 数据库操作语句 创建一张表: ...

32090
来自专栏Java技术栈

去 BAT 面试,总结了这 55 道 MySQL 面试题!

Mysql数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程SQL服务器、不同的后端、广泛的应用程序编程接口和管理工具。

2.3K20
来自专栏坚毅的PHP

mysql数据迁移hbase问题

无法直接dump,写了java多线程程序做迁移 问题1:Operation not allowed after ResultSet closed 裸jdbc语句...

40450

扫码关注云+社区

领取腾讯云代金券