數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)
ORACLE數據庫轉MySQL數據庫遇到的坑 總結
最近在做Oracle轉mysql的工程,遇到的坑是真的多,尤其是存儲過程,以前都沒接觸過類似的知識,最近也差不多轉完了就總結一下。希望能幫到一些人(包括以後的自己)~
1> 基本語法
變量聲明:
oracle: v_cnt varchar2(100) := ' ' ;
mysql: DECLARE v_cnt VARCHAR(100) DEFAULT ' ';
存儲過程聲明:
oracle: procedure regNewRecord(i_custno in varchar2(100))
msyql: create procedure regNewRecord(IN i_custno VARCAHR(100))
賦值:
oracle: v_cnt = 'test';
mysql: set v_cnt = 'test';
函數:
oracle: nvl
msyql: ifnull
字符串的拼接:
oracle: str1 || str2
mysql: concat(stra,str2)
數據類型的轉換:
oracle: varchar2 --> msyql: varchar
2> 分頁
oracle中使用rownum: 需要注意的是oracle的下標從1開始,mysql的下標從0開始
select t.* from (SELECT rownum rn , a.seqid from test a order by a.seqid ) t
where rn >= 5 and rn <= 10 #表示取結果集中的第5到第10條記錄
mysql中使用limit關鍵字
select seqid from test limit 4,6; #表示從下標4開始,查詢后6條記錄
3> %rowtype %rowtype是oracle中獨有的關鍵字
oracle: v_test test@%rowtype;
v_test.name = 'zhangsan';
解析:test為一張已存在的表的表名,表示聲明一個包含test表中所有字段的變量,並且這個變量的類型會自動和表數據類型保持一致。後期使用的時候只需要 用 v_test.字段名就可以了。 假如test表中有name字段,那麼可以使用 v_test.name 去使用。
msyql : 在mysql中實現%rowtype的辦法是根據當前表創建一張臨時表,並且定義臨時表中需要使用到的字段對應的變量。
DECLARE t_name varchar(100); -- 定義臨時表中的臨時變量
drop table if exists test_temp;
CREATE TEMPORARY TABLE IF NOT EXISTS test_temp (
SELECT t.* FROM test limit 1
);
-- 這裡創建表之後會自動將一條數據存儲新的臨時表中。
select name into t_name from test_temp; -- 將臨時表中的數據放入臨時變量中,有多個的時候使用逗號分開, 例如: select name, seqid into t_name,t_seqid from test_temp;
之後就可以直接使用 t_name 變量去代替 v_test.name了。
如果後期還有別的存儲過程需要用到臨時表,則需要將變量數據重新update到臨時表中。
eg: update test_temp set name= t_name;
如果oracle在存儲過程里調用的存儲過程的入參中使用 了 tablename%rowtype, msyql對應的解決辦法可以只講對應的表的臨時表的主鍵作為入參傳入,然後同樣定義臨時表中的變量去接收臨時表中的值。
oracle: procedure autoFillSysCol(v_test in test%rowtype)
msyql實現示範: (假定seqid是test 表中的唯一標識)
procedure autoFillSysCol(in v_seqid varchar(100))
DECLARE t_name varchar(100);
DECLARE t_seqid varchar(100);
select seqid,name into t_seqid,t_name from test_temp where seqid= v_seqid; #注意,這裡是承接上面的例子,test_temp臨時表已經創建后被調用的。
到這裡就可以直接使用t_seqid,t_name變量了。。。 如果有更改t_seqid、t_name的操作,需要update test_temp表中的數據
4> return關鍵字
oracle:結束存儲過程可以直接使用return關鍵字
mysql: 需要先定義一個標籤,然後使用LEAVE關鍵字
使用示範:
oracle:
begin
if t_name is null then
return;
end if;
-- 其他操作
end
msyql:
endproc_tag:
begin
if t_name is null then
LEAVE endproc_tag;
end if;
end
5> 時間類型的轉換
oracle: to_char(sysdate,'yyyyMMddHH24mmss')
msyql: date_format(now(),'%Y%m%d%H%i%s')
6> 日期的計算
ORACLE日期相加或者相減: getdate('2018-08-08')+365) getdate('2018-08-08')-365)
msyql日期相加或者相減:adddate('2018-08-08',365) adddate('2018-08-08',-365) #後面的值為正數的時候表示相加,為負數的時候表示相減
7> 垮庫使用表:在當前存儲過程中使用到其他數據庫中的表
oracle: 可以直接使用 表名@數據庫名 ,不需要做什麼配置,直接 dblink就可以了
mysql: 需要修改配置文件,更改數據庫引擎: InnoDB --> federated ,然後建立需要引用表的對應臨時表 再去使用
8> 存儲過程中調用存儲過程
oracle: 直接在存儲過程中寫存儲過程名,例如: newRegCust()
msyql: 需要添加個call關鍵字,例如: call newRegCust()
9> number(p,s)
oracle: 表示最多可以有p位數,小數位占s為,整數位為 p-s. 例如: number(20,6) ,表示最多有20位,小數位為4位,整數位為16位。
msyql:numeric(p,s) 和oracle同理
10> 入參和出參的定義
oracle:需要定義入參和出參 ,格式: ( i_opt in varchar2,o_status out varchar2)
mysql: 出參可以不用定義,也會有結果集返回。 格式: (in i_opt varchar(255)) #這裡要注意,要指定varchar的長度,不然會出錯~
數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)的更多相关文章
- Csharp:操作存儲過程輸出參數,和返回值
/// <summary> ///塗聚文 存儲過程輸出參數,和返回值 /// 20131030 /// Geovin Du /// </summary> /// <par ...
- SQL存儲過程的調試方法
1.在vs2010调试存储过程步骤如下:(要點:連接登陸賬號的權限必須是管理員,才能單步調試,否則只能直接執行存儲過程:[因此,此方式適合數據庫和vs裝在同一台電腦上]) 1.1首先,打开vs,点击 ...
- 簡單SQL存儲過程實例
簡單SQL存儲過程實例 摘自:http://blog.csdn.net/libra6956/article/details/5589173 实例1:只返回单一记录集的存储过程. 银行存款表(bankM ...
- sql server存儲過程語法
-- 变量的声明,sql里面声明变量时必须在变量前加@符号 DECLARE @I INT -- 变量的赋值,变量赋值时变量前必须加set SET @I = 30 -- 声明多个变量 ...
- MS SQLSERVER 存儲過程與緩存
提升SQL Server最具性能的一个方面就是存储过程,SQL Server具备执行计划的缓存功能,以便计划重用.SQL Server2000增强了ad-hoc执行计划的缓存功能,就处理存储过程上性能 ...
- SQL使用存儲過程訪問不同服務器
用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服 ...
- Nhibernate/Hibernate 使用多参数存儲過程 出現could not execute query,Could not locate named parameter等錯誤解決
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns=" ...
- 在Android中afinal框架下實現sqlite數據庫版本升級的辦法
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫. pub ...
- Scrapy——將數據保存到MySQL數據庫
Scrapy--將數據保存到MySQL數據庫 1. 在MySQL中創建數據庫表job_inf: 1 Create table job_inf( 2 id int(11) not null auto_i ...
随机推荐
- Cocos Creator 智能提示 for WebStorm
0.首先下载安装Node.js,否则下面将找不到关于Node.js的设置选项. 1.智能提示设置File->Settings ①设置为最新的ECMAScript版本 ②Enable Node.j ...
- python 多进程和多线程
在计算大量数据时,可以使用多进程 多线程机制来加速计算 多进程 import multiprocessing import os def run_proc(name): print('Child pr ...
- toad 快捷键大全
现在在企业中,操作oracle数据库的客户端,除了PL/SQL外,使用的较多的就是TOAD了!toad记得F9执行全部sql和Ctrl + Enter执行选中sql就行了,有啥需要的再查吧.快捷设置在 ...
- Centos6.8 smokeping安装
yum -y install rrdtool perl-rrdtool curl perl-core bind bind-chroot bind-utils httpd popt popt-devel ...
- WCF 一步一步 发布 WCF服务 到 IIS (图)
WCF 一步一步 发布 WCF服务 到 IIS (图) 使用VS自带的WCFSVCHost(WCF服务主机)发布WCF服务,时刻开发人员测试使用. 下面我们来看一下如何在IIS中部发布一个WCF服务. ...
- linux文件系统(一)
linux的文件系统以及文件类型一.linux 文件系统: 根文件系统(rootfs) rootfilesystem /etc,/usr,/var,/home,/dev 系统自我运行必须用到的路径:( ...
- BGP华为、思科选路规则
选路规则 华为BGP选路规则 思科BGP选路规则 第0条 下一跳是否可达,如果不可达则不参与选路 BGP 向IBGP对等体发布import引入的IGP路由时, 将下一跳属性改为自身的接口地址,而非IG ...
- PHP字符串函数小结
1. strlen:获得字符串长度 2. substr:字符串截取函数 格式:string substr ( string $string , int $start [, int $length ] ...
- ubuntu Sublime Text 2编辑器安装
官网下载http://www.sublimetext.com/2 选择合适的包下载回来的格式是.tar.bz2格式,需要进行解压. 1,解压:tar -xvf Sublime\ Text\ 2.0.2 ...
- Ubuntu中php.ini修改运行内存
首先,我们要知道我们要修改的是什么文件?那就是php.ini文件,一般php有关运行的文件都跟这个文件有关系,路径是 /etc/php5/apache2 .在这里我们就可以用命令进入, cd /etc ...