MySQL和Oracle對比之儲存過程(r5筆記第7天)
阿新 • • 發佈:2022-05-04
昨天晚上幫一個朋友處理了一個關於儲存過程的問題,他需要遷移一些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)