2016-08-25 5 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'が存在し、あなたはそれにアクセスできますか?それはあなたのユーザーと同じスキーマにありますか?あなたは同義語を持っていますか? – vercelli

+1

は) 'とT4.ResId = T.UpResId)の後に、カンマを削除' –

+1

と 'PROCEDUREの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;