2016-08-25 57 views
0

enter image description hereOracle使用pl/sql添加程序

该程序如下所示! 我是oracle新手。当我将sqlserver过程复制到oracle并更改一些部分。这将是一个伟大的thxs帮助我解决这个问题!

CREATE OR REPLACE PROCEDURE SP_GetAdminResource 
(
AdminId IN NVARCHAR2, 
p_ResultSet  OUT sys_refcursor 
) 
AS 
BEGIN 
WITH T AS(
    SELECT T1.ResId, T1.UpResId 
     FROM SYS_Resource T1 
    WHERE T1.IsActive = 1 
     AND T1.ResId IN (SELECT DISTINCT T2.ResId 
          FROM SYS_RoleResource T2 
         WHERE T2.RoleId IN 
           (SELECT T3.RoleId 
            FROM SYS_RoleAdministrator T3, SYS_Role T10 
           WHERE T10.RoleId = T3.RoleId 
            AND T10.IsActive = 1 
            AND T3.AdminId = AdminId))), 
    TT AS (SELECT * 
       FROM T 
      UNION ALL (SELECT T4.ResId, T4.UpResId 
         FROM SYS_Resource T4, T 
         WHERE T4.IsActive = 1 
         AND T4.ResId = T.UpResId)), 
     SELECT T5.ResId, T5.UpResId, T5.ResIcon,T5.ResName, T5.ResUrl,T5.OrderNum,T8.ActionCode 
     FROM SYS_Resource T5 INTO p_ResultSet 
     LEFT JOIN (SELECT T6.ResId, T6.ActionCode 
       FROM SYS_RoleResource T6 
       WHERE T6.RoleId IN 
        (SELECT T7.RoleId 
         FROM SYS_RoleAdministrator T7, SYS_Role T9 
         WHERE T9.RoleId = T7.RoleId 
         AND T9.IsActive = 1 
         AND T7.AdminId = AdminId)) T8 ON T5.ResId = 
                 T8.ResId 
     WHERE T5.IsActive = 1 
     AND T5.ResId IN (SELECT DISTINCT TT.ResId FROM TT) 
     ORDER BY T5.OrderNum ASC, T5.ResName ASC; 


END SP_GetAdminResource; 
+0

ORA-00903是无效的表名称。你确定'SYS_Resource'存在,你有权访问它吗?它与用户的模式是否相同?你有同义词吗? 'AND T4.ResId = T.UpResId')' – vercelli

+1

''FROM SYS_Resource T5 INTO p_ResultSet'在'select语句'后移动'INTO p_ResultSet'语法错误 –

+0

PROCEDURE的编译错误WSBDSZ.SP_GETADMINRESOURCE 错误:PL/SQL:ORA-00933:SQL SQL语句还没有结束正确 线:27 文本:从SYS_RESOURCE T5 INTO p_ResultSet 错误:PL/SQL:SQL语句忽略 线:8 文字:以T AS – ray

回答

0

检查下面的程序的工作版本。我已经把我的意见放在了两者之间。请通过它并据此工作。

CREATE OR REPLACE PROCEDURE SP_GetAdminResource 
(
AdminId   IN NVARCHAR2, 
p_ResultSet  OUT sys_refcursor 
) 
AS 
BEGIN 

Open p_ResultSet for -- this is the way to use refcursor in your procedure 
WITH T AS(
    SELECT T1.ResId, T1.UpResId 
     FROM SYS_Resource T1 
    WHERE T1.IsActive = 1 
     AND T1.ResId IN (SELECT DISTINCT T2.ResId 
          FROM SYS_RoleResource T2 
         WHERE T2.RoleId IN 
           (SELECT T3.RoleId 
            FROM SYS_RoleAdministrator T3, SYS_Role T10 
           WHERE T10.RoleId = T3.RoleId 
            AND T10.IsActive = 1 
            AND T3.AdminId = t2.AdminId))), ----Check which AdminId need to be joined.I joined it with T2 
    TT AS (SELECT T.ResId, T.UpResId 
       FROM T 
      UNION ALL (SELECT T4.ResId, T4.UpResId 
         FROM SYS_Resource T4, T 
         WHERE T4.IsActive = 1 
         AND T4.ResId = T.UpResId)) 
         -- ,         ----Extra Need to remove it 
     SELECT T5.ResId, 
       T5.UpResId 
--    T5.ResIcon, ---Uncomment these columns in your query, I just made tables to test without these columns. 
--    T5.ResName, 
--    T5.ResUrl, 
--    T5.OrderNum, 
--    T8.ActionCode 
     FROM SYS_Resource T5 
    --  INTO p_ResultSet  -------------------------------No need to fetch into sysrefcursor. 
     LEFT JOIN (SELECT T6.ResId, T6.ActionCode 
       FROM SYS_RoleResource T6 
       WHERE T6.RoleId IN 
        (SELECT T7.RoleId 
         FROM SYS_RoleAdministrator T7, SYS_Role T9 
         WHERE T9.RoleId = T7.RoleId 
         AND T9.IsActive = 1 
         AND T7.AdminId = t6.AdminId)) T8 ON T5.ResId = ------Check which AdminId need to be joined.I joined it with T6 
                 T8.ResId 
     WHERE T5.IsActive = 1 
     AND T5.ResId IN (SELECT DISTINCT TT.ResId FROM TT) 
     ORDER BY T5.OrderNum ASC, T5.ResName ASC ; 


END SP_GetAdminResource;