c# - 将一组值发送到 Oracle 过程以在 WHERE IN 子句中使用

标签 c# asp.net oracle csv 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;

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

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

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

最佳答案

一种方法是对 PARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN 使用 VARRAY 参数并按说明使用它 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;

关于c# - 将一组值发送到 Oracle 过程以在 WHERE IN 子句中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580245/

相关文章:

c# - 将查询转换为字符串时出错

c# - 如何测试与 ModelState 一起使用的 ActionFilterAttribute?

c# - 如何只发送指定字段? (并非页面中的所有字段!)

Javascript 变量的 “Value” 属性未出现在 Intellisense Insted 显示值中

sql - 可以在 Oracle 的 SELECT 中执行自动编号序列吗?

c# - serilog通过.net核心中的记录器引用为对象建立索引

c# - .net core 3,MVC,使用端点路由时不支持使用 'UseMvcWithDefaultRoute' 配置 MVC

javascript - 使用 javascript 将面板设置为可见

oracle - NOT IN 运算符在 Oracle 中未按预期工作

SQL——两个结果相除