我在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 输入参数,从列表项中创建一个逗号分隔的字符串,然后将其发送到过程。这样做有两个问题:
- 我让我的网站容易受到 SQL 注入攻击
- 在我的存储过程中,我必须使用我想避免的 EXECUTE ('SELECT ...') 模式。
如何将这些列表项发送到存储过程并在 WHERE IN 子句中使用它们?我正在使用 ODP.NET,听说过 UDT,但不知道如何使用它。
一种方法可能是使用VARRAY
为了PARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN
参数并按照描述使用它here
但我不确定如何从 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)