我会在不使用字符串操作的情况下做到这一点。从理论上讲,目前 SQL 注入的风险可能很小,因为您使用的是复选框,最好在一开始就实施良好的做法,因此如果有任何变化,您不会将自己置于危险之中。
第二个好处是您仍然可以使用列上的任何索引,如果您使用like '%...
.
为此,您可以利用表函数和外部对象来填充您的“in”列表。
例如,我将从 USER_OBJECTS 返回 OBJECT_NAME。
如果我创建两个表:
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.