2

以下に示すように、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 入力パラメータを設定し、リスト項目からコンマ区切りの文字列を作成して、プロシージャに送信できることを知っています。この方法を使用する場合、次の 2 つの懸念事項があります。

  1. Web サイトを SQL インジェクションに対して脆弱にしています
  2. 私のストアド プロシージャでは、避けたい EXECUTE ('SELECT ...') パターンを使用する必要があります。

これらのリスト項目をストアド プロシージャに送信し、WHERE IN 句内で使用するにはどうすればよいですか? 私は ODP.NET を使用しており、UDT について聞いたことがありますが、その使用方法がわかりません。

4

3 に答える 3

5

1 つの方法はVARRAYPARAM_THAT_WILL_BE _USED_INSIDE_WHERE_IN パラメーターに a を使用し、ここで
説明されているように使用すること です。ただし、c# から呼び出す方法はわかりません。

別の方法は、次のように、質問で述べたように csv で varchar2 を使用することですが、動的 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;
于 2012-11-27T09:04:02.293 に答える
2

このコンマ区切りの入力パラメーターを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)の懸念を回避できます。

于 2012-11-27T09:18:12.623 に答える
1

このシナリオでは、このように使用しました

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 値には、開いているクォートと閉じたクォート (') を含める必要があります。例: 「512,456,4564」

于 2015-12-30T08:28:34.917 に答える