函数如下:
CREATE OR REPLACE FUNCTION FUN_GET_ROLESOFUSER(v_emp_id in number , in_type in number) -- 获取当前用户所有角色
RETURN VARCHAR2 is
return_roles VARCHAR2(10240);
v_code varchar2(128);
v_name varchar2(128);
v_name_split varchar2(128);
v_code_split varchar2(128);
cursor role_cur is
select distinct r.ROLE_ID, r.ROLE_NAME from tbl_user_role ur join tbl_role r on ur.ROLE_ID = r.ROLE_ID
where ur.emp_id = v_emp_id;
BEGIN
-- in_type = 1 , 返回 角色name列表(逗号隔离)
-- in_type = 2 , 返回 角色id列表(逗号隔离)
return_roles:='';
v_name_split:='
';
v_code_split:=',';
open role_cur;
loop
fetch role_cur
into v_code, v_name;
exit when role_cur%notfound;
if in_type = 1 then
return_roles := return_roles || v_name ||v_name_split;
elsif in_type = 2 then
return_roles := return_roles || v_code ||v_code_split;
else
return_roles := return_roles || v_code ||v_code_split;
end if;
end loop;
close role_cur;
-- 去尾逗号
if in_type = 1 and length(v_name_split)>0 and length(return_roles)-length(v_name_split)>0 then
return_roles := substr(return_roles,0,length(return_roles)-length(v_name_split));
elsif in_type = 2 and length(v_code_split)>0 and length(return_roles)-length(v_code_split)>0 then
return_roles := substr(return_roles,0,length(return_roles)-length(v_code_split));
end if;
return(return_roles);
exception
when others then
return null;
END FUN_GET_ROLESOFUSER;
求大神指点,oracle函数转化为sql
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答
关注 你的Oracle函数主要用于获取指定用户的角色信息,并根据传入的in_type参数返回不同格式的角色列表。由于SQL Server(我猜测你可能需要将这个Oracle函数转化为SQL Server的函数),与Oracle在PL/SQL语法上有一些差异,我进行适当的调整。
下面是将你的Oracle函数转化为SQL Server的函数的尝试:CREATE FUNCTION dbo.FUN_GET_ROLESOFUSER ( @v_emp_id INT, @in_type INT ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @return_roles NVARCHAR(MAX); DECLARE @v_code NVARCHAR(128); DECLARE @v_name NVARCHAR(128); DECLARE @v_name_split NVARCHAR(128); DECLARE @v_code_split NVARCHAR(128); DECLARE role_cur CURSOR FOR SELECT DISTINCT r.ROLE_ID, r.ROLE_NAME FROM dbo.tbl_user_role ur JOIN dbo.tbl_role r ON ur.ROLE_ID = r.ROLE_ID WHERE ur.emp_id = @v_emp_id; SET @return_roles = N''; SET @v_name_split = CHAR(13) + CHAR(10); -- CRLF SET @v_code_split = N','; OPEN role_cur; FETCH NEXT FROM role_cur INTO @v_code, @v_name; WHILE @@FETCH_STATUS = 0 BEGIN IF @in_type = 1 SET @return_roles = @return_roles + @v_name + @v_name_split; ELSE SET @return_roles = @return_roles + @v_code + @v_code_split; FETCH NEXT FROM role_cur INTO @v_code, @v_name; END; CLOSE role_cur; -- 去尾逗号 IF @in_type = 1 AND LEN(@v_name_split) > 0 AND LEN(@return_roles) - LEN(@v_name_split) > 0 SET @return_roles = SUBSTRING(@return_roles, 1, LEN(@return_roles) - LEN(@v_name_split)); ELSE IF @in_type = 2 AND LEN(@v_code_split) > 0 AND LEN(@return_roles) - LEN(@v_code_split) > 0 SET @return_roles = SUBSTRING(@return_roles, 1, LEN(@return_roles) - LEN(@v_code_split)); RETURN @return_roles; END;
需要注意的是,这里的tbl_user_role 和 tbl_role 这两个表都位于 dbo 模式下,你需要根据实际情况修改为你的模式。此外,SQL Server中使用 LEN 函数而不是 LENGTH 函数来获取字符串的长度
解决 无用评论 打赏 举报
悬赏问题
- ¥15 c程序不知道为什么得不到结果
- ¥40 复杂的限制性的商函数处理
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置