我在 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 注入(inject)攻击
- 在我的存储过程中,我必须使用我想避免的 EXECUTE ('SELECT ...') 模式。
如何将这些列表项发送到存储过程并在 WHERE IN 子句中使用它们?我正在使用 ODP.NET 并听说过 UDT,但不知道如何使用它。
最佳答案
一种方法是对 PARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN 使用
参数并按说明使用它 here VARRAY
不过,我不确定如何从 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;
关于c# - 将一组值发送到 Oracle 过程以在 WHERE IN 子句中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580245/