Sending an array of values to Oracle procedure to use in WHERE IN clause

后端 未结 3 1702
时光说笑
时光说笑 2020-11-27 23:27

I have a stored procedure in Oracle as shown below:

CREATE PROCEDURE MY_TEST_PROC(
  CUR OUT SYS_REFCURSOR,
  PARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN
)
AS
B         


        
相关标签:
3条回答
  • 2020-11-27 23:43

    One way could be to use a VARRAY for the PARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN parameter and use it as described here
    I'm not sure, though, how to call it from c#.

    Another way is to use varchar2 with a csv as you stated in your question but without dynamic sql, like this:

    CREATE PROCEDURE MY_TEST_PROC(
      CUR OUT SYS_REFCURSOR,
      PARAM_THAT_WILL_BE varchar2)
    AS
    BEGIN
      OPEN CUR FOR 
        SELECT * 
          FROM MY_TABLE 
         WHERE COL1 IN (
            select regexp_substr(PARAM_THAT_WILL_BE, '[^,]+',1,level) p
              from dual t
           connect by level <= regexp_count(PARAM_THAT_WILL_BE, ',') + 1
    )
    END;
    
    0 讨论(0)
  • 2020-11-27 23:44

    You can add this comma separated input parameter as a varchar() and use following where statement:

    where (','||PARAM_THAT_WILL_BE||',' like '%,'||COL1||',%')
    

    for example if PARAM_THAT_WILL_BE='2,3,4,5' and col1=3 we get:

    where (',2,3,4,5,' like '%,3,%') 
    

    and it's TRUE if COL1 value is in this list. Here you don't use a dynamic query so you avoid concerns 1) and 2).

    0 讨论(0)
  • 2020-11-27 23:53

    For this scenario i used like this

    CREATE PROCEDURE MY_TEST_PROC(CUR OUT SYS_REFCURSOR,A in VARCHAR2 ) AS BEGIN OPEN CUR FOR SELECT * FROM MY_TABLE WHERE COL1 IN (SELECT REGEXP_SUBSTR(**A**,'[^,]+', 1, LEVEL) FROM DUAL CONNECT BY REGEXP_SUBSTR(**A**, '[^,]+', 1, LEVEL) IS NOT NULL) END;

    The A value should contain open and closed qutoes('). EX: '512,456,4564' if it one value '512' like this

    0 讨论(0)
提交回复
热议问题