为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:win11
【CPU】:
【问题描述】*:在把sqlServer函数变成DM函数的时候,已经设置了返回表类型,但是后面在插入的报错不存在这个表。
这是原函数
returns @t
table(
ID varchar(255),
ParentID varchar(255),
Level int,
name varchar(255),
huiZong varchar(255),
nature varchar(255),
sort decimal(10)
)
as
begin
declare @i int ---定义一个int变量
set @i = 1 ---设置变量值
-- insert into @t select @ID,@ID,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作
insert into @t select ID,Parent_ID, 0 ,name,a.huiZong,a.nature,a.sort from sys_office a where id = @ID and del_flag = '0'
insert into @t select ID,Parent_ID, @i ,name,a.huiZong,a.nature,a.sort from sys_office a where huiZong = @ID and del_flag = '0'
while @@rowcount<>0 --循环条件
begin
set @i = @i + 1 --自增
insert into @t ---插入到哦变量中
select
a.ID,a.Parent_ID,@i,a.name,a.huiZong,a.nature,a.sort
from
sys_office a,@t b
where a.del_flag='0'
and a.huiZong=b.ID and b.Level = @i-1
and a.huiZong is not null
end
return
end
go
这是更改为dm后的函数
RETURN IAAUDIT.TYPE_TABLE_FINDOFFICE
AUTHID DEFINER
AS
i INT:=1;
BEGIN
INSERT INTO TYPE_TABLE_FINDOFFICE SELECT ID, PARENT_ID, 0, NAME,HUIZONG,NATURE,SORT FROM SYS_OFFICE a WHERE ID = "ID" and DEL_FLAG = '0';
INSERT INTO TYPE_TABLE_FINDOFFICE SELECT ID, PARENT_ID, i, NAME,HUIZONG,NATURE,SORT FROM SYS_OFFICE a WHERE HUIZONG = "ID" and DEL_FLAG = '0';
LOOP
i := i + 1;
EXIT WHEN SQL%ROWCOUNT = 0;
SELECT a.ID, a.PARENT_ID, i, a.NAME,a.HUIZONG,a.NATURE,a.SORT
FROM SYS_OFFICE a, TYPE_TABLE_FINDOFFICE b
WHERE a.DEL_FLAG = '0' AND a.HUIZONG = b.ID AND b.LEVEL = i-1 and a.HUIZONG IS NOT NULL;
END LOOP;
RETURN;
END;
报错信息为第8行,TYPE_TABLE_FINDOFFICE不存在
小白第一次用dm,希望大佬给解答一下。感谢!
你这函数看样子像是个递归遍历查询啊
你试试是下面这样的么
SELECT ID,PARENT_ID AS PARENTID,LEVEL,NAME,HUIZONG,NATURE,SORT
FROM (SELECT *
FROM SYS_OFFICE
WHERE DEL_FLAG = '0'
) A
START WITH ID = V_ID --V_ID 是你要查询的层次结构起始值
CONNECT BY HUIZONG = PRIOR ID
达梦不会自动创建临时表,先要创建一个table类型,达梦的存储过程、函数语法和oracle类似,建议返回一个table类型或者引用游标的方式来做