新手上路343 2017-04-13 10:06 采纳率: 0%
浏览 399

求大神指点,oracle函数转化为sql

函数如下:
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;

  • 写回答

1条回答 默认 最新

  • 星川皆无恙 大数据领域优质创作者 2023-11-30 11:45
    关注

    你的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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器