ORACLE - 变量IN子句 - 返回数字列表的函数

时间:2015-08-19 07:26:59

标签: oracle function

我正在尝试构建一个函数,它将返回一个数字列表,用于IN子句。

该函数需要一个参数(parentcustomer_id),该函数需要运行另一个SQL查询以返回与该父项相关的customer_id。

查询用法示例:

SELECT customername 
FROM customertable 
WHERE customer_id IN myfunction(parentcustomer_id)

预期结果:

SELECT customername 
FROM customertable 
WHERE customer_id IN (500006,500007,500008,50009)

该函数应返回以逗号分隔的数字列表,该列表对IN子句有效。

我尝试创建一个返回数字表的“类型”,但Oracle抱怨“无效数字”。

我已经用Google搜索了好几天,并尝试了无数的方法来实现这一目标无济于事。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

为什么不在没有函数

的情况下在一个查询中执行此操作
SELECT customername 
FROM customertable c
WHERE customer_id IN (SELECT parentcustomer_id 
FROM parentCustomerTable p 
WHERE p.customer_id = c.customer_id)

甚至联合两个表并且不使用IN

答案 1 :(得分:0)

下面的查询将以逗号分隔给出所有值,您可以从函数输出参数中返回相同的值

select listagg(parentcustomer_id,',') within group (order by parentcustomer_id) cnt from parentCustomerTable where parentcustomer_id = 'your input'; 

答案 2 :(得分:0)

你必须创建集合。

create type numbers is table of number;

create or replace function ret_numbers return numbers is 
 v numbers := new numbers();
begin 
 v.extend(3);
 v(1):=1;
 v(2):=5;
 v(3):=9;
 return v;
end;



with test_data as (select level lv from dual connect by level <10)
select * from test_data where lv member of ret_numbers;

with test_data as (select level lv from dual connect by level <10)
select * from test_data where lv in (select * from table(ret_numbers)) ;