将值数组发送到Oracle过程以在WHERE IN子句中使用
我在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应用程序端,我有一个包含多个选项的select元素。 我想在WHERE子句中使用这些列表项。 我知道我可以在我的存储过程中有一个VARCHAR2输入参数,从列表项中创建一个逗号分隔的字符串,然后将其发送到过程。 这样做有两个问题:
- 我使我的网站容易受到SQL注入攻击
- 在我的存储过程中,我必须使用我想避免的EXECUTE(’SELECT …’)模式。
如何将这些列表项发送到存储过程并在WHERE IN子句中使用它们? 我正在使用ODP.NET并听说过UDT但不知道如何使用它。
您可以将此逗号分隔的输入参数添加为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值在此列表中,则为TRUE。 在这里,您不使用动态查询,因此您可以避免关注1)和2)。
一种方法是使用VARRAY
作为PARAM_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;
对于这种情况,我使用这样的
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;
A值应包含开放和封闭的qutoes(’)。 EX:’512,456,4564’,如果它像这样一个值’512′
- HttpRuntime Cache与静态字典/字段
- ASP.NET WebService使用XML标记包装我的JSON响应
- ASP.Net GridView不显示页码
- UpdatePanel中的ASP.NET FileUpload – 仍然无法正常工作
- “未找到数据源名称且未指定默认驱动程序”错误
- 在asp.net中排序gridview的列c#
- ASP.NET MVC:Tabs ASCX – 根据当前页面调整CSS类?
- ASP.default_aspx’不包含’IssuesGrid_OnItemUpdated’的定义,也没有扩展方法’IssuesGrid_OnItemUpdated’
- ASP.NET Core中的目录服务和帐户管理问题