Oracle SP を MySQL のものに変換するのが困難です。特に、「Connect by」と「TYPE」について。
Oracleストアドプロシージャを使用して解決する問題は次のとおりです。
3列のテーブルがあります
ID |Last_Modified | Flag
1 |2011-12-11 02:00:00| 0
2 |2011-12-13 02:00:00| 0
3 |2011-12-02 02:00:00| 0
4 |2011-12-12 02:00:00| 0
ストアド プロシージャ「getback(String pId, String pLast_Modified)」。例: pId =”1,2,3” and pLast_Modified = “2011-12-11 02:00:00, 2011-12-13 02:00:00, 2011-12-01 02:00:00”.
ロジックは、同じ ID について、テーブル内の last_modified が渡された last_modified より後の場合、そのレコードのフラグを「1」に設定するというものです。
Oracleストアドプロシージャは次のとおりです。
create or replace procedure test1(
p_ids varchar2,
p_dates varchar2
) IS
TYPE id_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64);
TYPE date_type IS TABLE OF DATE INDEX BY VARCHAR2(64);
ids id_type;
last_updated date_type;
lvar1 varchar2(200);
lvar2 varchar2(200);
cursor c1 is
With ids as (select rownum id, regexp_substr(p_ids,'[^,]+', 1, level) val from dual
connect by regexp_substr(p_ids, '[^,]+', 1, level) is not null),
lupdated as (select rownum id, regexp_substr(p_dates,'[^,]+', 1, level) val from dual
connect by regexp_substr(p_dates, '[^,]+', 1, level) is not null)
select lut.id,
case when lut.last_updated > to_date(lu.val,'yyyy-mm-dd hh24:mi:ss') then 1
else 0
end flag
from last_updated_tbl lut,ids,lupdated lu
where lut.id = ids.val
and ids.id = lu.id
;
BEGIN
open c1;
loop
fetch c1 into lvar1,lvar2;
exit when c1%notfound;
dbms_output.put_line(lvar1||' flag:'||lvar2);
end loop;
close c1;
END;