为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM8
【操作系统】: LINUX
【CPU】:
【问题描述】*:
CREATE PROCEDURE "YGHM"."GETDEPTCHILDLIST"( "rootId" IN varchar(32) , "bshi" IN INT ) AS
done INT DEFAULT 0;
b varchar(4000) ;
cur1 CURSOR FOR SELECT subordinate_id FROM glb_dept_subordinate_mapping where dept_id=rootId;
BEGIN
IF bshi = 0 THEN
CREATE TEMPORARY TABLE IF NOT EXISTS tmpLst (sno int primary key auto_increment,aid varchar(32) );
DELETE FROM tmpLst;
END IF;
insert into tmpLst values (null,rootId);
SET @@max_sp_recursion_depth = 100;
OPEN cur1;
FETCH cur1 INTO b;
WHILE done=0 LOOP
CALL getDeptChildList(b,1);
FETCH cur1 INTO b; END LOOP;
CLOSE cur1;
EXCEPTION
WHEN NOTFOUND THEN SET done = 1;
END
问题1 SET @@max_sp_recursion_depth = 100;
问题2 CREATE TEMPORARY TABLE IF NOT EXISTS tmpLst
(sno int primary key auto_increment,aid varchar(32));
问题3 第 8 行附近出现错误:无效的表或视图名[tmpLst]
--需要先创建会话级临时表
create global temporary table tmplst(sno int primary key,aid varchar(32)) on commit preserve rows;
--临时表不支持自增,创建序列来实现
create sequence seq_tmp INCREMENT BY 1 START WITH 1 NOMAXVALUE NOMINVALUE NOCACHE;
--改写后,可参考
CREATE or replace PROCEDURE getdeptchildlist( rootId IN varchar(32) , bshi IN INT ) AS
b varchar(4000) ;
CURSOR cur1 is SELECT subordinate_id FROM glb_dept_subordinate_mapping where dept_id=rootId;
BEGIN
IF bshi = 0 THEN
execute immediate 'truncate table tmpLst';
END IF;
insert into tmpLst values (seq_tmp.nextval,rootId);
commit;
OPEN cur1;
LOOP
FETCH cur1 INTO b;
exit when cur1%notfound;
CALL getDeptChildList(b,1);
END LOOP;
CLOSE cur1;
EXCEPTION
WHEN others THEN
print(sqlcode||','||sqlerrm);
END;
MySQL的PL SQL语法和达梦差别太大,需要根据逻辑按照达梦的语法重写。
详细的语法可以参考DM8_SQL程序设计.pdf文档。