文字列操作を使用せずにこれを行います。理論的には、チェックボックスを使用しているため、現時点では SQL インジェクションのリスクはほとんどない可能性があります。変更があった場合に危険にさらされないように、最初に適切な方法を実装することをお勧めします。
2 番目の利点は、列の任意のインデックスを引き続き利用できることですlike '%...
。
これを行うには、テーブル関数と外部オブジェクトを利用して、「in」リストにデータを入力できます。
例として、USER_OBJECTS から OBJECT_NAME を返します。
2 つのテーブルを作成する場合:
create table tmp_test ( a number );
create table tmp_test2 ( a number );
テーブルのリストを保持するオブジェクト、または場合によっては場所。
create type t_test_object is table of varchar2(30);
次に、これがあなたの手順と同等です。SYS_REFCURSOR を返す関数です。T_TEST_OBJECT をパラメーターとして受け入れます。つまり、関数に渡す前に、まずこれを設定する必要があります。
create or replace function select_many (
Ptest_object in t_test_object
) return sys_refcursor is
l_curs sys_refcursor;
begin
open l_curs for
select object_name
from user_objects
where object_name in ( select *
from table(Ptest_object)
);
return l_curs;
end;
最後に、このセットアップの使用方法の例を次に示します。T_TEST_OBJECT のインスタンスに複数の値が入力される方法に注目してください。次に、このオブジェクトが関数に渡され、カーソルが返されます。最後に、値を表示するために、カーソルをループします。明らかに、カーソルを利用して TYPE を別の方法で入力したい場合があります。
SQL> declare
2
3 l_nested_table t_test_object := new t_test_object();
4 l_cursor sys_refcursor;
5 -- Used for display demonstration only.
6 l_object_name user_objects.object_name%type;
7
8 begin
9
10 l_nested_table.extend;
11 l_nested_table(l_nested_table.last) := 'TMP_TEST';
12 l_nested_table.extend;
13 l_nested_table(l_nested_table.last) := 'TMP_TEST2';
14
15 l_cursor := select_many(l_nested_table);
16
17 loop -- Display example, not really relevant
18 fetch l_cursor into l_object_name;
19 exit when l_cursor%notfound;
20 dbms_output.put_line(l_object_name);
21 end loop;
22
23 end;
24 /
TMP_TEST
TMP_TEST2
PL/SQL procedure successfully completed.