oracle存储过程转为MySQL过程,请进!!!

Ammy_Jiang 2010-10-18 09:32:44
请问,哪位大侠能帮忙将以下oracle的存储过程转为MySQL的存储过程,谢谢!

create or replace PROCEDURE PRO_POI_TYPE_USE_TAB AS
v_CITY_ID varchar2(100);
v_ADMIN_TAB varchar2(100);
v_TYPE_USE number;
v_Sql_Select varchar2(500);
v_Sql_Create varchar2(500);
TYPE T_CUR IS REF CURSOR;
cur_poi_type T_CUR;

CURSOR cur_poi_name IS
SELECT CITY_ID,POI_ADMIN_TAB
FROM POI_ADMIN_DEFINE where substr(CITY_ID,3,2) <> 00;

BEGIN

FOR recode_POI_NAME IN cur_poi_name LOOP
v_CITY_ID := recode_POI_NAME.CITY_ID;
v_ADMIN_TAB := recode_POI_NAME.POI_ADMIN_TAB;

--找出各市POI_TYPE_USE的值
v_Sql_Select := 'select distinct poi_type_use from '|| v_ADMIN_TAB ||' where poi_type_use is not null order by poi_type_use ';
OPEN cur_poi_type FOR v_Sql_Select;
LOOP
FETCH cur_poi_type INTO v_TYPE_USE;
EXIT WHEN cur_poi_type%NOTFOUND; --未查到数据退出
--DBMS_OUTPUT.PUT_LINE(v_TYPE_USE);

--创建各市POI_TYPE_USE表
v_Sql_Create := 'create table '||v_ADMIN_TAB||'_IDX_TYPE_USE'||v_TYPE_USE||' as select * from '|| v_ADMIN_TAB ||' where poi_type_use = '|| v_TYPE_USE ||' order by display desc ';
--dbms_output.put_line(v_Sql_Create);
execute immediate v_Sql_Create;
END LOOP;
CLOSE cur_poi_type;
END LOOP;

END;
...全文
767 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ammy_Jiang 2010-10-18
  • 打赏
  • 举报
回复
但是我第二个游标中的变量是要用第一个游标所fetch到的值
ACMAIN_CHM 2010-10-18
  • 打赏
  • 举报
回复
[Quote=MySQL 5.1参考手册]20.2.11. 光标
20.2.11.1.声明光标

20.2.11.2. 光标OPEN语句

20.2.11.3. 光标FETCH语句

20.2.11.4. 光标CLOSE语句

简单光标在存储程序和函数内被支持。语法如同在嵌入的SQL中。光标当前是不敏感的,只读的及不滚动的。不敏感意为服务器可以活不可以复制它的结果表。

光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。

例如:

CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;

REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;

CLOSE cur1;
CLOSE cur2;
END
20.2.11.1.声明光标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

SELECT语句不能有INTO子句。

20.2.11.2. 光标OPEN语句
OPEN cursor_name
这个语句打开先前声明的光标。

20.2.11.3. 光标FETCH语句
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。

20.2.11.4. 光标CLOSE语句
CLOSE cursor_name
这个语句关闭先前打开的光标。

如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。

[/Quote]
Ammy_Jiang 2010-10-18
  • 打赏
  • 举报
回复
就是 OPEN cur_poi_type FOR v_Sql_Select; 这就有问题,游标不知道在哪定义?还有在第二fetch中,如果fetch无数据时,该如何退出?
Ammy_Jiang 2010-10-18
  • 打赏
  • 举报
回复
我已经改了一些,但是不知道那个动态游标怎么使用?如下红色部分:

BEGIN
#Routine body goes here...
DECLARE v_CITY_ID varchar(20);
DECLARE v_ADMIN_TAB varchar(100);
DECLARE v_TYPE_USE INT;
DECLARE v_Sql_Select varchar(500);
DECLARE v_Sql_DELETE varchar(500);
DECLARE v_Sql_Create varchar(500);
DECLARE v_Sql_IDX varchar(500);
DECLARE v_Sql_Update varchar(500);

DECLARE cur_poi_name CURSOR FOR
SELECT CITY_ID,POI_ADMIN_TAB FROM POI_ADMIN_DEFINE
WHERE substr(CITY_ID,3,2) <> 00 ORDER BY 1;
OPEN cur_poi_name;
cursor_loop:LOOP
FETCH cur_poi_name INTO v_CITY_ID,v_ADMIN_TAB;

#用FETCH到的v_ADMIN_TAB找出各市POI_TYPE_USE的值
SET @v_Sql_Select = CONCAT('select distinct poi_type_use from ',v_ADMIN_TAB,' where poi_type_use is not null order by poi_type_use');
OPEN cur_poi_type FOR v_Sql_Select;
LOOP
FETCH cur_poi_type INTO v_TYPE_USE;

#创建各市POI_TYPE_USE表
SET @v_Sql_Create = CONCAT('create table ',v_ADMIN_TAB,'_IDX_TYPE_USE',v_TYPE_USE,' as select * from ',v_ADMIN_TAB,' where poi_type_use = ',v_TYPE_USE,'order by display desc');
PREPARE p_sql FROM @v_Sql_Create;
EXECUTE p_sql;
END LOOP;

END LOOP cursor_loop;
CLOSE cur_poi_name;
END
wwwwb 2010-10-18
  • 打赏
  • 举报
回复
动手做一下吧,有问题再问
ACMAIN_CHM 2010-10-18
  • 打赏
  • 举报
回复
建议先自己参考一下手册中的语法改一下,并不复杂。只不过费时间。
改的中间如果有什么问题,可以把你的语句和错误信息一起贴出来大家一起参考。

MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
Ammy_Jiang 2010-10-18
  • 打赏
  • 举报
回复
谢谢啦,我发了另个贴
WWWWA 2010-10-18
  • 打赏
  • 举报
回复
呵呵,发了两个帖子,要用到动态执行的方法来解决
ACMAIN_CHM 2010-10-18
  • 打赏
  • 举报
回复
做了个例子给你,自己参考一下吧。

delimiter //
create procedure x ()
begin
declare a,b,c,d int;
declare done int default 0;

DECLARE cur1 CURSOR FOR SELECT id FROM t1 where id<5;
DECLARE cur2 CURSOR FOR SELECT id,f1 FROM t2 where id=a;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur1;
WHILE done=0 DO
FETCH cur1 INTO a;
OPEN cur2;
FETCH cur2 INTO b,c;
CLOSE cur2;
select a,b,c;
END WHILE;
CLOSE cur1;
end//
delimiter ;

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧