简体   繁体   English

将Oracle查询转换为SQL Server Reporting Services(SSRS)的存储过程

[英]Convert oracle query to stored procedure for SQL Server Reporting Services (SSRS)

How can I convert this query to a stored procedure that returns also the same(fields) table: 如何将该查询转换为还返回相同(字段)表的存储过程:

SELECT   R.REGION_NAME,
           TP.TERRITORY_NAME,
           LSC.LOOKUP_NAME,
           CAST (WM_CONCAT (CM.CUST_NAME) AS VARCHAR2 (500)) AS CUST_NAMES,
           TP.VIEWER_PROFILE,
           TP.CASTING_PREFERENCE,
           TP.PROG_TYPE_PREFERENCE,
           STN_LIST.STN_NAMES,
           STN_LIST.LIC_RIGHTS
    FROM               TERRITORY_PROFILE_MSTR TP
                    INNER JOIN
                       REGION_MSTR R
                    ON TP.REGION_ID = R.REGION_ID
                 LEFT OUTER JOIN
                    LOOKUP_SUB_CATEGORY LSC
                 ON TP.BROADCAST_STD_CD = LSC.LOOKUP_SUB_CAT_ID
              LEFT OUTER JOIN
                 CUST_MSTR CM
              ON CM.TERRITORY_ID = TP.TERRITORY_ID
           LEFT OUTER JOIN
              (SELECT   CAST (WM_CONCAT (SLR.CUST_STN_NAME) AS VARCHAR2 (500))
                             AS STN_NAMES,
                          CAST (WM_CONCAT (LRM.LIC_RIGHTS_ID) AS VARCHAR2 (500))
                             AS LIC_RIGHTS,
                          SLR.CUST_COMPETITOR_ID AS CUST_ID
                   FROM   STN_LIC_RIGHTS SLR, LIC_RIGHTS_MSTR LRM
                  WHERE   SLR.STN_LIC_ID = LRM.LIC_RIGHTS_ID
               GROUP BY   SLR.CUST_COMPETITOR_ID) STN_LIST
           ON STN_LIST.CUST_ID = CM.CUST_ID
   WHERE   TP.TERRITORY_ID <> 0
GROUP BY   TP.TERRITORY_NAME,
           R.REGION_NAME,
           LSC.LOOKUP_NAME,
           STN_LIST.STN_NAMES,
           STN_LIST.LIC_RIGHTS,
           TP.VIEWER_PROFILE,
           TP.CASTING_PREFERENCE,
           TP.PROG_TYPE_PREFERENCE
ORDER BY   R.REGION_NAME, TP.TERRITORY_NAME

I think I don't need to specify the table structure. 我想我不需要指定表结构。 Please take note that the query is fully functional and the values are correctly return the way I expect it to return. 请注意,该查询功能齐全,并且值正确返回了我希望它返回的方式。

Thank you. 谢谢。

UPDATE: 更新:

The stored procedure must be compatible and executable in ASP.NET(C#) through SQL Server Reporting Services or SSRS. 该存储过程必须是兼容的,并且可以通过SQL Server Reporting Services或SSRS在ASP.NET(C#)中执行。

There are a few ways to do what you're asking: 有几种方法可以满足您的要求:

  1. By using a function / procedure which returns a sys_refcursor as described here 通过使用返回此处描述的sys_refcursor的函数/过程
  2. By using a "parameterized view" as described here 通过使用此处所述的“参数化视图”
  3. By using a table functions as described here 通过使用此处所述的表函数

and probably more... 可能还有更多...

You can create a PL SQL procedure that returns a ref cursor. 您可以创建一个返回引用游标的PL SQL过程。

CREATE OR REPLACE
PROCEDURE foo(p_terr_id IN TERRITORY_PROFILE_MSTR.TERRITORY_ID%TYPE, 
  p_recordset out SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN p_recordset FOR
    /* Your SQL here */
END foo;
/

More details and examples here 此处有更多详细信息和示例

Nobody mentioned any alternative to my question like the use of Oracle VIEWS . 没有人提到我的问题的替代方案,例如使用Oracle VIEWS

Instead of creating a stored procedure for my SSRS reports, I can use VIEWS though they don't have any parameters, it answers my question. 除了可以为我的SSRS报告创建存储过程之外,我还可以使用VIEWS尽管它们没有任何参数,但可以回答我的问题。

For future reference here's the code: 以下代码是供将来参考:

CREATE VIEW RV_TERRITORY_PROFILE
AS
SELECT   R.REGION_NAME,
           TP.TERRITORY_NAME,
           LSC.LOOKUP_NAME,
           CAST (WM_CONCAT (CM.CUST_NAME) AS VARCHAR2 (500)) AS CUST_NAMES,
           TP.VIEWER_PROFILE,
           TP.CASTING_PREFERENCE,
           TP.PROG_TYPE_PREFERENCE,
           STN_LIST.STN_NAMES,
           STN_LIST.LIC_RIGHTS
    FROM               TERRITORY_PROFILE_MSTR TP
                    INNER JOIN
                       REGION_MSTR R
                    ON TP.REGION_ID = R.REGION_ID
                 LEFT OUTER JOIN
                    LOOKUP_SUB_CATEGORY LSC
                 ON TP.BROADCAST_STD_CD = LSC.LOOKUP_SUB_CAT_ID
              LEFT OUTER JOIN
                 CUST_MSTR CM
              ON CM.TERRITORY_ID = TP.TERRITORY_ID
           LEFT OUTER JOIN
              (SELECT   CAST (WM_CONCAT (SLR.CUST_STN_NAME) AS VARCHAR2 (500))
                             AS STN_NAMES,
                          CAST (WM_CONCAT (LRM.LIC_RIGHTS_ID) AS VARCHAR2 (500))
                             AS LIC_RIGHTS,
                          SLR.CUST_COMPETITOR_ID AS CUST_ID
                   FROM   STN_LIC_RIGHTS SLR, LIC_RIGHTS_MSTR LRM
                  WHERE   SLR.STN_LIC_ID = LRM.LIC_RIGHTS_ID
               GROUP BY   SLR.CUST_COMPETITOR_ID) STN_LIST
           ON STN_LIST.CUST_ID = CM.CUST_ID
   WHERE   TP.TERRITORY_ID <> 0
GROUP BY   TP.TERRITORY_NAME,
           R.REGION_NAME,
           LSC.LOOKUP_NAME,
           STN_LIST.STN_NAMES,
           STN_LIST.LIC_RIGHTS,
           TP.VIEWER_PROFILE,
           TP.CASTING_PREFERENCE,
           TP.PROG_TYPE_PREFERENCE
ORDER BY   R.REGION_NAME, TP.TERRITORY_NAME

then you can run it like 然后你可以像运行它

SELECT * FROM RV_TERRITORY_PROFILE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM