Sql oracle过程的多值性

Sql oracle过程的多值性,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我想在Oracle 11g中使用p\u so\u code添加多值,其中so在(A,B,C)中 我尝试了使用replace(p_so_code,(',),(''',''),但没有成功。在p_so_代码中打破逗号分隔的值,返回多行值,然后在in子句中使用它 PROCEDURE get_one_so ( p_SO_CODE in String, RES OUT SYS_REFCURSOR ) AS BEGIN OPEN RES FOR SELECT

我想在Oracle 11g中使用
p\u so\u code
添加多值,其中
so在(A,B,C)


我尝试了使用
replace(p_so_code,(',),(''','')
,但没有成功。

在p_so_代码中打破逗号分隔的值,返回多行值,然后在
in
子句中使用它

PROCEDURE get_one_so (
     p_SO_CODE in String,
     RES OUT SYS_REFCURSOR
)
    AS
BEGIN
    OPEN RES FOR 

   SELECT
        so.so_code as SOCODE,
        cus.customer_code as CUSTOMERCODE,            
        cus.customer_name as CUSTOMERNAME,
        cus.email as EMAIL,            
        so.receiver_name as RECEIVERNAME,
        so.receiver_phone as RECEIVERPHONE,
        so.receiver_address as RECEIVERADDRESS,
        so.commment as COMMMENT,
        s.name as STAFFCREATE,     
                    to_char( so.CREATED_DATE,'dd/mm/yyyy') as CREATEDDATE,
        st.name as STAFFUPDATE,
        to_char(so.updated_date,'dd/mm/yyyy') as UPDATEDATE,
        sapp.name as STAFFAPPROVE,
       status,            
            so.reason_reject as REASONREJECT,
        so.payment as PAYMENY,
        to_char(so.send_date,'dd/mm/yyyy')   as SENDDATE,
        to_char(so.sended_date,'dd/mm/yyyy')   as SENDEDATE,
        so.staff_comment as STAFFCOMMENT
    FROM
        saleorders so join customer cus on so.customer_code = cus.customer_code
        left join saleorderDetail sod on so.so_code = sod.so_code
        left join staff s on so.staff_create = s.staff_code
        left join staff st on so.staff_update = st.staff_code
        left join staff sapp on so.STAFF_APPROVE = sapp.staff_code
    WHERE
        so.so_code IN (SELECT regexp_substr(p_so_code, '[^,]+', 1, LEVEL) 
                         FROM dual 
                      connect by regexp_substr(p_SO_CODE, '[^,]+', 1, level) is not null);

END;
说“这不管用”没有多大帮助;最好解释一下到底发生了什么以及为什么这不是你想要的。
p_so_code
是否必须是字符串,或者是否可以将参数的数据类型更改为集合??同样,它显示打开一个ref光标;以及如何使用集合。可能重复的
PROCEDURE get_one_so (
     p_SO_CODE in String,
     RES OUT SYS_REFCURSOR
)
    AS
BEGIN
    OPEN RES FOR 

   SELECT
        so.so_code as SOCODE,
        cus.customer_code as CUSTOMERCODE,            
        cus.customer_name as CUSTOMERNAME,
        cus.email as EMAIL,            
        so.receiver_name as RECEIVERNAME,
        so.receiver_phone as RECEIVERPHONE,
        so.receiver_address as RECEIVERADDRESS,
        so.commment as COMMMENT,
        s.name as STAFFCREATE,     
                    to_char( so.CREATED_DATE,'dd/mm/yyyy') as CREATEDDATE,
        st.name as STAFFUPDATE,
        to_char(so.updated_date,'dd/mm/yyyy') as UPDATEDATE,
        sapp.name as STAFFAPPROVE,
       status,            
            so.reason_reject as REASONREJECT,
        so.payment as PAYMENY,
        to_char(so.send_date,'dd/mm/yyyy')   as SENDDATE,
        to_char(so.sended_date,'dd/mm/yyyy')   as SENDEDATE,
        so.staff_comment as STAFFCOMMENT
    FROM
        saleorders so join customer cus on so.customer_code = cus.customer_code
        left join saleorderDetail sod on so.so_code = sod.so_code
        left join staff s on so.staff_create = s.staff_code
        left join staff st on so.staff_update = st.staff_code
        left join staff sapp on so.STAFF_APPROVE = sapp.staff_code
    WHERE
        so.so_code IN (SELECT regexp_substr(p_so_code, '[^,]+', 1, LEVEL) 
                         FROM dual 
                      connect by regexp_substr(p_SO_CODE, '[^,]+', 1, level) is not null);

END;