将值数组发送到Oracle过程以在WHERE IN子句中使用

Mik*_*yev 2 c# csv asp.net oracle stringtokenizer

我在Oracle中有一个存储过程,如下所示:

CREATE PROCEDURE MY_TEST_PROC(
  CUR OUT SYS_REFCURSOR,
  PARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN
)
AS
BEGIN
  OPEN CUR FOR 
    SELECT * 
      FROM MY_TABLE 
     WHERE COL1 IN (here I want to put values received from C#)
END;
Run Code Online (Sandbox Code Playgroud)

在ASP.NET应用程序端,我有一个包含多个选项的select元素.我想在WHERE子句中使用这些列表项.我知道我可以在我的存储过程中有一个VARCHAR2输入参数,从列表项中创建一个逗号分隔的字符串,然后将其发送到过程.这样做有两个问题:

  1. 我使我的网站易受SQL注入攻击
  2. 在我的存储过程中,我必须使用我想避免的EXECUTE('SELECT ...')模式.

如何将这些列表项发送到存储过程并在WHERE IN子句中使用它们?我正在使用ODP.NET并听说过UDT,但不知道如何使用它.

A.B*_*ade 5

一种方法可以是使用VARRAYPARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN 参数,并把它作为描述在这里
我不知道,但是,如何将它从C#调用.

另一种方法是使用varchar2和csv,如你在问题中所述但没有动态sql,如下所示:

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;
Run Code Online (Sandbox Code Playgroud)