sql >> データベース >  >> RDS >> Oracle

IN句のパラメータを使用したOracleストアドプロシージャ

    要素自体に文字列が含まれないことを100%確信できると仮定すると、CSVを使用するのがおそらく最も簡単な方法です。

    これを行うための代替の、そしておそらくより堅牢な方法は、文字列のテーブルとしてカスタムタイプを作成することです。文字列が100文字を超えることはないと仮定すると、次のようになります。

    CREATE TYPE string_table AS TABLE OF varchar2(100);
    

    次に、このタイプの変数をストアドプロシージャに渡して、直接参照できます。あなたの場合、次のようなものです:

    FUNCTION EXECUTE_UPDATE(
        identifierList string_table,
        value int)
    RETURN int
    IS
    BEGIN
    
        [...other stuff...]
    
        update table1 set col1 = col1 - value 
        where id in (select column_value from table(identifierList));
    
        RETURN SQL%ROWCOUNT;
    
    END
    

    table() 関数は、カスタムタイプを単一の列「COLUMN_VALUE」を持つテーブルに変換します。このテーブルは、他のテーブルと同じように扱うことができます(結合、この場合は副選択も同様です)。

    これの利点は、Oracleがコンストラクタを作成することです。したがって、ストアドプロシージャを呼び出すときに、次のように記述できます。

    execute_update(string_table('foo','bar','baz'), 32);
    

    このコマンドのビルドは、C#からプログラムで処理できると思います。

    余談ですが、私の会社では、文字列、double、intなどのリストの標準として定義されているこれらのカスタムタイプがいくつかあります。また、Oracle JPublisherを利用して、これらのタイプから対応するJavaオブジェクトに直接マップできるようにします。ざっと見てみましたが、C#に直接相当するものは見つかりませんでした。 Java開発者がこの質問に出くわした場合に備えて、言及したいと思いました。



    1. SQLServerの一時テーブルの概要

    2. Oracleのコンマ区切り値

    3. SQLServerのサーバートリガーイベントのリストを返す

    4. テーブルから最初のデータのみをクエリします