传递表作为PL/SQL存储过程中的参数

问题描述:

请原谅任何错误的问题,因为我对PL/SQL和Oracle有很少的经验。但是,我目前还不知道如何传递一个表作为参数。目前,此过程输出与指定输入匹配的一个条目。例如,如果交易产品= a,交易区域= c,交易对手区域= b,交易平台= d,交易法律实体= e,对冲产品= f和对冲法律实体= g,则返回这种独特的组合。但是,我希望能够为每个参数分配多个值并返回所有结果。例如,根据前面的例子,如果我指定对冲法律实体= g或h,那么我想看到2个条目 - “a,c,b,d,e,f,g”和“a, C,b,d,E,F,H”。我相信这是通过将我的参数类型更改为varchar2s表而不是单个varchar2来完成的。任何见解都非常感谢。传递表作为PL/SQL存储过程中的参数

CREATE OR REPLACE PROCEDURE SOX_SCOPING.BM_ENTIRE_TABLE_ARRAY_PARAMS (
trade_product in varchar2 
, trade_region in varchar2 
, counterparty_region in varchar2 
, trade_desk in varchar2 
, trade_legal_entity in varchar2 
, hedge_product in varchar2 
, hedge_legal_entity in varchar2 
, out_cursor out sys_refcursor) IS 

BEGIN 

open out_cursor for 
SELECT D.PRODUCTS AS TRADE_PRODUCTS, D.TRADER_REGION, D.REGION, D.DESK AS TRADE_DESK, D.LEGAL_ENTITY AS TRADE_LEGAL_ENTITY,F.PRODUCTS AS HEDGE_PRODUCTS, F.LEGAL_ENTITY AS HEDGE_LEGAL_ENTITY 
FROM 
(SELECT C.*, BM_LEGAL_ENTITY.LEGAL_ENTITY 
FROM 
    (SELECT B.*, BM_DESK.DESK 
    FROM 
     (SELECT * 
     FROM 
      (SELECT BM_PRODUCTS.*,BM_TRADER_REGION.REGION AS TRADER_REGION 
      FROM SOX_SCOPING.BM_PRODUCTS 
      CROSS JOIN SOX_SCOPING.BM_TRADER_REGION) 
     CROSS JOIN SOX_SCOPING.BM_COUNTERPARTY_REGION) B 
    LEFT OUTER JOIN SOX_SCOPING.BM_DESK 
    ON B.PRODUCTS = BM_DESK.DESK_TO_PRODUCT) C 
LEFT OUTER JOIN BM_LEGAL_ENTITY 
ON C.DESK = BM_LEGAL_ENTITY.LEGAL_ENTITY_TO_DESK) D 
CROSS JOIN (
SELECT E.*,BM_LEGAL_ENTITY.LEGAL_ENTITY 
FROM 
    (SELECT BM_PRODUCTS.*,BM_DESK.DESK 
    FROM SOX_SCOPING.BM_PRODUCTS 
    LEFT OUTER JOIN SOX_SCOPING.BM_DESK 
    ON BM_PRODUCTS.PRODUCTS = BM_DESK.DESK_TO_PRODUCT) E 
LEFT OUTER JOIN BM_LEGAL_ENTITY 
ON E.DESK = BM_LEGAL_ENTITY.LEGAL_ENTITY_TO_DESK) F 
where 
d.products in (trade_product)  
and D.TRADER_REGION in (trade_region) 
and D.REGION in (counterparty_region) 
and D.DESK in (trade_desk) 
and D.LEGAL_ENTITY in (trade_legal_entity) 
and F.PRODUCTS in (hedge_product) 
and F.LEGAL_ENTITY in (hedge_legal_entity) 
ORDER BY TRADE_PRODUCTS, TRADER_REGION,REGION,TRADE_DESK,HEDGE_PRODUCTS,HEDGE_LEGAL_ENTITY; 


    EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    NULL; 
WHEN OTHERS THEN 
    -- Consider logging the error and then re-raise 
    RAISE; 
END BM_ENTIRE_TABLE_ARRAY_PARAMS; 

/

+0

[在表名传递作为参数PLSQL]的可能的复制(http://*.com/questions/27592366/passing-in-table-name-as-plsql-parameter) – Dmitry

这是我会写,如果我不得不创建一个表名的变量和OUT参数作为SYS_REFCURSOR程序的方式。希望你能适应你的代码。

CREATE OR replace PROCEDURE PROC_ONE(vstablename VARCHAR2, 
            c1   OUT SYS_REFCURSOR) 
IS 
sqlstmt VARCHAR2(255); 
BEGIN 
sqlstmt := 'select * from ' 
      ||vstablename; 

OPEN c1 FOR sqlstmt; 
END;