1. 程式人生 > 其它 >MySQL和Oracle對比之儲存過程(r5筆記第7天)

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