0

現在、SQLクエリをストアドプロシージャに変換しようとしていますが、文字列の比較に関しては変換が困難です。

以下は私のC#アプリケーションのSQLコードです。

String Query = @"select label
, marking
from
(
select count(equipment) as num_equipments
from CS_PM_EQUI_INFO
where " + Perspective + " = '" + Workcenter + @"'
)

以下は、ストアドプロシージャに変換しようとしたものです。

begin  
    stmt := '
    select label
    , marking
          from
    ( 
    select count(equipment) as num_equipments         
    from CS_PM_EQUI_INFO         
    where '|| perspective ||' = '||' Workcenter '||'
    )

私はそれを正しくやっていますか?パースペクティブとワークセンターを比較しようとしています。どちらも文字列パラメーターです。例:ワークセンターの値はABCです。ここで、perspective='ABC'です。

返される結果は望ましいものではないので、親切にこれを手伝ってください。

どうもありがとう。

4

1 に答える 1

1

まず、既存のコードにSQLインジェクションの脆弱性があります。変数の値WorkcenterはSQLステートメントに埋め込まれていますが、バインド変数を使用する必要があります。Perspective列の名前も含まれているため、SQLインジェクションの試行が含まれていないことを確認する必要があります(dbms_assertパッケージはこれに適しています)。

次に、サブクエリに存在しない外部クエリの列を選択しているときに、既存のクエリがどのように機能しているかがわかりません。

実際の解決策として、Oracleストアドプロシージャでは、次のようなことができます。

function my_func(my_column in varchar2, my_value in varchar2) return varchar2 is
  q varchar2(1000);
  return_value varchar2(1000);
begin
  q := 'select other_column from my_table where ' || my_column || ' = :my_value';

  execute immediate q into return_value using my_value;

  return return_value;
end my_func;

my_columnエンドユーザーが指定できる場合(つまり、コード内の定数からではない場合)、を使用dbms_assert.simple_sql_nameして、文字列が安全に使用できることを表明する必要があります。

于 2013-02-27T10:33:36.433 に答える