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

Posted

技术标签:

【中文标题】在 PL/SQL 存储过程中将表作为参数传递【英文标题】:Pass table as parameter in PL/SQL stored procedure 【发布时间】:2016-12-06 16:10:44 【问题描述】:

请原谅任何措辞不佳的问题,因为我对 PL/SQL 和 Oracle 的经验很少。但是,我目前不知道如何将表作为参数传递。目前,此过程输出与指定输入匹配的一个条目。例如,如果贸易产品=a,贸易地区=c,交易对手地区=b,交易台=d,贸易法人=e,对冲产品=f,对冲法人=g,那么它返回这个唯一的组合。但是,我希望能够为每个参数分配多个值并返回所有结果。例如,基于前面的示例,如果我指定对冲法人 = g 或 h,那么我希望看到 2 个条目 -"a,c,b,d,e,f,g" AND "a, c、b、d、e、f、h"。我相信这是通过将我的参数类型更改为 varchar2 表而不是单个 varchar2 来完成的。非常感谢任何见解。

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;

/

【问题讨论】:

passing in table name as plsql parameter的可能重复 【参考方案1】:

如果我必须创建一个带有表名变量和 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; 

【讨论】:

以上是关于在 PL/SQL 存储过程中将表作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 循环遍历表并将行的每个条目传递给存储过程

在存储过程中将输入参数作为值传递

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

oracle-PL/SQL2

oracle pl/sql 存储过程