1

このタスクを達成する方法を知りたいです。CASE、DECODE、または IF 条件を確認しましたが、機能させることができません。私の目標は、ASP.NET データから構築された定義済みの列/値のペアのブロックを Oracle ストアド プロシージャに渡すことです。更新を必要としない他の列を保持するために、多くの列のうち特定の列のみを更新しようとしています。だからここに私のセットアップがあります:

ストアド プロシージャ:

UpdateSelectedColumns(myValuePairString, updatedBy)

-- Passed variable from ASP.NET, myValuePairString = 'col1 = 10,col2 = 'Dog''

-- update statement final
UPDATE MyTable   
       SET
       col1 = 10,
       col2 = 'Dog'
       col3 = 'john';
COMMIT;

前もって感謝します...

リッキー

4

1 に答える 1

1

一度、ストアド プロシージャを使用しないことをお勧めします。ここでは、ストアド プロシージャを使用しても意味がありません。

ストアド プロシージャはその引数をやみくもに受け入れ、値を追加せずに更新を実行します。さらに、この手順を使用すると、バインドの使用が妨げられ、バグ (引用符で囲まれた値に遭遇するたび')、パフォーマンス ヒット、および SQL インジェクションの脆弱性にさらされます。

PL/SQL の利点 (単純な透過的なバインディング、カーソルの透過的な使用と再利用、厳密な静的 SQL 解析、およびメタデータの依存性) は、任意の文字列を引数として取り、それを動的カーソルに配置すると、すべて無意味になります。

言語ネイティブのカーソルを使用し、バインド変数を使用することをお勧めします。

本当に PL/SQL を使用したい場合は、単一の引数をいくつかのテーブルに置き換えてください。1 つは列名用、もう 1 つは変数値用です。DBMS_SQLその後、ステートメントを解析し、適切なバインド変数を使用するために使用できます。日付、数値、および文字の値を解析できるようにするには、何らかの規則が必要です。データ型を確認するには、データベースからメタデータを読み取る必要があります。これは、価値のない多くのコードになります。

于 2012-11-20T15:03:22.403 に答える