发送值的阵列来Oracle过程中使用WHERE子句IN(Sending an array of va

2019-06-21 07:43发布

我有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;

在ASP.NET应用程序方面我有几个选项的选择元素。 我想在我的WHERE子句中使用这些列表项。 我知道,我可以有一个VARCHAR2输入参数在我的存储过程,从列表中的项目做一个逗号分隔字符串,将其发送到程序。 有两个问题与打算是这样的:

  1. 我要让我的网站容易受到SQL注入
  2. 在我的存储过程我必须使用EXECUTE(“SELECT ...”)模式,我想避免的。

我怎么能这些列表项目发送到存储过程和使用它们的WHERE IN子句里面? 我使用ODP.NET并听取UDT的,但不知道如何使用它。

Answer 1:

您可以添加这个逗号分隔的输入参数为VARCHAR()和使用以下WHERE语句:

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

例如,如果PARAM_THAT_WILL_BE='2,3,4,5'col1=3 ,我们得到:

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

如果COL1值是在此列表中它是真实的。 在这里,所以你避免担忧你不使用动态查询1)和2)。



Answer 2:

一种方法可以是使用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;


Answer 3:

对于这种情况,我用这样的

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;

该值应包含开放式和封闭式qutoes(')。 EX:“512,456,4564”如果一个值“512”这样的



文章来源: Sending an array of values to Oracle procedure to use in WHERE IN clause