MySQL和Oracle對比之儲存過程
昨天晚上幫一個朋友處理了一個關於儲存過程的問題,他需要遷移一些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
這個問題也比較典型,自己就趁熱打鐵總結了一下。
因為隱私的關係還有程式碼長度的關係,我就不羅列程式碼了。
假設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.
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1578530/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL之儲存過程MySql儲存過程
- Oracle儲存過程Oracle儲存過程
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- mysql 儲存過程MySql儲存過程
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- MySQL儲存過程的建立和使用MySql儲存過程
- MySQL---------儲存過程MySql儲存過程
- mysql儲存過程整理MySql儲存過程
- 23. 使用MySQL之使用儲存過程MySql儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- MySQL入門系列:儲存程式(三)之儲存過程簡介MySql儲存過程
- ORACLE PL/SQL 物件、表資料對比功能儲存過程簡單實現OracleSQL物件儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- mysql如何呼叫儲存過程MySql儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- MySQL的物理儲存結構和session過程MySqlSession
- MySQL儲存過程 (即函式)MySql儲存過程函式
- mySql 儲存過程與函式MySql儲存過程函式
- Laravel 中使用 MySQL 儲存過程LaravelMySql儲存過程
- MySql資料庫——儲存過程MySql資料庫儲存過程
- mysql儲存過程的引數MySql儲存過程
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- MySQL三種InnoDB、MyISAM和MEMORY儲存引擎對比MySql儲存引擎
- MySQL儲存過程語句及呼叫MySql儲存過程
- MySQL儲存過程中如何使用ROLLBACKMySql儲存過程
- Mysql 5.7儲存過程的學習MySql儲存過程
- MySQL--儲存過程與檢視MySql儲存過程
- mysql 儲存過程 procedure 批次建表MySql儲存過程
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- 【MySQL】MySQL(三)儲存過程和函式、觸發器、事務MySql儲存過程函式觸發器
- MySQL優化---儲存過程和儲存函式-1-轉自部落格園MySql優化儲存過程儲存函式