我需要优化PL/SQL函数,目前像上建立光标:如何基于阵列
CREATE OR REPLACE FUNCTION tkt_get_underlying(n_input number)
RETURN t_table_of_number
IS
ret t_table_of_number;
CURSOR c IS SELECT n_number FROM t_table WHERE n_prop_1=n_input OR n_prop_2=n_input OR n_prop_3=n_input;
BEGIN
ret := t_table_of_number();
OPEN c;
FETCH c BULK COLLECT INTO ret;
CLOSE c;
RETURN ret;
END;
我希望能够给数组作为参数,但是,我不不知道如何构建我的游标以获取数组。我想我可以使用IN
声明,但可以帮我解决这个问题吗?
编辑:
据Justin Cave提供的解决方案,它会成为:
CREATE OR REPLACE FUNCTION tkt_get_underlying(n_inputs t_table_of_number)
RETURN t_table_of_number
IS
ret t_table_of_number;
CURSOR c IS SELECT n_number FROM t_table WHERE n_prop_1 IN (SELECT column_value FROM TABLE(n_inputs))
OR n_prop_2 IN (SELECT column_value FROM TABLE(n_inputs))
OR n_prop_3 IN (SELECT column_value FROM TABLE(n_inputs));
BEGIN
ret := t_table_of_number();
OPEN c;
FETCH c BULK COLLECT INTO ret;
CLOSE c;
RETURN ret;
END;
然而,多个SELECT column_value FROM TABLE(n_inputs)
减慢整个功能。我该如何改进?
更好的你想'n_input'值的集合来传递?或者你在找别的东西吗? – 2012-08-07 15:44:07
是的,我想通过一个n_input集合 – 2012-08-07 16:18:40
什么是现有查询的查询计划?新查询的查询计划是什么? “减慢整个功能”究竟意味着什么?也就是说,如果原始函数花费了1秒来执行单个输入,那么当输入是N个元素时,修改后的函数是否需要2 * N秒才能执行? 't_table'中有多少行?哪些索引可用?你是否事先(粗略地)知道传入的数组中有多少元素? – 2012-08-07 16:27:05