2016-08-25 1 views
0

enter image description hereOracle pl/sql을 사용하는 절차 추가

절차는 아래와 같습니다! oracle을 처음 사용했습니다. sqlserver 프로 시저를 Oracle로 복사하고 일부분을 변경하면됩니다. 내가 이것을 해결하는 데 도움이 될 것입니다!

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'가 존재하고 그것에 접근 할 수 있습니까? 사용자와 동일한 스키마에 있습니까? 동의어가 있습니까? – vercelli

+1

제거 쉼표 후'와 T4.ResId = T.UpResId))' –

+1

당신은 후 p_ResultSet' INTO SYS_Resource T5 INTO p_ResultSet' 이동'로부터'절차의 WSBDSZ.SP_GETADMINRESOURCE 에 대한 statement' –

답변

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; 
관련 문제